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

Revision 1, 5.2 kB (checked in by jeroen, 18 months ago)

initial commit of old repository into public one

  • 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                'fullscreenIcon',
39                'muteIcon'
40        );
41
42
43        /** Constructor; add all needed listeners. **/
44        public function DisplayView(vie:View) {
45                view = vie;
46                view.addControllerListener(ControllerEvent.ERROR,errorHandler);
47                view.addControllerListener(ControllerEvent.ITEM,itemHandler);
48                view.addControllerListener(ControllerEvent.MUTE,muteHandler);
49                view.addControllerListener(ControllerEvent.RESIZE,resizeHandler);
50                view.addModelListener(ModelEvent.BUFFER,bufferHandler);
51                view.addModelListener(ModelEvent.ERROR,errorHandler);
52                view.addModelListener(ModelEvent.STATE,stateHandler);
53                view.addViewListener(ModelEvent.ERROR,errorHandler);
54                display = view.skin['display'];
55                display.addEventListener(MouseEvent.CLICK,clickHandler);
56                display.mouseChildren = false;
57                display.buttonMode = true;
58                Draw.clear(display.logo);
59                if(view.config['logo']) { setLogo(); }
60                setIcon('bufferIcon');
61        };
62
63
64        /** Receive buffer updates. **/
65        private function bufferHandler(evt:ModelEvent) {
66                if(evt.data.percentage == 0) {
67                        display.bufferIcon.txt.text = "";
68                } else {
69                        display.bufferIcon.txt.text = Strings.zero(evt.data.percentage);
70                }
71        };
72
73
74        /** Process a click on the display. **/
75        private function clickHandler(evt:MouseEvent) {
76                if(view.config.displayclick != 'none') {
77                        view.sendEvent(view.config['displayclick']);
78                }
79        };
80
81
82        /** Receive and print errors. **/
83        private function errorHandler(evt) {
84                display.errorIcon.msg.text = evt.data.message;
85                setIcon('errorIcon');
86        };
87
88
89        /** Show a mute icon if playing. **/
90        private function itemHandler(evt:ControllerEvent) {
91                if(view.config['texts'] == true) {
92                        display.texts.title.text = view.playlist[evt.data.index]['title'];
93                        display.texts.author.text = view.playlist[evt.data.index]['author'];
94                } else {
95                        display.texts.visible = false;
96                }
97        };
98
99
100        /** Logo loaded; now position it **/
101        private function logoHandler(evt:Event) {
102                if(margins[0] > margins[2]) {
103                        display.logo.x = display.back.width - margins[2] - display.logo.width;
104                } else {
105                        display.logo.x = margins[0];
106                }
107                if(margins[1] > margins[3]) {
108                        display.logo.y = display.back.height - margins[3] - display.logo.height;
109                } else {
110                        display.logo.y = margins[1];
111                }
112        };
113
114
115        /** Show a mute icon if playing. **/
116        private function muteHandler(evt:ControllerEvent) {
117                if(state == ModelStates.PLAYING) {
118                        if(evt.data.state == true) {
119                                setIcon('muteIcon');
120                        } else {
121                                setIcon();
122                        }
123                }
124        };
125
126
127        /** Receive resizing requests **/
128        private function resizeHandler(evt:ControllerEvent) {
129                var wid = evt.data.width;
130                var hei = evt.data.height;
131                display.back.width = display.mediaMask.width = wid;
132                display.back.height = display.mediaMask.height =  hei;
133                if(view.config['texts']) {
134                        display.texts.back.width = display.texts.title.width = display.texts.author.width = wid;
135                }
136                for(var i in ICONS) {
137                        display[ICONS[i]].x = Math.round(wid/2);
138                        display[ICONS[i]].y = Math.round(hei/2);
139                }
140                if(view.config['logo']) {
141                        logoHandler(new Event(Event.COMPLETE));
142                }
143        };
144
145
146        /** Set a specific icon in the display. **/
147        private function setIcon(icn:String=undefined) {
148                for(var i in ICONS) {
149                        if(icn == ICONS[i]) {
150                                display[ICONS[i]].visible = true;
151                        } else {
152                                display[ICONS[i]].visible = false;
153                        }
154                }
155        };
156
157
158        /** Setup the logo loading. **/
159        private function setLogo() {
160                margins = new Array(
161                        display.logo.x,
162                        display.logo.y,
163                        display.back.width - display.logo.x - display.logo.width,
164                        display.back.height - display.logo.y - display.logo.height
165                );
166                loader = new Loader();
167                loader.contentLoaderInfo.addEventListener(Event.COMPLETE,logoHandler);
168                display.logo.addChild(loader);
169                loader.load(new URLRequest(view.config['logo']));
170        };
171
172
173        /** Handle a change in playback state. **/
174        private function stateHandler(evt:ModelEvent) {
175                state = evt.data.newstate;
176                if(state == ModelStates.PLAYING) {
177                        if(view.config['mute'] == true) {
178                                setIcon('muteIcon');
179                        } else {
180                                setIcon();
181                        }
182                } else if (state == ModelStates.BUFFERING) {
183                        setIcon('bufferIcon');
184                } else {
185                        if(view.config['playlist'] == 'above') {
186                                setIcon();
187                                return;
188                        }
189                        switch(view.config.displayclick) {
190                                case 'fullscreen':
191                                        setIcon('fullscreenIcon');
192                                        break;
193                                case 'play':
194                                        setIcon('playIcon');
195                                        break;
196                                case 'link':
197                                        setIcon('linkIcon');
198                                        break;
199                                case 'mute':
200                                        setIcon('muteIcon');
201                                        break;
202                                default:
203                                        setIcon();
204                                        break;
205                        }
206                }
207        };
208
209
210};
211
212
213}
Note: See TracBrowser for help on using the browser.