Changeset 4

Show
Ignore:
Timestamp:
06/06/08 10:11:42 (17 months ago)
Author:
jeroen
Message:

implemented stacker; display of media and some controlbaritems still broken

Location:
trunk/as3
Files:
1 added
1 removed
9 modified

Legend:

Unmodified
Added
Removed
  • trunk/as3/com/jeroenwijering/player/Player.as

    r3 r4  
    2121                description:undefined, 
    2222                duration:0, 
    23                 file:'http://www.jeroenwijering.com/upload/mrss.xml', 
     23                file:'http://www.jeroenwijering.com/upload/xspf.xml', 
    2424                image:undefined, 
    2525                link:undefined, 
     
    2828                type:undefined, 
    2929 
    30                 controlbar:'bottom', 
     30                controlbar:'over', 
    3131                logo:undefined, 
    32                 playlist:'none', 
     32                playlist:'bottom', 
    3333                playlistsize:180, 
    3434                skin:undefined, 
     
    3737                bufferlength:1, 
    3838                caption:true, 
     39                digits:true, 
    3940                displayclick:'play', 
    4041                fullscreen:false, 
     
    5051                aboutlink:"http://www.jeroenwijering.com/?page=about", 
    5152                linktarget:'_self', 
    52                 streamscript:'lighttpd', 
     53                streamscript:undefined, 
    5354                tracecall:undefined, 
    5455 
  • trunk/as3/com/jeroenwijering/player/View.as

    r3 r4  
    77import flash.display.MovieClip; 
    88import flash.events.EventDispatcher; 
    9 import flash.external.ExternalInterface; 
    109import flash.system.Capabilities; 
    1110import com.jeroenwijering.events.*; 
     
    4443                views = new Array(); 
    4544                views.push(new CaptionsView(this)); 
     45                views.push(new ControlbarView(this)); 
    4646                views.push(new DisplayView(this)); 
     47                views.push(new ExternalView(this)); 
    4748                views.push(new KeyboardView(this)); 
    4849                views.push(new RightclickView(this)); 
    49                 if(_skin['controlbar']) { 
    50                         //views.push(new ControlbarView(this)); 
    51                 } 
    52                 if(_skin['playlist']) { 
    53                         //views.push(new PlaylistView(this)); 
    54                 } 
    55                 if(ExternalInterface.available || Capabilities.playerType == 'External') { 
    56                         views.push(new ExternalView(this)); 
    57                 } 
     50                views.push(new PlaylistView(this)); 
    5851        }; 
    5952 
  • trunk/as3/com/jeroenwijering/utils/Draw.as

    r2 r4  
    55 
    66 
    7 import flash.display.DisplayObject; 
    8 import flash.display.Sprite; 
     7import flash.display.*; 
    98import flash.geom.Rectangle; 
    109import flash.text.TextField; 
     
    3635        * @return               The clone; not yet added to the displaystack. 
    3736        **/ 
    38         public static function clone(tgt:DisplayObject):DisplayObject { 
     37        public static function clone(tgt:MovieClip):MovieClip { 
    3938                var cls:Class = Object(tgt).constructor; 
    40                 var dup:DisplayObject = new cls(); 
     39                var dup:MovieClip = new cls(); 
    4140                dup.transform = tgt.transform; 
    42                 dup.filters = tgt.filters; 
    43                 dup.cacheAsBitmap = tgt.cacheAsBitmap; 
    44                 dup.opaqueBackground = tgt.opaqueBackground; 
    4541                if(tgt.scale9Grid) { 
    4642                        var rct:Rectangle = tgt.scale9Grid; 
  • trunk/as3/com/jeroenwijering/utils/Strings.as

    r1 r4  
    99 
    1010public class Strings { 
    11  
    12  
    13         /**  
    14         * Fit string in a certain textbox, keeping full words.  
    15         *  
    16         * @param str    The string to chop. 
    17         * @param fld    The textfield the string should fit into. 
    18         **/ 
    19         public static function fit(str:String,fld:TextField):String { 
    20                 var wid = fld.width; 
    21                 var lns = Math.round(fld.height/18); 
    22                 var mxm = Math.round(wid*lns/6)-5; 
    23                 if(str.length < mxm || str.indexOf(" ",mxm) == -1) {  
    24                         return str; 
    25                 } else { 
    26                         return str.substr(0,str.indexOf(" ",mxm)) + ' ..'; 
    27                 } 
    28         }; 
    2911 
    3012 
  • trunk/as3/com/jeroenwijering/views/ControlbarView.as

    r3 r4  
    77import com.jeroenwijering.events.*; 
    88import com.jeroenwijering.player.View; 
     9import com.jeroenwijering.utils.Stacker; 
    910import com.jeroenwijering.utils.Strings; 
    1011import flash.display.MovieClip; 
     
    2223        /** Reference to the view. **/ 
    2324        private var view:View; 
    24         /** A list with all controls docked to the left. **/ 
    25         private var left:Array; 
    26         /** A list with all controls docked to the right. **/ 
    27         private var right:Array; 
     25        /** A list with all controls. **/ 
     26        private var stacker:Stacker; 
    2827        /** Reference to the controlbar **/ 
    2928        private var bar:MovieClip; 
    30         /** Save whether slading is enabled. **/ 
     29        /** Save whether sliding is enabled. **/ 
    3130        private var sliding:Boolean; 
    3231        /** Timeout for hiding the bar. **/ 
     
    3736        public function ControlbarView(vie:View) { 
    3837                view = vie; 
    39                 view.addControllerListener(ControllerEvent.CAPTION,captionHandler); 
    4038                view.addControllerListener(ControllerEvent.ITEM,itemHandler); 
    4139                view.addControllerListener(ControllerEvent.MUTE,muteHandler); 
     
    4644                view.addModelListener(ModelEvent.TIME,timeHandler); 
    4745                bar = view.skin['controlbar']; 
     46                stacker = new Stacker(bar); 
    4847                bar.addEventListener(MouseEvent.CLICK, clickHandler); 
    4948                bar.timeSlider.addEventListener(MouseEvent.MOUSE_DOWN,timeslideHandler); 
     
    5150                bar.volumeSlider.addEventListener(MouseEvent.MOUSE_DOWN,volumeslideHandler); 
    5251                bar.volumeSlider.addEventListener(MouseEvent.MOUSE_OUT,outHandler); 
    53                 checkButtons(); 
    5452                loadedHandler(new ModelEvent(ModelEvent.LOADED,{loaded:0,total:0})); 
    55                 captionHandler(new ControllerEvent(ControllerEvent.CAPTION,{percentage:view.config['caption']})); 
    5653                muteHandler(new ControllerEvent(ControllerEvent.MUTE,{state:view.config['mute']})); 
    5754                stateHandler(new ModelEvent(ModelEvent.STATE,{newstate:ModelStates.IDLE})); 
    5855                timeHandler(new ModelEvent(ModelEvent.TIME,{position:0,duration:0})); 
    5956                volumeHandler(new ControllerEvent(ControllerEvent.VOLUME,{percentage:view.config['volume']})); 
    60         }; 
    61  
    62  
    63         /** Handle a change in the current item **/ 
    64         private function captionHandler(evt:ControllerEvent) { 
    65                 if(evt.data.state == true) {  
    66                         try { 
    67                                 bar.captionButton.icn.visible = true; 
    68                                 bar.captionButton.alt.visible = false; 
    69                         } catch (err:Error) {} 
    70                 } else { 
    71                         try { 
    72                                 bar.captionButton.icn.visible = false; 
    73                                 bar.captionButton.alt.visible = true; 
    74                         } catch (err:Error) {} 
    75                 } 
    76         }; 
    77  
    78  
    79         /** Check which buttons are available and save their positions. **/ 
    80         private function checkButtons() { 
    81                 var mid = bar.width/2; 
    82                 left = new Array(); 
    83                 right = new Array(); 
    84                 for(var i=0; i<bar.numChildren; i++) { 
    85                         var clp = bar.getChildAt(i); 
    86                         clp.buttonMode = true; 
    87                         clp.mouseChildren = false; 
    88                         if(clp.x < mid) { 
    89                                 left.push({c:clp,x:clp.x,n:clp.name,w:clp.width}); 
    90                         } else { 
    91                                 right.push({c:clp,x:clp.x,n:clp.name,w:clp.width}); 
    92                         } 
    93                 } 
    94                 left.sortOn(['x','n'],[Array.NUMERIC,Array.CASEINSENSITIVE]); 
    95                 right.sortOn('x',Array.DESCENDING | Array.NUMERIC); 
    9657        }; 
    9758 
     
    11172 
    11273 
    113         /** Returns whether the control should be hidden. **/ 
    114         private function hideButton(nam:String):Boolean { 
    115                 var obj = view.playlist[view.config['item']]; 
    116                 switch(nam) { 
    117                         case 'prevButton': 
    118                         case 'nextButton': 
    119                                 if(view.playlist.length < 2) { 
    120                                         return true; 
    121                                 } 
    122                                 break; 
    123                         case 'elapsedText': 
    124                         case 'remainingText': 
    125                         case 'totalText': 
    126                                 if(bar.back.width < 200) { 
    127                                         return true; 
    128                                 } 
    129                                 break; 
    130                         case 'linkButton': 
    131                                 if(!obj || !obj['link']) { 
    132                                         return true; 
    133                                 } 
    134                                 break; 
    135                         case 'fullscreenButton': 
    136                                 if(view.config['fullscreen'] == false || bar.stage.displayState == null) { 
    137                                         return true; 
    138                                 } 
    139                                 break; 
    140                         case 'captionButton': 
    141                                 if(!obj || !obj['captions']) { 
    142                                         return true; 
    143                                 } 
    144                                 break; 
    145                 } 
    146                 return false; 
    147         }; 
    148  
    149  
    15074        /** Handle a change in the current item **/ 
    15175        private function itemHandler(evt:ControllerEvent) { 
    152                 setButtons(); 
     76                if(view.playlist.length > 1) {  
     77                        bar.prevButton.visible = bar.nextButton.visible = true; 
     78                } else { 
     79                        bar.prevButton.visible = bar.nextButton.visible = false; 
     80                } 
     81                if(view.playlist[view.config['item']]['link']) {  
     82                        bar.linkButton.visible = true; 
     83                } else {  
     84                        bar.linkButton.visible = false; 
     85                } 
     86                if(view.config['digits'] == false) { 
     87                        bar.elapsedText.visible = bar.totalText.visible = false; 
     88                } else {  
     89                        bar.elapsedText.visible = bar.totalText.visible = true; 
     90                } 
    15391        }; 
    15492 
     
    165103                } 
    166104                try { 
    167                         var wid = bar.timeSlider.bck.width; 
    168                         bar.timeSlider.bar.x = Math.round(pc2*wid); 
    169                         bar.timeSlider.bar.width = Math.round(pc1*wid);   
     105                        var wid = bar.timeSlider.rail.width; 
     106                        bar.timeSlider.mark.x = Math.round(pc2*wid); 
     107                        bar.timeSlider.mark.width = Math.round(pc1*wid);   
    170108                } catch (err:Error) {} 
    171109        }; 
     
    191129        private function muteHandler(evt:ControllerEvent) { 
    192130                if(evt.data.state == true) {  
    193                         bar.muteButton.icn.visible = false; 
    194                         bar.muteButton.alt.visible = true; 
    195                         bar.volumeSlider.bar.visible = false; 
    196                 } else { 
    197                         bar.muteButton.icn.visible = true; 
    198                         bar.muteButton.alt.visible = false; 
    199                         bar.volumeSlider.bar.visible = true; 
     131                        bar.muteButton.visible = false; 
     132                        bar.unmuteButton.visible = true; 
     133                        bar.volumeSlider.mark.visible = false; 
     134                } else { 
     135                        bar.muteButton.visible = true; 
     136                        bar.unmuteButton.visible = false; 
     137                        bar.volumeSlider.mark.visible = true; 
    200138                } 
    201139        }; 
     
    210148        /** Process resizing requests **/ 
    211149        private function resizeHandler(evt:ControllerEvent) { 
    212                 if(view.config['controlbar'] == 'above' || evt.data.fullscreen == true) { 
     150                var wid = stacker.width; 
     151                if(view.config['controlbar'] == 'over' || evt.data.fullscreen == true) { 
    213152                        bar.y = evt.data.height - view.config['controlbarsize']*2; 
    214153                        if(evt.data.width > 640) {  
    215                                 bar.x = Math.round(evt.data.width/2 - 300); 
    216                                 try { bar.back.width = 600; } catch (err:Error) {} 
     154                                bar.x = Math.round(evt.data.width/2-300); 
     155                                wid = 600; 
    217156                        } else {  
    218157                                bar.x = view.config['controlbarsize']; 
    219                                 try { bar.back.width = evt.data.width - view.config['controlbarsize']*2;  } catch (err:Error) {} 
     158                                wid = evt.data.width - view.config['controlbarsize']*2; 
    220159                        } 
    221160                } else { 
    222161                        bar.x = 0; 
    223                         try { bar.back.width = evt.data.width;  } catch (err:Error) {} 
     162                        wid = evt.data.width; 
    224163                        bar.y = evt.data.height; 
    225                         if(view.config['playlist'] == 'right') {  
    226                                 try { bar.back.width += view.config['playlistsize'];  } catch (err:Error) {} 
     164                        if(view.config['playlist'] == 'right') { 
     165                                wid += view.config['playlistsize']; 
    227166                        } 
    228167                } 
    229                 try {  
    230                         if(evt.data.fullscreen == true) {  
    231                                 bar.fullscreenButton.icn.visible = false; 
    232                                 bar.fullscreenButton.alt.visible = true; 
    233                         } else {  
    234                                 bar.fullscreenButton.icn.visible = true; 
    235                                 bar.fullscreenButton.alt.visible = false; 
    236                         } 
    237                 } catch (err:Error) {} 
    238                 setButtons(); 
     168                if(view.config['fullscreen'] == false || bar.stage.displayState == null) { 
     169                        bar.fullscreenButton.visible = false; 
     170                        bar.normalscreenButton.visible = false; 
     171                } else if(evt.data.fullscreen == true) { 
     172                        bar.fullscreenButton.visible = false; 
     173                        bar.normalscreenButton.visible = true; 
     174                } else { 
     175                        bar.fullscreenButton.visible = false; 
     176                        bar.normalscreenButton.visible = true; 
     177                } 
     178                stacker.rearrange(wid); 
     179                bar.timeSlider.icon.scaleX = 1/bar.timeSlider.scaleX; 
    239180        }; 
    240181 
     
    242183        /** Send the new scrub position to the controller **/ 
    243184        private function sendScrub(evt:MouseEvent) { 
    244                 bar.timeSlider.icn.stopDrag(); 
    245                 var xps = bar.timeSlider.icn.x - bar.timeSlider.bck.x; 
     185                bar.timeSlider.icon.stopDrag(); 
     186                var xps = bar.timeSlider.icon.x - bar.timeSlider.rail.x; 
    246187                var dur = view.playlist[view.config['item']]['duration']; 
    247                 var pct = Math.round(xps*dur*10/bar.timeSlider.bck.width)/10; 
     188                var pct = Math.round(xps*dur*10/bar.timeSlider.rail.width)/10; 
    248189                view.sendEvent(ViewEvent.SEEK,pct); 
    249190        } 
     
    252193        /** Send the new volume to the controlbar **/ 
    253194        private function sendVolume(evt:MouseEvent) { 
    254                 bar.volumeSlider.icn.stopDrag(); 
    255                 var xps = bar.volumeSlider.icn.x - bar.volumeSlider.sld.x; 
    256                 var pct = Math.round(xps*100/bar.volumeSlider.sld.width); 
     195                bar.volumeSlider.icon.stopDrag(); 
     196                var xps = bar.volumeSlider.icon.x - bar.volumeSlider.rail.x; 
     197                var pct = Math.round(xps*100/bar.volumeSlider.mark.width); 
    257198                view.sendEvent(ViewEvent.VOLUME,pct); 
    258         }; 
    259  
    260  
    261         /** Set all buttons to their correct positions. **/ 
    262         private function setButtons() { 
    263                 var rdf = bar.back.width-left[0].w; 
    264                 var ldf = 0; 
    265                 for(var i=0; i<right.length; i++) { 
    266                         if(hideButton(right[i].n)) { 
    267                                 right[i].c.visible = false; 
    268                                 rdf += right[i-1].x - right[i].x; 
    269                         } else {  
    270                                 right[i].c.visible = true; 
    271                                 right[i].c.x = right[i].x + rdf; 
    272                         } 
    273                 } 
    274                 for(var j=0; j<left.length; j++) { 
    275                         if(hideButton(left[j].n)) { 
    276                                 left[j].c.visible = false; 
    277                                 ldf += left[j+1].x - left[j].x; 
    278                         } else { 
    279                                 left[j].c.visible = true; 
    280                                 left[j].c.x = left[j].x - ldf; 
    281                         } 
    282                         if(left[j].n == 'timeSlider') { 
    283                                 var old = bar.timeSlider.bck.width; 
    284                                 var wid = left[j].w+rdf+ldf; 
    285                                 bar.timeSlider.bck.width = wid; 
    286                                 bar.timeSlider.bar.width *= wid/old; 
    287                                 bar.timeSlider.bar.x *= wid/old; 
    288                                 bar.timeSlider.icn.x = Math.round(bar.timeSlider.icn.x*wid/old); 
    289                         } 
    290                 } 
    291199        }; 
    292200 
     
    301209                                } 
    302210                        case ModelStates.BUFFERING: 
    303                                 bar.playButton.icn.visible = false; 
    304                                 bar.playButton.alt.visible = true; 
     211                                bar.playButton.visible = false; 
     212                                bar.pauseButton.visible = true; 
    305213                                break; 
    306214                        default:  
     
    310218                                        view.skin.removeEventListener(MouseEvent.MOUSE_MOVE, moveHandler); 
    311219                                } 
    312                                 bar.playButton.icn.visible = true; 
    313                                 bar.playButton.alt.visible = false; 
     220                                bar.playButton.visible = true; 
     221                                bar.pauseButton.visible = false; 
    314222                                break; 
    315223                } 
     
    320228        private function timeHandler(evt:ModelEvent) { 
    321229                var dur = evt.data.duration; 
    322                 try { 
    323                         bar.elapsedText.txt.text = Strings.digits(evt.data.position); 
    324                         bar.totalText.txt.text = Strings.digits(evt.data.duration); 
    325                 } catch(err:Error) {} 
     230                bar.elapsedText.field.text = Strings.digits(evt.data.position); 
     231                bar.totalText.field.text = Strings.digits(evt.data.duration) 
    326232                var pct = evt.data.position/evt.data.duration; 
    327                 try { 
    328                         var xps = Math.floor(pct*bar.timeSlider.bck.width); 
    329                         if (dur <= 0) { 
    330                                 bar.timeSlider.icn.visible = false; 
    331                         } else { 
    332                                 bar.timeSlider.icn.visible = true; 
    333                                 bar.timeSlider.icn.x = xps; 
    334                         } 
    335                 } catch(err:Error) {} 
     233                var xps = Math.floor(pct*bar.timeSlider.rail.width); 
     234                if (dur <= 0) { 
     235                        bar.timeSlider.icon.visible = false; 
     236                } else { 
     237                        bar.timeSlider.icon.visible = true; 
     238                        bar.timeSlider.icon.x = xps; 
     239                } 
    336240        }; 
    337241 
     
    339243        /** Handle a move over the timeslider **/ 
    340244        private function timeslideHandler(evt:MouseEvent) { 
    341                 var rct = new Rectangle(bar.timeSlider.bck.x,bar.timeSlider.icn.y,bar.timeSlider.bck.width,0); 
    342                 bar.timeSlider.icn.startDrag(true,rct); 
     245                var rct = new Rectangle(bar.timeSlider.rail.x,bar.timeSlider.icon.y,bar.timeSlider.rail.width,0); 
     246                bar.timeSlider.icon.startDrag(true,rct); 
    343247                sliding = true; 
    344248        }; 
     
    347251        /** Reflect the new volume in the controlbar **/ 
    348252        private function volumeHandler(evt:ControllerEvent) { 
    349                 bar.volumeSlider.bar.scaleX = evt.data.percentage/100; 
     253                bar.volumeSlider.mark.scaleX = evt.data.percentage/100; 
    350254        }; 
    351255 
     
    353257        /** Handle a move over the volume bar **/ 
    354258        private function volumeslideHandler(evt:MouseEvent) { 
    355                 var rct = new Rectangle(bar.volumeSlider.sld.x,bar.volumeSlider.icn.y,bar.volumeSlider.sld.width,0); 
    356                 bar.volumeSlider.icn.startDrag(true,rct); 
     259                var rct = new Rectangle(bar.volumeSlider.rail.x,bar.volumeSlider.icon.y,bar.volumeSlider.rail.width,0); 
     260                bar.volumeSlider.icon.startDrag(true,rct); 
    357261                sliding = true; 
    358262        }; 
  • trunk/as3/com/jeroenwijering/views/DisplayView.as

    r3 r4  
    163163                        setIcon('bufferIcon'); 
    164164                } else { 
     165                        if(view.config['playlist'] == 'over') {  
     166                                setIcon(); 
     167                                return; 
     168                        } 
    165169                        switch(view.config.displayclick) { 
    166170                                case 'play': 
  • trunk/as3/com/jeroenwijering/views/PlaylistView.as

    r3 r4  
    77import com.jeroenwijering.events.*; 
    88import com.jeroenwijering.player.View; 
    9 import com.jeroenwijering.utils.Draw; 
     9import com.jeroenwijering.utils.*; 
     10import flash.display.Loader; 
    1011import flash.display.MovieClip; 
     12import flash.events.Event; 
    1113import flash.events.MouseEvent; 
    1214import flash.geom.Rectangle; 
     15import flash.net.URLRequest; 
    1316import flash.utils.setInterval; 
    1417import flash.utils.clearInterval; 
     
    2528        private var buttons:Array; 
    2629        /** Height of a button (to calculate scrolling) **/ 
    27         private var buttonsize:Number; 
     30        private var buttonheight:Number; 
     31        /** Currently active button. **/ 
     32        private var active:Number; 
    2833        /** Proportion between clip and mask. **/ 
    2934        private var proportion:Number; 
     
    3439        public function PlaylistView(vie:View) { 
    3540                view = vie; 
    36                 clip = view.skin['playlist']; 
    37                 clip.visible = false; 
    3841                view.addControllerListener(ControllerEvent.ITEM,itemHandler); 
    3942                view.addControllerListener(ControllerEvent.PLAYLIST,playlistHandler); 
    4043                view.addControllerListener(ControllerEvent.RESIZE,resizeHandler); 
    41                 buttonsize = clip.scrollClip.getChildByName('button').height; 
    42                 clip.list.mask = clip.scrollMask; 
     44                view.addModelListener(ModelEvent.STATE,stateHandler); 
     45                clip = view.skin['playlist']; 
     46                buttonheight = clip.list.button.height; 
     47                clip.list.button.visible = false; 
     48                clip.list.mask = clip.masker; 
    4349                clip.slider.buttonMode = true; 
    4450                clip.slider.mouseChildren = false; 
     51                clip.list.addEventListener(MouseEvent.CLICK,clickHandler); 
     52                clip.list.addEventListener(MouseEvent.MOUSE_OVER,overHandler); 
     53                clip.list.addEventListener(MouseEvent.MOUSE_OUT,outHandler); 
     54                clip.list.addEventListener(MouseEvent.MOUSE_UP,stopHandler); 
    4555                clip.slider.addEventListener(MouseEvent.MOUSE_DOWN,startHandler); 
    46                 view.skin.addEventListener(MouseEvent.MOUSE_UP,stopHandler); 
     56                clip.visible = false; 
     57                trace(clip); 
    4758        }; 
    4859 
     
    5263                var wid = clip.back.width; 
    5364                var hei = clip.back.height; 
    54                 proportion = view.playlist.length*buttonsize/hei; 
     65                proportion = view.playlist.length*buttonheight/hei; 
    5566                if (proportion > 1) { 
    5667                        wid -=20; 
    57                         buildScroller(); 
     68                        buildSlider(); 
    5869                } else { 
    59                         clip.scrollBar.visible = false; 
    60                 } 
    61                 clip.scrollMask.height = hei; 
    62                 clip.scrollMask.width = wid; 
     70                        clip.slider.visible = false; 
     71                } 
     72                clip.masker.height = hei; 
     73                clip.masker.width = wid; 
    6374                if(clr) { 
    64                         clip.scrollClip.y = 0; 
    65                         Draw.clear(clip.scrollClip); 
     75                        clip.list.y = 0; 
     76                        Draw.clear(clip.list); 
    6677                        buttons = new Array(); 
     78                        clip.visible= true; 
     79                } else {  
     80                        if(proportion > 1) { scrollCheck(); } 
    6781                } 
    6882                for(var i=0; i<view.playlist.length; i++) { 
    69                         if(clr) {  
    70                                 var btn = Draw.clone(clip.scrollClip.getChildByName('button'));  
    71                                 // new PlaylistButton(i,wid,view); 
    72                                 clip.scrollClip.addChild(btn); 
    73                                 buttons.push(btn); 
    74                         } else {  
    75                                 buttons[i].resize(wid); 
    76                                 if(proportion > 1) {  
    77                                         scrollCheck(); 
    78                                 } 
    79                         } 
     83                        if(clr) { 
     84                                var btn = Draw.clone(clip.list.button); 
     85                                clip.list.addChild(btn); 
     86                                var stc = new Stacker(btn); 
     87                                btn.y = i*buttonheight; 
     88                                btn.buttonMode = true; 
     89                                btn.mouseChildren =false; 
     90                                btn.name = i; 
     91                                buttons.push({c:btn,s:stc}); 
     92                                setContents(i); 
     93                        } 
     94                        buttons[i].s.rearrange(wid); 
    8095                } 
    8196        }; 
     
    8398 
    8499        /** Setup the scrollbar component **/ 
    85         private function buildScroller() { 
    86                 var scr = clip.scrollBar; 
     100        private function buildSlider() { 
     101                var scr = clip.slider; 
    87102                scr.visible = true; 
    88                 scr.x = clip.back.width - scr.width; 
    89                 var dif = clip.back.height - scr.height; 
     103                scr.x = clip.back.width-scr.width; 
     104                var dif = clip.back.height-scr.height; 
    90105                scr.back.height += dif; 
    91106                scr.rail.height += dif; 
     
    94109 
    95110 
     111        /** Handle a click on a button. **/ 
     112        private function clickHandler(evt:MouseEvent) { 
     113                view.sendEvent('item',Number(evt.target.name)); 
     114        }; 
     115 
     116 
    96117        /** Switch the currently active item */ 
    97118        private function itemHandler(evt:ControllerEvent) { 
    98                 // code for highlighting a certain button. 
     119                var idx = evt.data.index; 
     120                if(!isNaN(active)) { 
     121                        buttons[active].c.gotoAndStop('out'); 
     122                } 
     123                buttons[idx].c.gotoAndStop('active'); 
     124                active = idx; 
     125        }; 
     126 
     127 
     128        /** Loading of image completed; resume loading **/ 
     129        private function loaderHandler(evt:Event) { 
     130                var ldr = Loader(evt.target.loader); 
     131                Stretcher.stretch(ldr,ldr.mask.width,ldr.mask.height,Stretcher.FILL); 
     132        }; 
     133 
     134 
     135        /** Handle a button rollover. **/ 
     136        private function overHandler(evt:MouseEvent) { 
     137                var idx = Number(evt.target.name); 
     138                buttons[idx].c.gotoAndStop('over'); 
     139        }; 
     140 
     141 
     142        /** Handle a button rollover. **/ 
     143        private function outHandler(evt:MouseEvent) { 
     144                var idx = Number(evt.target.name); 
     145                if(idx == active) { 
     146                        buttons[idx].c.gotoAndStop('active'); 
     147                } else {  
     148                        buttons[idx].c.gotoAndStop('out'); 
     149                } 
    99150        }; 
    100151 
     
    102153        /** New playlist loaded: rebuild the playclip. **/ 
    103154        private function playlistHandler(evt:ControllerEvent) { 
    104                 buildList(true); 
     155                if(view.config['playlist'] != 'none') {  
     156                        buildList(true); 
     157                } 
    105158        }; 
    106159 
     
    109162        private function resizeHandler(evt:ControllerEvent) { 
    110163                if(view.config['playlist'] == 'right') { 
    111                         clip.visible = true; 
    112164                        clip.x = evt.data.width; 
    113165                        clip.y = 0; 
    114166                        clip.back.width = view.config['playlistsize']; 
    115167                        clip.back.height = evt.data.height; 
    116                 } else if (view.config['playlist'] == 'below') { 
    117                         clip.visible = true; 
     168                } else if (view.config['playlist'] == 'bottom') { 
    118169                        clip.x = 0; 
    119170                        clip.y = evt.data.height; 
    120                         if (view.config['controlbar'] == 'below') { 
     171                        if (view.config['controlbar'] == 'bottom') { 
    121172                                clip.y += view.config['controlbarsize']; 
    122173                        } 
    123174                        clip.back.height = view.config['playlistsize']; 
    124175                        clip.back.width = evt.data.width; 
    125                 } else if (view.config['playlist'] == 'above') { 
    126                         clip.visible = true; 
    127                         var wid = evt.data.width-2*view.config['controlbarsize']; 
    128                         var hei = evt.data.height-2*view.config['controlbarsize']; 
    129                         if(evt.data.width > 640) { wid = 600; } 
    130                         if(view.config['controlbar'] == 'above') { hei -= 2*view.config['controlbarsize']; } 
    131                         clip.x = Math.round(evt.data.width/2 - wid/2); 
    132                         clip.y = view.config['controlbarsize']; 
    133                         clip.back.height = hei; 
    134                         clip.back.width = wid; 
    135                 } else {  
    136                         clip.visible = false; 
     176                } else if (view.config['playlist'] == 'over') { 
     177                        clip.x = clip.y = 0; 
     178                        clip.back.height = evt.data.height; 
     179                        clip.back.width = evt.data.width; 
    137180                } 
    138181                buildList(false); 
     
    142185        /** Make sure the playlist is not out of range. **/ 
    143186        private function scrollCheck() { 
    144                 var scr = clip.scrollBar; 
    145                 if(clip.scrollClip.y > 0) { 
    146                         clip.scrollClip.y = 0; 
     187                var scr = clip.slider; 
     188                if(clip.list.y > 0) { 
     189                        clip.list.y = 0; 
    147190                        scr.icon.y = scr.rail.y; 
    148                 } else if (clip.scrollClip.y < clip.scrollMask.height-clip.scrollClip.height) { 
     191                } else if (clip.list.y < clip.masker.height-clip.list.height) { 
    149192                        scr.icon.y = scr.rail.y+scr.rail.height-scr.icon.height; 
    150                         clip.scrollClip.y = clip.scrollMask.height-clip.scrollClip.height; 
     193                        clip.list.y = clip.masker.height-clip.list.height; 
    151194                } 
    152195        }; 
     
    155198        /** Scrolling handler. **/ 
    156199        private function scrollHandler() { 
    157                 var scr = clip.scrollBar; 
     200                var scr = clip.slider; 
    158201                var yps = scr.mouseY; 
    159202                var ips = yps - scr.icon.height/2; 
    160                 var cps = clip.scrollMask.y+clip.scrollMask.height/2-proportion*yps; 
     203                var cps = clip.masker.y+clip.masker.height/2-proportion*yps; 
    161204                scr.icon.y = Math.round(ips - (ips-scr.icon.y)/1.5); 
    162                 clip.scrollClip.y = Math.round((cps - (cps-clip.scrollClip.y)/1.5)); 
     205                clip.list.y = Math.round((cps - (cps-clip.list.y)/1.5)); 
    163206                scrollCheck(); 
     207        }; 
     208 
     209 
     210        /** Setup button elements **/ 
     211        private function setContents(idx:Number) { 
     212                for (var itm in view.playlist[idx]) { 
     213                        if(!buttons[idx].c[itm]) { 
     214                                continue; 
     215                        } else if(itm == 'image') { 
     216                                var ldr = new Loader(); 
     217                                buttons[idx].c.addChild(ldr); 
     218                                ldr.x = buttons[idx].c.image.x; 
     219                                ldr.y = buttons[idx].c.image.y; 
     220                                ldr.mask = buttons[idx].c.image; 
     221                                ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderHandler); 
     222                                ldr.load(new URLRequest(view.playlist[idx]['image'])); 
     223                        } else if(itm == 'duration') { 
     224                                if(view.playlist[idx][itm] > 0) { 
     225                                        buttons[idx].c[itm].field.text = Strings.digits(view.playlist[idx][itm]); 
     226                                } 
     227                        } else { 
     228                                buttons[idx].c[itm].field.text = view.playlist[idx][itm]; 
     229                        } 
     230                } 
     231                if(!view.playlist[idx]['image'] && buttons[idx].c['image']) { 
     232                        buttons[idx].c['image'].visible = false; 
     233                } 
    164234        }; 
    165235 
     
    172242        }; 
    173243 
     244        /** Process state changes **/ 
     245        private function stateHandler(evt:ModelEvent) { 
     246                if(view.config['playlist'] == 'over') { 
     247                        if(evt.data.newstate == ModelStates.PLAYING || evt.data.newstate == ModelStates.BUFFERING) { 
     248                                clip.visible = false; 
     249                        } else { 
     250                                clip.visible = true; 
     251                        } 
     252                } 
     253        }; 
     254 
    174255 
    175256        /** Stop scrolling the playlist. **/ 
     
    179260 
    180261 
    181  
    182  
    183262}; 
    184263