source: trunk/as3/com/jeroenwijering/plugins/Display.as @ 118

Revision 118, 5.9 KB checked in by jeroen, 4 years ago (diff)

made desktopplayer work again and fixed fullscreen without resizing

  • Property svn:executable set to *
Line 
1/**
2* Interface for all display elements.
3**/
4package com.jeroenwijering.plugins {
5
6
7import com.jeroenwijering.events.*;
8import com.jeroenwijering.utils.Draw;
9import com.jeroenwijering.utils.Strings;
10import flash.display.Loader;
11import flash.display.MovieClip;
12import flash.display.Sprite;
13import flash.events.Event;
14import flash.events.MouseEvent;
15import flash.geom.ColorTransform;
16import flash.net.URLRequest;
17import flash.utils.clearTimeout;
18import flash.utils.setTimeout;
19
20
21public class Display implements PluginInterface {
22
23
24        /** Reference to the MVC view. **/
25        private var view:AbstractView;
26        /** Reference to the display MC. **/
27        private var display:MovieClip;
28        /** Loader object for loading a logo. **/
29        private var loader:Loader;
30        /** Configuration vars for this plugin. **/
31        private var config:Object;
32        /** The margins of the logo. **/
33        private var margins:Array;
34        /** The latest playback state **/
35        private var state:String;
36        /** A list of all the icons. **/
37        private var ICONS:Array = new Array(
38                'playIcon',
39                'errorIcon',
40                'bufferIcon',
41                'linkIcon',
42                'muteIcon',
43                'fullscreenIcon',
44                'nextIcon'
45        );
46        /** ID for the buffer showing tiomeout. **/
47        private var timeout:Number;
48
49
50        /** Constructor; add all needed listeners. **/
51        public function Display():void {};
52
53
54        /** Initialize the plugin. **/
55        public function initializePlugin(vie:AbstractView):void {
56                view = vie;
57                config = view.getPluginConfig(this);
58                view.addControllerListener(ControllerEvent.ERROR,errorHandler);
59                view.addControllerListener(ControllerEvent.RESIZE,resizeHandler);
60                view.addControllerListener(ControllerEvent.PLAYLIST,stateHandler);
61                view.addModelListener(ModelEvent.BUFFER,bufferHandler);
62                view.addModelListener(ModelEvent.ERROR,errorHandler);
63                view.addModelListener(ModelEvent.STATE,stateHandler);
64                display = view.skin['display'];
65                display.media.mask = display.masker;
66                if(view.config['screencolor']) {
67                        var clr:ColorTransform = new ColorTransform();
68                        clr.color = uint('0x'+view.config['screencolor'].substr(-6));
69                        display.back.transform.colorTransform = clr;
70                }
71                if(view.config['screenalpha'] < 1) {
72                        display.back.alpha = view.config['screenalpha'];
73                } else if(view.config['screenalpha'] < 100)  {
74                        display.back.alpha = Number(view.config['screenalpha'])/100;
75                }
76                display.addEventListener(MouseEvent.CLICK,clickHandler);
77                display.buttonMode = true;
78                display.mouseChildren = false;
79                try {
80                        Draw.clear(display.logo);
81                        if(view.config['logo']) { setLogo(); }
82                } catch (err:Error) {}
83                stateHandler();
84        };
85
86
87        /** Receive buffer updates. **/
88        private function bufferHandler(evt:ModelEvent):void {
89                var pct:String = '';
90                if(evt.data.percentage > 0) {
91                        pct = Strings.zero(evt.data.percentage);
92                }
93                try {
94                        display.bufferIcon.txt.text = pct;
95                } catch (err:Error) {}
96        };
97
98
99        /** Process a click on the display. **/
100        private function clickHandler(evt:MouseEvent):void {
101                if(view.config['state'] == ModelStates.IDLE) {
102                        view.sendEvent('PLAY');
103                } else {
104                        view.sendEvent(view.config['displayclick']);
105                }
106        };
107
108
109        /** Receive and print errors. **/
110        private function errorHandler(evt:Object):void {
111                if(view.config['icons'] == true) {
112                        try {
113                                setIcon('errorIcon');
114                                display.errorIcon.txt.text = evt.data.message;
115                        } catch (err:Error) {}
116                }
117        };
118
119
120        /** Logo loaded; now position it. **/
121        private function logoHandler(evt:Event=null):void {
122                if(margins[0] > margins[2]) {
123                        display.logo.x = display.back.width- margins[2]-display.logo.width;
124                } else {
125                        display.logo.x = margins[0];
126                }
127                if(margins[1] > margins[3]) {
128                        display.logo.y = display.back.height- margins[3]-display.logo.height;
129                } else {
130                        display.logo.y = margins[1];
131                }
132        };
133
134
135        /** Receive resizing requests **/
136        private function resizeHandler(evt:ControllerEvent=null):void {
137                display.x = config['x'];
138                display.y = config['y'];
139                if(config['height'] > 0) {
140                        display.visible = true;
141                } else {
142                        display.visible = false;
143                }
144                display.back.width  = config['width'];
145                display.back.height = config['height'];
146                try {
147                        display.masker.width = config['width'];
148                        display.masker.height = config['height'];
149                } catch (err:Error) {}
150                for(var i:String in ICONS) {
151                        try {
152                                display[ICONS[i]].x = Math.round(config['width']/2);
153                                display[ICONS[i]].y = Math.round(config['height']/2);
154                        } catch (err:Error) {}
155                }
156                if(view.config['logo']) {
157                        logoHandler();
158                }
159        };
160
161
162        /** Set a specific icon in the display. **/
163        private function setIcon(icn:String=undefined):void {
164                for(var i:String in ICONS) {
165                        if(display[ICONS[i]]) {
166                                if(icn == ICONS[i] && view.config['icons'] == true) {
167                                        display[ICONS[i]].visible = true;
168                                } else {
169                                        display[ICONS[i]].visible = false;
170                                }
171                        }
172                }
173        };
174
175
176        /** Setup the logo loading. **/
177        private function setLogo():void {
178                margins = new Array(
179                        display.logo.x,
180                        display.logo.y,
181                        display.back.width-display.logo.x-display.logo.width,
182                        display.back.height-display.logo.y-display.logo.height
183                );
184                loader = new Loader();
185                loader.contentLoaderInfo.addEventListener(Event.COMPLETE,logoHandler);
186                display.logo.addChild(loader);
187                loader.load(new URLRequest(view.config['logo']));
188        };
189
190
191        /** Handle a change in playback state. **/
192        private function stateHandler(evt:Event=null):void {
193                clearTimeout(timeout);
194                switch (view.config['state']) {
195                        case ModelStates.PLAYING:
196                                setIcon();
197                                break;
198                        case ModelStates.BUFFERING:
199                                if(evt && evt['data']['oldstate'] == ModelStates.PLAYING) {
200                                        setIcon();
201                                        timeout = setTimeout(setIcon,1500,'bufferIcon');
202                                } else {
203                                        setIcon('bufferIcon');
204                                }
205                                break;
206                        case ModelStates.IDLE:
207                                if(view.config.displayclick == 'none' || !view.playlist) {
208                                        setIcon();
209                                } else {
210                                        setIcon('playIcon');
211                                }
212                                break;
213                        default:
214                                setIcon(view.config.displayclick+'Icon');
215                                break;
216                }
217        };
218
219
220};
221
222
223}
Note: See TracBrowser for help on using the repository browser.