Changeset 440


Ignore:
Timestamp:
10/12/09 15:18:51 (4 years ago)
Author:
zach
Message:

Updating Playlist

Location:
trunk/fl5/src/com/longtailvideo/jwplayer
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/fl5/src/com/longtailvideo/jwplayer/controller/Controller.as

    r419 r440  
    99        import com.longtailvideo.jwplayer.player.Player; 
    1010        import com.longtailvideo.jwplayer.player.PlayerState; 
    11         import com.longtailvideo.jwplayer.player.PlayerV4Emulation; 
    1211        import com.longtailvideo.jwplayer.plugins.IPlugin; 
    1312        import com.longtailvideo.jwplayer.utils.RootReference; 
     
    363362                private function loadNumber(item:Number):Boolean { 
    364363                        if (item >= 0 && item < _model.playlist.length) { 
     364                                _model.setActiveMediaProvider(_model.playlist.getItemAt(item).provider); 
    365365                                _model.media.addEventListener(MediaEvent.JWPLAYER_MEDIA_BUFFER_FULL, lockHandler); 
    366366                                _model.media.load(_model.playlist.getItemAt(item)); 
  • trunk/fl5/src/com/longtailvideo/jwplayer/model/PlayerConfig.as

    r419 r440  
    261261                /** When below this refers to the height, when right this refers to the width of the playlist. @default 180 **/ 
    262262                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                } 
    264267 
    265268                /**  
  • trunk/fl5/src/com/longtailvideo/jwplayer/utils/Draw.as

    r395 r440  
    4848                        tgt.scaleX = tgt.scaleY = 1; 
    4949                } 
     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                }; 
    5073        } 
    5174} 
  • trunk/fl5/src/com/longtailvideo/jwplayer/view/PlayerComponents.as

    r417 r440  
    7575                        _controlbar.x = Number(_player.config.pluginConfig('controlbar')['x']); 
    7676                        _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']);                      
    7881                         
    7982                } 
  • trunk/fl5/src/com/longtailvideo/jwplayer/view/View.as

    r419 r440  
    127127                private function setupComponents():void { 
    128128                        _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); 
    139138                } 
    140139 
  • trunk/fl5/src/com/longtailvideo/jwplayer/view/components/PlaylistComponent.as

    r401 r440  
    11package 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; 
    218        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; 
    524         
    625         
    726        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                 
    849                public function PlaylistComponent(player:Player) { 
    9                         //TODO: implement function 
    1050                        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 **/ 
    14321                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); 
    16401                } 
    17402        } 
Note: See TracChangeset for help on using the changeset viewer.