Ignore:
Timestamp:
06/06/08 13:11:42 (5 years ago)
Author:
jeroen
Message:

implemented stacker; display of media and some controlbaritems still broken

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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        }; 
Note: See TracChangeset for help on using the changeset viewer.