root/trunk/as3/com/jeroenwijering/views/ControlbarView.as @ 42

Revision 42, 11.0 kB (checked in by jeroen, 16 months ago)

tagged the 1.1 wmvplayer and started the air player

  • Property svn:executable set to *
Line 
1/**
2* Display a controlbar and direct the search externally.
3**/
4package com.jeroenwijering.views {
5
6
7import com.jeroenwijering.events.*;
8import com.jeroenwijering.player.View;
9import com.jeroenwijering.utils.*;
10import flash.display.MovieClip;
11import flash.events.MouseEvent;
12import flash.geom.Rectangle;
13import flash.utils.setTimeout;
14import flash.utils.clearTimeout;
15import flash.ui.Mouse;
16
17
18public class ControlbarView {
19
20
21        /** Reference to the view. **/
22        private var view:View;
23        /** Reference to the controlbar **/
24        private var bar:MovieClip;
25        /** Fullscreen controlbar margin. **/
26        private var margin:Number;
27        /** A list with all controls. **/
28        private var stacker:Stacker;
29        /** Timeout for hiding the bar. **/
30        private var hiding:Number;
31        /** The actions for all controlbar buttons. **/
32        private var BUTTONS = {
33                playButton:'PLAY',
34                pauseButton:'PLAY',
35                stopButton:'STOP',
36                prevButton:'PREV',
37                nextButton:'NEXT',
38                linkButton:'LINK',
39                fullscreenButton:'FULLSCREEN',
40                normalscreenButton:'FULLSCREEN',
41                muteButton:'MUTE',
42                unmuteButton:'MUTE'
43        };
44        /** When scrubbing, icon shouldn't be set. **/
45        private var scrubbing:Boolean;
46
47
48        /** Constructor. **/
49        public function ControlbarView(vie:View) {
50                view = vie;
51                if(!view.skin['controlbar']) { return; }
52                bar = view.skin['controlbar'];
53                margin = bar.x;
54                stacker = new Stacker(bar);
55                setButtons();
56                view.addControllerListener(ControllerEvent.RESIZE,resizeHandler);
57                view.addModelListener(ModelEvent.LOADED,loadedHandler);
58                view.addModelListener(ModelEvent.STATE,stateHandler);
59                view.addModelListener(ModelEvent.TIME,timeHandler);
60                view.addControllerListener(ControllerEvent.PLAYLIST,itemHandler);
61                view.addControllerListener(ControllerEvent.ITEM,itemHandler);
62                view.addControllerListener(ControllerEvent.MUTE,muteHandler);
63                view.addControllerListener(ControllerEvent.VOLUME,volumeHandler);
64                itemHandler();
65                muteHandler();
66                volumeHandler();
67                loadedHandler();
68                timeHandler();
69                stateHandler();
70                resizeHandler();
71        };
72
73
74        /** Handle clicks from all buttons. **/
75        private function clickHandler(evt:MouseEvent) {
76                view.sendEvent(BUTTONS[evt.target.name]);
77        };
78
79
80        /** Fix the timeline display. **/
81        private function fixTime() {
82                try {
83                        var scp = bar.timeSlider.scaleX;
84                        bar.timeSlider.scaleX = 1;
85                        bar.timeSlider.icon.x = scp*bar.timeSlider.icon.x;
86                        bar.timeSlider.mark.x = scp*bar.timeSlider.mark.x;
87                        bar.timeSlider.mark.width = scp*bar.timeSlider.mark.width;
88                        bar.timeSlider.rail.width = scp*bar.timeSlider.rail.width;
89                } catch (err:Error) {}
90        };
91
92
93        /** Handle a change in the current item **/
94        private function itemHandler(evt:ControllerEvent=null) {
95                try {
96                        if(view.playlist.length > 1 && view.playlist[0]['author'] != 'commercial') {
97                                bar.prevButton.visible = bar.nextButton.visible = true;
98                        } else {
99                                bar.prevButton.visible = bar.nextButton.visible = false;
100                        }
101                } catch (err:Error) {}
102                try {
103                        if(view.playlist.length && view.playlist[view.config['item']]['link']) {
104                                bar.linkButton.visible = true;
105                        } else {
106                                bar.linkButton.visible = false;
107                        }
108                } catch (err:Error) {}
109                stacker.rearrange();
110                fixTime();
111        };
112
113
114        /** Process bytesloaded updates given by the model. **/
115        private function loadedHandler(evt:ModelEvent=null) {
116                var pc1 = 0;
117                if(evt && evt.data.total > 0) {
118                        pc1 = evt.data.loaded/evt.data.total;
119                }
120                var pc2 = 0;
121                if(evt && evt.data.offset) {
122                        pc2 = evt.data.offset/evt.data.total;
123                }
124                try {
125                        var wid = bar.timeSlider.rail.width;
126                        bar.timeSlider.mark.x = pc2*wid;
127                        bar.timeSlider.mark.width = pc1*wid;
128                } catch (err:Error) {}
129        };
130
131
132        /** Show above controlbar on mousemove. **/
133        private function moveHandler(evt:MouseEvent=null) {
134                if(bar.alpha == 0) { Animations.fade(bar,1); }
135                clearTimeout(hiding);
136                hiding = setTimeout(moveTimeout,1000);
137                Mouse.show();
138        };
139
140
141        /** Hide above controlbar again when move has timed out. **/
142        private function moveTimeout() {
143                if((bar.mouseY<0 || bar.mouseY>bar.height)  && bar.alpha == 1) {
144                        Animations.fade(bar,0);
145                        Mouse.hide();
146                }
147        };
148
149
150        /** Show a mute icon if playing. **/
151        private function muteHandler(evt:ControllerEvent=null) {
152                try {
153                        if(view.config['mute'] == true) {
154                                bar.muteButton.visible = false;
155                                bar.unmuteButton.visible = true;
156                                bar.volumeSlider.mark.visible = false;
157                                bar.volumeSlider.icon.x = bar.volumeSlider.rail.x;
158                        } else {
159                                bar.muteButton.visible = true;
160                                bar.unmuteButton.visible = false;
161                                bar.volumeSlider.mark.visible = true;
162                                volumeHandler();
163                        }
164                } catch (err:Error) {}
165        };
166
167
168        /** Handle mouseouts from all buttons **/
169        private function outHandler(evt:MouseEvent) {
170                bar[evt.target.name].gotoAndPlay('out');
171        };
172
173
174        /** Handle clicks from all buttons **/
175        private function overHandler(evt:MouseEvent) {
176                bar[evt.target.name].gotoAndPlay('over');
177        };
178
179
180        /** Process resizing requests **/
181        private function resizeHandler(evt:ControllerEvent=null) {
182                var wid = stacker.width;
183                if(view.config['controlbar'] == 'over' || (evt && evt.data.fullscreen == true)) {
184                        bar.y = view.config['height'] - view.config['controlbarsize'] - margin;
185                        bar.x = margin;
186                        wid = view.config['width'] - 2*margin;
187                } else if(view.config['controlbar'] == 'bottom') {
188                        bar.x = 0;
189                        wid = view.config['width'];
190                        bar.y = view.config['height'];
191                        if(view.config['playlist'] == 'right') {
192                                wid += view.config['playlistsize'];
193                        }
194                } else {
195                        bar.visible = false;
196                }
197                try {
198                        var dps = bar.stage['displayState'];
199                        if(view.config['fullscreen'] == false) {
200                                bar.fullscreenButton.visible = false;
201                                bar.normalscreenButton.visible = false;
202                        } else if(evt && evt.data.fullscreen == true) {
203                                bar.fullscreenButton.visible = false;
204                                bar.normalscreenButton.visible = true;
205                        } else {
206                                bar.fullscreenButton.visible = true;
207                                bar.normalscreenButton.visible = false;
208                        }
209                } catch (err:Error) {}
210                try {
211                        if (wid < 200) {
212                                bar.elapsedText.visible = bar.totalText.visible = false;
213                        } else {
214                                bar.elapsedText.visible = bar.totalText.visible = true;
215                        }
216                } catch (err:Error) {}
217                stacker.rearrange(wid);
218                stateHandler();
219                fixTime();
220        };
221
222
223        /** Clickhandler for all buttons. **/
224        private function setButtons() {
225                for(var itm in BUTTONS) {
226                        if(bar[itm]) {
227                                bar[itm].mouseChildren = false;
228                                bar[itm].buttonMode = true;
229                                bar[itm].addEventListener(MouseEvent.CLICK, clickHandler);
230                                bar[itm].addEventListener(MouseEvent.MOUSE_OVER, overHandler);
231                                bar[itm].addEventListener(MouseEvent.MOUSE_OUT, outHandler);
232                        }
233                }
234                if(bar.timeSlider) {
235                        bar.timeSlider.mouseChildren = false;
236                        bar.timeSlider.buttonMode = true;
237                        bar.timeSlider.addEventListener(MouseEvent.MOUSE_DOWN,timedownHandler);
238                        bar.timeSlider.addEventListener(MouseEvent.MOUSE_OUT,timeoutHandler);
239                        bar.timeSlider.addEventListener(MouseEvent.MOUSE_OVER,timeoverHandler);
240                }
241                if(bar.volumeSlider) {
242                        bar.volumeSlider.mouseChildren = false;
243                        bar.volumeSlider.buttonMode = true;
244                        bar.volumeSlider.addEventListener(MouseEvent.MOUSE_DOWN,volumedownHandler);
245                        bar.volumeSlider.addEventListener(MouseEvent.MOUSE_OUT,volumeoutHandler);
246                        bar.volumeSlider.addEventListener(MouseEvent.MOUSE_OVER,volumeoverHandler);
247                }
248        };
249
250
251        /** Process state changes **/
252        private function stateHandler(evt:ModelEvent=undefined) {
253                clearTimeout(hiding);
254                view.skin.removeEventListener(MouseEvent.MOUSE_MOVE,moveHandler);
255                Mouse.show();
256                try {
257                        var dps = bar.stage['displayState'];
258                } catch (err:Error) {}
259                switch(view.config['state']) {
260                        case ModelStates.PLAYING:
261                        case ModelStates.BUFFERING:
262                                try {
263                                        bar.playButton.visible = false;
264                                        bar.pauseButton.visible = true;
265                                } catch (err:Error) {}
266                                if(view.config['controlbar'] == 'over' || dps == 'fullScreen') {
267                                        hiding = setTimeout(moveTimeout,1000);
268                                        view.skin.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler);
269                                } else {
270                                        Animations.fade(bar,1);
271                                }
272                                break;
273                        default:
274                                try {
275                                        bar.playButton.visible = true;
276                                        bar.pauseButton.visible = false;
277                                } catch (err:Error) {}
278                                if(view.config['controlbar'] == 'over' || dps == 'fullScreen') {
279                                        Animations.fade(bar,1);
280                                }
281                }
282        };
283
284
285        /** Process time updates given by the model. **/
286        private function timeHandler(evt:ModelEvent=null) {
287                var dur = 0;
288                var pos = 0;
289                if(evt) {
290                        dur = evt.data.duration;
291                        pos = evt.data.position;
292                }
293                var pct = pos/dur;
294                try {
295                        bar.elapsedText.text = Strings.digits(pos);
296                        bar.totalText.text = Strings.digits(dur);
297                } catch (err:Error) {}
298                try {
299                        var tsl = bar.timeSlider;
300                        var xps = Math.round(pct*(tsl.rail.width-tsl.icon.width));
301                        if (dur > 0) {
302                                bar.timeSlider.icon.visible = true;
303                                bar.timeSlider.mark.visible = true;
304                                if(scrubbing != true) {
305                                        bar.timeSlider.icon.x = xps;
306                                }
307                        } else {
308                                bar.timeSlider.icon.visible = false;
309                                bar.timeSlider.mark.visible = false;
310                        }
311                } catch (err:Error) {}
312        };
313
314
315        /** Handle a press on the timeslider **/
316        private function timedownHandler(evt:MouseEvent) {
317                var tsl = bar.timeSlider;
318                var rct = new Rectangle(0,
319                        tsl.icon.y,tsl.rail.width-tsl.icon.width,0);
320                tsl.icon.startDrag(true,rct);
321                scrubbing = true;
322        bar.stage.addEventListener(MouseEvent.MOUSE_UP,timeupHandler);
323        };
324
325        /** Handle a move out the timeslider **/
326        private function timeoutHandler(evt:MouseEvent) {
327                bar.timeSlider.icon.gotoAndPlay('out');
328        };
329
330
331        /** Handle a press release on the timeslider **/
332        private function timeupHandler(evt:MouseEvent) {
333                bar.timeSlider.icon.stopDrag();
334                scrubbing = false;
335        bar.stage.removeEventListener(MouseEvent.MOUSE_UP,timeupHandler);
336                var xps = bar.timeSlider.icon.x-bar.timeSlider.rail.x;
337                if(view.playlist.length) {
338                        var dur = view.playlist[view.config['item']]['duration'];
339                        var pct = Math.round(xps*dur*10/bar.timeSlider.rail.width/10);
340                        view.sendEvent(ViewEvent.SEEK,pct);
341                }
342        };
343
344
345        /** Handle a move over the timeslider **/
346        private function timeoverHandler(evt:MouseEvent) {
347                bar.timeSlider.icon.gotoAndPlay('over');
348        };
349
350
351        /** Reflect the new volume in the controlbar **/
352        private function volumeHandler(evt:ControllerEvent=null) {
353                try {
354                        var vsl = bar.volumeSlider;
355                        vsl.mark.width = view.config['volume']*(vsl.rail.width-vsl.icon.width/2)/100;
356                        vsl.icon.x = view.config['volume']*(vsl.rail.width-vsl.icon.width)/100;
357                } catch (err:Error) {}
358        };
359
360
361        /** Handle a move over the volumebar **/
362        private function volumedownHandler(evt:MouseEvent) {
363                var vsl = bar.volumeSlider;
364                var rct = new Rectangle(vsl.rail.x,vsl.icon.y,vsl.width-vsl.icon.width,0);
365                vsl.icon.startDrag(true,rct);
366                bar.stage.addEventListener(MouseEvent.MOUSE_UP,volumeupHandler);
367        };
368
369
370        /** Handle a move out the volumebar. **/
371        private function volumeoutHandler(evt:MouseEvent) {
372                bar.volumeSlider.icon.gotoAndPlay('out');
373        };
374
375
376        /** Handle a move over the volumebar. **/
377        private function volumeoverHandler(evt:MouseEvent) {
378                bar.volumeSlider.icon.gotoAndPlay('over');
379        };
380
381
382        /** Handle a press release on the volumebar. **/
383        private function volumeupHandler(evt:MouseEvent) {
384                var vsl = bar.volumeSlider;
385                vsl.icon.stopDrag();
386        bar.stage.removeEventListener(MouseEvent.MOUSE_UP,volumeupHandler);
387                var xps = vsl.icon.x - bar.volumeSlider.rail.x;
388                var pct = Math.round(xps*100/(vsl.rail.width-vsl.icon.width));
389                view.sendEvent(ViewEvent.VOLUME,pct);
390        };
391
392
393};
394
395
396}
Note: See TracBrowser for help on using the browser.