root/trunk/as3/com/jeroenwijering/views/DisplayView.as @ 4

Revision 4, 4.5 kB (checked in by jeroen, 18 months ago)

implemented stacker; display of media and some controlbaritems still broken

  • Property svn:executable set to *
Line 
1/**
2* Interface for all display elements.
3**/
4package com.jeroenwijering.views {
5
6
7import com.jeroenwijering.events.*;
8import com.jeroenwijering.player.View;
9import com.jeroenwijering.utils.Draw;
10import com.jeroenwijering.utils.Strings;
11import flash.display.Loader;
12import flash.display.MovieClip;
13import flash.display.Sprite;
14import flash.events.Event;
15import flash.events.MouseEvent;
16import flash.net.URLRequest;
17
18
19public class DisplayView {
20
21
22        /** Reference to the MVC view. **/
23        private var view:View;
24        /** Reference to the display MC. **/
25        private var display:MovieClip;
26        /** Loader object for loading a logo. **/
27        private var loader:Loader;
28        /** The margins of the logo. **/
29        private var margins:Array;
30        /** The latest playback state **/
31        private var state:String;
32        /** A list of all the icons. **/
33        private var ICONS:Array = new Array(
34                'playIcon',
35                'errorIcon',
36                'bufferIcon',
37                'linkIcon',
38                'muteIcon'
39        );
40
41
42        /** Constructor; add all needed listeners. **/
43        public function DisplayView(vie:View) {
44                view = vie;
45                view.addControllerListener(ControllerEvent.ERROR,errorHandler);
46                view.addControllerListener(ControllerEvent.MUTE,muteHandler);
47                view.addControllerListener(ControllerEvent.RESIZE,resizeHandler);
48                view.addModelListener(ModelEvent.BUFFER,bufferHandler);
49                view.addModelListener(ModelEvent.ERROR,errorHandler);
50                view.addModelListener(ModelEvent.STATE,stateHandler);
51                view.addViewListener(ModelEvent.ERROR,errorHandler);
52                display = view.skin['display'];
53                display.addEventListener(MouseEvent.CLICK,clickHandler);
54                display.mouseChildren = false;
55                display.buttonMode = true;
56                Draw.clear(display.logo);
57                if(view.config['logo']) { setLogo(); }
58                setIcon('bufferIcon');
59        };
60
61
62        /** Receive buffer updates. **/
63        private function bufferHandler(evt:ModelEvent) {
64                display.bufferIcon.txt.text = Strings.zero(evt.data.percentage);
65        };
66
67
68        /** Process a click on the display. **/
69        private function clickHandler(evt:MouseEvent) {
70                if(view.config.displayclick != 'none') {
71                        view.sendEvent(view.config['displayclick']);
72                }
73        };
74
75
76        /** Receive and print errors. **/
77        private function errorHandler(evt) {
78                display.errorIcon.msg.text = evt.data.message;
79                setIcon('errorIcon');
80        };
81
82
83        /** Logo loaded; now position it. **/
84        private function logoHandler(evt:Event) {
85                if(margins[0] > margins[2]) {
86                        display.logo.x = display.back.width- margins[2]-display.logo.width;
87                } else {
88                        display.logo.x = margins[0];
89                }
90                if(margins[1] > margins[3]) {
91                        display.logo.y = display.back.height- margins[3]-display.logo.height;
92                } else {
93                        display.logo.y = margins[1];
94                }
95        };
96
97
98        /** Show a mute icon if playing. **/
99        private function muteHandler(evt:ControllerEvent) {
100                if(state == ModelStates.PLAYING) {
101                        if(evt.data.state == true) {
102                                setIcon('muteIcon');
103                        } else {
104                                setIcon();
105                        }
106                }
107        };
108
109
110        /** Receive resizing requests **/
111        private function resizeHandler(evt:ControllerEvent) {
112                var wid = evt.data.width;
113                var hei = evt.data.height;
114                display.back.width = display.masker.width = wid;
115                display.back.height = display.masker.height =  hei;
116                for(var i in ICONS) {
117                        display[ICONS[i]].x = Math.round(wid/2);
118                        display[ICONS[i]].y = Math.round(hei/2);
119                }
120                if(view.config['logo']) {
121                        logoHandler(new Event(Event.COMPLETE));
122                }
123        };
124
125
126        /** Set a specific icon in the display. **/
127        private function setIcon(icn:String=undefined) {
128                for(var i in ICONS) {
129                        if(icn == ICONS[i]) {
130                                display[ICONS[i]].visible = true;
131                        } else {
132                                display[ICONS[i]].visible = false;
133                        }
134                }
135        };
136
137
138        /** Setup the logo loading. **/
139        private function setLogo() {
140                margins = new Array(
141                        display.logo.x,
142                        display.logo.y,
143                        display.back.width-display.logo.x-display.logo.width,
144                        display.back.height-display.logo.y-display.logo.height
145                );
146                loader = new Loader();
147                loader.contentLoaderInfo.addEventListener(Event.COMPLETE,logoHandler);
148                display.logo.addChild(loader);
149                loader.load(new URLRequest(view.config['logo']));
150        };
151
152
153        /** Handle a change in playback state. **/
154        private function stateHandler(evt:ModelEvent) {
155                state = evt.data.newstate;
156                if(state == ModelStates.PLAYING) {
157                        if(view.config['mute'] == true) {
158                                setIcon('muteIcon');
159                        } else {
160                                setIcon();
161                        }
162                } else if (state == ModelStates.BUFFERING) {
163                        setIcon('bufferIcon');
164                } else {
165                        if(view.config['playlist'] == 'over') {
166                                setIcon();
167                                return;
168                        }
169                        switch(view.config.displayclick) {
170                                case 'play':
171                                        setIcon('playIcon');
172                                        break;
173                                case 'link':
174                                        setIcon('linkIcon');
175                                        break;
176                                case 'mute':
177                                        setIcon('muteIcon');
178                                        break;
179                                default:
180                                        setIcon();
181                                        break;
182                        }
183                }
184        };
185
186
187};
188
189
190}
Note: See TracBrowser for help on using the browser.