Changeset 440
- Timestamp:
- 10/12/09 15:18:51 (4 years ago)
- Location:
- trunk/fl5/src/com/longtailvideo/jwplayer
- Files:
-
- 6 edited
-
controller/Controller.as (modified) (2 diffs)
-
model/PlayerConfig.as (modified) (1 diff)
-
utils/Draw.as (modified) (1 diff)
-
view/PlayerComponents.as (modified) (1 diff)
-
view/View.as (modified) (1 diff)
-
view/components/PlaylistComponent.as (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/fl5/src/com/longtailvideo/jwplayer/controller/Controller.as
r419 r440 9 9 import com.longtailvideo.jwplayer.player.Player; 10 10 import com.longtailvideo.jwplayer.player.PlayerState; 11 import com.longtailvideo.jwplayer.player.PlayerV4Emulation;12 11 import com.longtailvideo.jwplayer.plugins.IPlugin; 13 12 import com.longtailvideo.jwplayer.utils.RootReference; … … 363 362 private function loadNumber(item:Number):Boolean { 364 363 if (item >= 0 && item < _model.playlist.length) { 364 _model.setActiveMediaProvider(_model.playlist.getItemAt(item).provider); 365 365 _model.media.addEventListener(MediaEvent.JWPLAYER_MEDIA_BUFFER_FULL, lockHandler); 366 366 _model.media.load(_model.playlist.getItemAt(item)); -
trunk/fl5/src/com/longtailvideo/jwplayer/model/PlayerConfig.as
r419 r440 261 261 /** When below this refers to the height, when right this refers to the width of the playlist. @default 180 **/ 262 262 public function get playlistsize():Number { return _playlistsize; } 263 public function set playlistsize(x:Number):void { _playlistsize = x; } 263 public function set playlistsize(x:Number):void { 264 _playlistsize = x; 265 setPluginProperty('playlist.size', x.toString()); 266 } 264 267 265 268 /** -
trunk/fl5/src/com/longtailvideo/jwplayer/utils/Draw.as
r395 r440 48 48 tgt.scaleX = tgt.scaleY = 1; 49 49 } 50 51 52 /** 53 * Draw a rectangle on stage. 54 * 55 * @param tgt Displayobject to add the rectangle to. 56 * @param col Color of the rectangle. 57 * @param wid Width of the rectangle. 58 * @param hei Height of the rectangle. 59 * @param xps X offset of the rectangle, defaults to 0. 60 * @param yps Y offset of the rectangle, defaults to 0. 61 * @param alp Alpha value of the rectangle, defaults to 0. 62 * @return A reference to the newly drawn rectangle. 63 **/ 64 public static function rect(tgt:Sprite, col:String, wid:Number, hei:Number, xps:Number = 0, yps:Number = 0, alp:Number = 1):Sprite { 65 var rct:Sprite = new Sprite(); 66 rct.x = xps; 67 rct.y = yps; 68 rct.graphics.beginFill(uint('0x' + col), alp); 69 rct.graphics.drawRect(0, 0, wid, hei); 70 tgt.addChild(rct); 71 return rct; 72 }; 50 73 } 51 74 } -
trunk/fl5/src/com/longtailvideo/jwplayer/view/PlayerComponents.as
r417 r440 75 75 _controlbar.x = Number(_player.config.pluginConfig('controlbar')['x']); 76 76 _controlbar.y = Number(_player.config.pluginConfig('controlbar')['y']); 77 77 78 _playlist.resize(width, height); 79 _playlist.x = Number(_player.config.pluginConfig('playlist')['x']); 80 _playlist.y = Number(_player.config.pluginConfig('playlist')['y']); 78 81 79 82 } -
trunk/fl5/src/com/longtailvideo/jwplayer/view/View.as
r419 r440 127 127 private function setupComponents():void { 128 128 _components = new PlayerComponents(_player); 129 130 _components.controlbar.addGlobalListener(forward); 131 _components.display.addGlobalListener(forward); 132 133 _componentsLayer.addChildAt(_components.display as MovieClip, 0); 134 _componentsLayer.addChildAt(_components.controlbar as MovieClip, 1); 135 136 //addToLayer(_playerComponents.controlbar as MovieClip, _components); 137 //addToStage(_playerComponents.dock, _player.config.width, _player.config.height); 138 //addToStage(_playerComponents.playlist, _player.config.width, _player.config.height); 129 130 setupComponent(_components.display, 0); 131 setupComponent(_components.controlbar, 1); 132 setupComponent(_components.playlist, 2); 133 } 134 135 private function setupComponent(component:IPlayerComponent, index:Number):void { 136 component.addGlobalListener(forward); 137 _componentsLayer.addChildAt(component as DisplayObject, index); 139 138 } 140 139 -
trunk/fl5/src/com/longtailvideo/jwplayer/view/components/PlaylistComponent.as
r401 r440 1 1 package com.longtailvideo.jwplayer.view.components { 2 import com.longtailvideo.jwplayer.events.PlayerStateEvent; 3 import com.longtailvideo.jwplayer.events.PlaylistEvent; 4 import com.longtailvideo.jwplayer.model.PlaylistItem; 5 import com.longtailvideo.jwplayer.player.Player; 6 import com.longtailvideo.jwplayer.player.PlayerState; 7 import com.longtailvideo.jwplayer.plugins.PluginConfig; 8 import com.longtailvideo.jwplayer.utils.Draw; 9 import com.longtailvideo.jwplayer.utils.Stacker; 10 import com.longtailvideo.jwplayer.utils.Stretcher; 11 import com.longtailvideo.jwplayer.utils.Strings; 12 import com.longtailvideo.jwplayer.view.interfaces.IPlaylistComponent; 13 14 import flash.display.DisplayObject; 15 import flash.display.Loader; 16 import flash.display.MovieClip; 17 import flash.display.Sprite; 2 18 import flash.events.Event; 3 import com.longtailvideo.jwplayer.view.interfaces.IPlaylistComponent; 4 import com.longtailvideo.jwplayer.player.Player; 19 import flash.events.MouseEvent; 20 import flash.geom.ColorTransform; 21 import flash.net.URLRequest; 22 import flash.utils.clearInterval; 23 import flash.utils.setInterval; 5 24 6 25 7 26 public class PlaylistComponent extends CoreComponent implements IPlaylistComponent { 27 /** Reference to the playlist MC. **/ 28 public var clip:MovieClip; 29 /** Array with all button instances **/ 30 private var buttons:Array; 31 /** Height of a button (to calculate scrolling) **/ 32 private var buttonheight:Number; 33 /** Currently active button. **/ 34 private var active:Number; 35 /** Proportion between clip and mask. **/ 36 private var proportion:Number; 37 /** Interval ID for scrolling **/ 38 private var scrollInterval:Number; 39 /** Image dimensions. **/ 40 private var image:Array; 41 /** Color object for backcolor. **/ 42 private var back:ColorTransform; 43 /** Color object for frontcolor. **/ 44 private var front:ColorTransform; 45 /** Color object for lightcolor. **/ 46 private var light:ColorTransform; 47 48 8 49 public function PlaylistComponent(player:Player) { 9 //TODO: implement function10 50 super(player); 11 } 12 13 51 player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_ITEM, itemHandler); 52 player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_LOADED, playlistHandler); 53 player.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_UPDATED, playlistHandler); 54 player.addEventListener(PlayerStateEvent.JWPLAYER_PLAYER_STATE, stateHandler); 55 clip = _player.skin.getSWFSkin().getChildByName("playlist") as MovieClip; 56 addChild(clip); 57 buttonheight = clip.list.button.height; 58 clip.list.button.visible = false; 59 clip.list.mask = clip.masker; 60 clip.list.addEventListener(MouseEvent.CLICK, clickHandler); 61 clip.list.addEventListener(MouseEvent.MOUSE_OVER, overHandler); 62 clip.list.addEventListener(MouseEvent.MOUSE_OUT, outHandler); 63 clip.slider.buttonMode = true; 64 clip.slider.mouseChildren = false; 65 clip.slider.addEventListener(MouseEvent.MOUSE_DOWN, sdownHandler); 66 clip.slider.addEventListener(MouseEvent.MOUSE_OVER, soverHandler); 67 clip.slider.addEventListener(MouseEvent.MOUSE_OUT, soutHandler); 68 clip.slider.visible = false; 69 buttons = new Array(); 70 try { 71 image = new Array(clip.list.button.image.width, clip.list.button.image.height); 72 } catch (err:Error) { 73 } 74 if (clip.list.button['back']) { 75 setColors(); 76 } 77 } 78 79 80 /** Handle a button rollover. **/ 81 private function overHandler(evt:MouseEvent):void { 82 var idx:Number = Number(evt.target.name); 83 if (front && back) { 84 for (var itm:String in _player.playlist.getItemAt(idx)) { 85 if (buttons[idx].c[itm] && typeof(buttons[idx].c[itm]) == "object") { 86 buttons[idx].c[itm].textColor = back.color; 87 } 88 } 89 buttons[idx].c['back'].transform.colorTransform = light; 90 } 91 buttons[idx].c.gotoAndStop('over'); 92 }; 93 94 95 /** Handle a button rollover. **/ 96 private function outHandler(evt:MouseEvent):void { 97 var idx:Number = Number(evt.target.name); 98 if (front && back) { 99 for (var itm:String in _player.playlist.getItemAt(idx)) { 100 if (buttons[idx].c[itm] && typeof(buttons[idx].c[itm]) == "object") { 101 if (idx == active) { 102 buttons[idx].c[itm].textColor = light.color; 103 } else { 104 buttons[idx].c[itm].textColor = front.color; 105 } 106 } 107 } 108 buttons[idx].c['back'].transform.colorTransform = back; 109 } 110 if (idx == active) { 111 buttons[idx].c.gotoAndStop('active'); 112 } else { 113 buttons[idx].c.gotoAndStop('out'); 114 } 115 }; 116 117 118 /** Setup all buttons in the playlist **/ 119 private function buildPlaylist(clr:Boolean):void { 120 if (!_player.playlist) { 121 return; 122 } 123 var wid:Number = clip.back.width; 124 var hei:Number = clip.back.height; 125 clip.masker.height = hei; 126 clip.masker.width = wid; 127 proportion = _player.playlist.length * buttonheight / hei; 128 if (proportion > 1.01) { 129 wid -= clip.slider.width; 130 buildSlider(); 131 } else { 132 clip.slider.visible = false; 133 } 134 if (clr) { 135 clip.list.y = clip.masker.y; 136 for (var j:Number = 0; j < buttons.length; j++) { 137 clip.list.removeChild(buttons[j].c); 138 } 139 buttons = new Array(); 140 } else { 141 if (proportion > 1) { 142 scrollEase(); 143 } 144 } 145 for (var i:Number = 0; i < _player.playlist.length; i++) { 146 if (clr) { 147 var btn:MovieClip = Draw.clone(clip.list.button, true) as MovieClip; 148 var stc:Stacker = new Stacker(btn); 149 btn.y = i * buttonheight; 150 btn.buttonMode = true; 151 btn.mouseChildren = false; 152 btn.name = i.toString(); 153 buttons.push({c: btn, s: stc}); 154 setContents(i); 155 } 156 buttons[i].s.rearrange(wid); 157 } 158 } 159 160 161 /** Setup the scrollbar component **/ 162 private function buildSlider():void { 163 var scr:MovieClip = clip.slider; 164 scr.visible = true; 165 scr.x = clip.back.width - scr.width; 166 var dif:Number = clip.back.height - scr.height - scr.y; 167 scr.back.height += dif; 168 scr.rail.height += dif; 169 scr.icon.height = Math.round(scr.rail.height / proportion); 170 } 171 172 173 /** Make sure the playlist is not out of range. **/ 174 private function scrollEase(ips:Number = -1, cps:Number = -1):void { 175 var scr:MovieClip = clip.slider; 176 if (ips != -1) { 177 scr.icon.y = Math.round(ips - (ips - scr.icon.y) / 1.5); 178 clip.list.y = Math.round((cps - (cps - clip.list.y) / 1.5)); 179 } 180 if (clip.list.y > 0 || scr.icon.y < scr.rail.y) { 181 clip.list.y = clip.masker.y; 182 scr.icon.y = scr.rail.y; 183 } else if (clip.list.y < clip.masker.height - clip.list.height || scr.icon.y > scr.rail.y + scr.rail.height - scr.icon.height) { 184 scr.icon.y = scr.rail.y + scr.rail.height - scr.icon.height; 185 clip.list.y = clip.masker.y + clip.masker.height - clip.list.height; 186 } 187 }; 188 189 190 /** Scrolling handler. **/ 191 private function scrollHandler():void { 192 var scr:MovieClip = clip.slider; 193 var yps:Number = scr.mouseY - scr.rail.y; 194 var ips:Number = yps - scr.icon.height / 2; 195 var cps:Number = clip.masker.y + clip.masker.height / 2 - proportion * yps; 196 scrollEase(ips, cps); 197 }; 198 199 200 /** Init the colors. **/ 201 private function setColors():void { 202 if (_player.config.backcolor) { 203 back = new ColorTransform(); 204 back.color = _player.config.backcolor; 205 clip.back.transform.colorTransform = back; 206 clip.slider.back.transform.colorTransform = back; 207 } 208 if (_player.config.frontcolor) { 209 front = new ColorTransform(); 210 front.color = _player.config.frontcolor; 211 try { 212 clip.slider.icon.transform.colorTransform = front; 213 clip.slider.rail.transform.colorTransform = front; 214 } catch (err:Error) { 215 } 216 if (_player.config.lightcolor) { 217 light = new ColorTransform(); 218 light.color = _player.config.lightcolor; 219 } else { 220 light = front; 221 } 222 } 223 }; 224 225 226 /** Setup button elements **/ 227 private function setContents(idx:Number):void { 228 var playlistItem:PlaylistItem = _player.playlist.getItemAt(idx); 229 buttons[idx].c.gotoAndStop(0); 230 if (playlistItem.image) { 231 if (config['thumbs'] != false && _player.config.playlist != 'none' && _player.playlist.getItemAt(idx).image) { 232 var img:MovieClip = buttons[idx].c.image; 233 var msk:Sprite = Draw.rect(buttons[idx].c, '0xFF0000', img.width, img.height, img.x, img.y); 234 var ldr:Loader = new Loader(); 235 img.mask = msk; 236 img.addChild(ldr); 237 ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderHandler); 238 if (_player.playlist.getItemAt(idx).image) { 239 ldr.load(new URLRequest(_player.playlist.getItemAt(idx).image)); 240 } 241 } 242 } 243 if (playlistItem.duration) { 244 if (_player.playlist.getItemAt(idx).duration > 0) { 245 buttons[idx].c['duration'].text = Strings.digits(_player.playlist.getItemAt(idx).duration); 246 if (front) { 247 buttons[idx].c['duration'].textColor = front.color; 248 } 249 } 250 } 251 try { 252 if (playlistItem.description) { 253 buttons[idx].c['description'].htmlText = _player.playlist.getItemAt(idx).description; 254 } else { 255 buttons[idx].c['description'].text = _player.playlist.getItemAt(idx).description; 256 } 257 if (front) { 258 buttons[idx].c['description'].textColor = front.color; 259 } 260 } catch (e:Error) { 261 } 262 if (buttons[idx].c['image'] && (!_player.playlist.getItemAt(idx).image || config['thumbs'] == false)) { 263 buttons[idx].c['image'].visible = false; 264 } 265 if (back) { 266 buttons[idx].c['back'].transform.colorTransform = back; 267 } 268 }; 269 270 271 /** Loading of image completed; resume loading **/ 272 private function loaderHandler(evt:Event):void { 273 var ldr:Loader = Loader(evt.target.loader); 274 Stretcher.stretch(ldr, image[0], image[1], Stretcher.FILL); 275 }; 276 277 278 /** Start scrolling the playlist on mousedown. **/ 279 private function sdownHandler(evt:MouseEvent):void { 280 clearInterval(scrollInterval); 281 clip.stage.addEventListener(MouseEvent.MOUSE_UP, supHandler); 282 scrollHandler(); 283 scrollInterval = setInterval(scrollHandler, 50); 284 }; 285 286 287 /** Revert the highlight on mouseout. **/ 288 private function soutHandler(evt:MouseEvent):void { 289 if (front) { 290 clip.slider.icon.transform.colorTransform = front; 291 } else { 292 clip.slider.icon.gotoAndStop('out'); 293 } 294 }; 295 296 297 /** Highlight the icon on rollover. **/ 298 private function soverHandler(evt:MouseEvent):void { 299 if (front) { 300 clip.slider.icon.transform.colorTransform = light; 301 } else { 302 clip.slider.icon.gotoAndStop('over'); 303 } 304 }; 305 306 307 /** Stop scrolling the playlist on mouseout. **/ 308 private function supHandler(evt:MouseEvent):void { 309 clearInterval(scrollInterval); 310 clip.stage.removeEventListener(MouseEvent.MOUSE_UP, supHandler); 311 }; 312 313 314 /** Handle a click on a button. **/ 315 private function clickHandler(evt:MouseEvent):void { 316 _player.playlistItem(Number(evt.target.name)); 317 } 318 319 320 /** Process resizing requests **/ 14 321 public function resize(width:Number, height:Number):void { 15 //TODO: implement function 322 clip.x = 0; 323 clip.y = 0; 324 clip.back.width = width; 325 clip.back.height = height; 326 buildPlaylist(false); 327 if (config['position'] == 'over') { 328 stateHandler(); 329 } else { 330 clip.visible = true; 331 } 332 } 333 334 335 /** Switch the currently active item */ 336 protected function itemHandler(evt:PlaylistEvent = null):void { 337 var idx:Number = _player.config.item; 338 clearInterval(scrollInterval); 339 if (proportion > 1.01) { 340 scrollInterval = setInterval(scrollEase, 50, idx * buttonheight / proportion, -idx * buttonheight + clip.masker.y); 341 } 342 if (light) { 343 for (var itm:String in _player.playlist.getItemAt(idx)) { 344 if (buttons[idx].c[itm]) { 345 try { 346 buttons[idx].c[itm].textColor = light.color; 347 } catch (err:Error) { 348 } 349 } 350 } 351 } 352 if (back) { 353 buttons[idx].c['back'].transform.colorTransform = back; 354 } 355 buttons[idx].c.gotoAndStop('active'); 356 if (!isNaN(active)) { 357 if (front) { 358 for (var act:String in _player.playlist.getItemAt(active)) { 359 if (buttons[active].c[act]) { 360 try { 361 buttons[active].c[act].textColor = front.color; 362 } catch (err:Error) { 363 } 364 } 365 } 366 } 367 buttons[active].c.gotoAndStop('out'); 368 } 369 active = idx; 370 } 371 372 373 /** New playlist loaded: rebuild the playclip. **/ 374 protected function playlistHandler(evt:PlaylistEvent = null):void { 375 clearInterval(scrollInterval); 376 active = undefined; 377 buildPlaylist(true); 378 resize(width, height); 379 } 380 381 382 /** Process state changes **/ 383 protected function stateHandler(evt:PlayerStateEvent = null):void { 384 if (config['position'] == 'over') { 385 if (player.state == PlayerState.PLAYING || player.state == PlayerState.PAUSED || player.state == PlayerState.BUFFERING) { 386 visible = false; 387 } else { 388 visible = true; 389 } 390 } 391 } 392 393 394 protected function get config():PluginConfig { 395 return player.config.pluginConfig('playlist'); 396 } 397 398 399 protected function getSkinElement(component:String, element:String):DisplayObject { 400 return _player.skin.getSkinElement(component, element); 16 401 } 17 402 }
Note: See TracChangeset
for help on using the changeset viewer.
