Changeset 6


Ignore:
Timestamp:
06/09/08 08:34:58 (5 years ago)
Author:
jeroen
Message:

added stacking and first skin (inverted)

Location:
trunk
Files:
5 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/as3/com/jeroenwijering/models/HTTPModel.as

    r5 r6  
    241241        private function statusHandler(evt:NetStatusEvent) { 
    242242                if(evt.info.code == "NetStream.Play.Stop") { 
    243                         if(model.state == ModelStates.COMPLETED) { 
     243                        if(model.config['state'] == ModelStates.COMPLETED) { 
    244244                                stream.close(); 
    245245                        } else {  
     
    273273                if(bfr < 100 && pos < Math.abs(dur-stream.bufferTime-1)) { 
    274274                        model.sendEvent(ModelEvent.BUFFER,{percentage:bfr}); 
    275                         if(model.state != ModelStates.BUFFERING) { 
     275                        if(model.config['state'] != ModelStates.BUFFERING) { 
    276276                                model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.BUFFERING}); 
    277277                        } 
    278                 } else if (model.state == ModelStates.BUFFERING) { 
     278                } else if (model.config['state'] == ModelStates.BUFFERING) { 
    279279                        model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.PLAYING}); 
    280280                } 
  • trunk/as3/com/jeroenwijering/models/RTMPModel.as

    r1 r6  
    1212import flash.media.*; 
    1313import flash.net.*; 
    14 import flash.utils.clearInterval; 
    15 import flash.utils.setInterval; 
     14import flash.utils.*; 
    1615 
    1716 
     
    3130        /** Interval ID for the time. **/ 
    3231        private var timeinterval:Number; 
     32        /** Timeout ID for cleaning up idle streams. **/ 
     33        private var timeout:Number; 
    3334        /** Metadata received switch. **/ 
    3435        private var metadata:Boolean; 
     
    168169                stream.pause(); 
    169170                model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.PAUSED}); 
     171                timeout = setTimeout(stop,10000); 
    170172        }; 
    171173 
     
    173175        /** Resume playing. **/ 
    174176        public function play() { 
     177                clearTimeout(timeout); 
    175178                stream.resume(); 
    176179                model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.PLAYING}); 
     
    194197        public function seek(pos:Number) { 
    195198                clearInterval(timeinterval); 
    196                 if(model.state == ModelStates.PAUSED) { 
     199                if(model.config['state'] == ModelStates.PAUSED) { 
    197200                        stream.resume(); 
    198201                } 
     
    233236 
    234237 
    235         /** Destroy the videocamera. **/ 
     238        /** Destroy the stream. **/ 
    236239        public function stop() { 
    237240                clearInterval(timeinterval); 
     
    250253                if(bfr < 100 && pos < dur-stream.bufferTime-1) { 
    251254                        model.sendEvent(ModelEvent.BUFFER,{percentage:bfr}); 
    252                         if(model.state != ModelStates.BUFFERING) { 
     255                        if(model.config['state'] != ModelStates.BUFFERING) { 
    253256                                model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.BUFFERING}); 
    254257                        } 
    255                 } else if (model.state == ModelStates.BUFFERING) { 
     258                } else if (model.config['state'] == ModelStates.BUFFERING) { 
    256259                        model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.PLAYING}); 
    257260                } 
  • trunk/as3/com/jeroenwijering/models/SoundModel.as

    r1 r6  
    145145                var dur = Math.round(sound.length*sound.bytesTotal/sound.bytesLoaded/100)/10; 
    146146                if(sound.isBuffering == true) { 
    147                         if(model.state != ModelStates.BUFFERING) { 
     147                        if(model.config['state'] != ModelStates.BUFFERING) { 
    148148                                model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.BUFFERING}); 
    149149                        } else { 
     
    151151                                model.sendEvent(ModelEvent.BUFFER,{percentage:pct}); 
    152152                        } 
    153                 } else if (model.state == ModelStates.BUFFERING && sound.isBuffering == false) { 
     153                } else if (model.config['state'] == ModelStates.BUFFERING && sound.isBuffering == false) { 
    154154                        model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.PLAYING}); 
    155155                } 
  • trunk/as3/com/jeroenwijering/models/VideoModel.as

    r1 r6  
    192192                if(bfr < 100 && pos < dur-stream.bufferTime-1) { 
    193193                        model.sendEvent(ModelEvent.BUFFER,{percentage:bfr}); 
    194                         if(model.state != ModelStates.BUFFERING) { 
     194                        if(model.config['state'] != ModelStates.BUFFERING) { 
    195195                                model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.BUFFERING}); 
    196196                        } 
    197                 } else if (model.state == ModelStates.BUFFERING) { 
     197                } else if (model.config['state'] == ModelStates.BUFFERING) { 
    198198                        model.sendEvent(ModelEvent.STATE,{newstate:ModelStates.PLAYING}); 
    199199                } 
  • trunk/as3/com/jeroenwijering/player/Controller.as

    r3 r6  
    55 
    66 
    7 import flash.display.MovieClip; 
    8 import flash.events.*; 
    9 import flash.net.*; 
    107import com.jeroenwijering.events.*; 
    118import com.jeroenwijering.player.*; 
    129import com.jeroenwijering.utils.*; 
     10import flash.display.MovieClip; 
     11import flash.events.*; 
     12import flash.geom.Rectangle; 
     13import flash.net.*; 
     14import flash.system.Capabilities; 
    1315 
    1416 
     
    2830        /** object that povides randomization. **/ 
    2931        private var randomizer:Randomizer; 
    30         /** save the state of the model. **/ 
    31         private var state:String; 
    3232 
    3333 
     
    3939                skin.stage.align = "TL"; 
    4040                skin.stage.addEventListener(Event.RESIZE,resizeHandler); 
    41                 skin.stage.addEventListener(Event.FULLSCREEN,resizeHandler); 
    4241                playlister = new Playlister(); 
    4342                playlister.addEventListener(Event.COMPLETE,playlistHandler); 
     
    4948        public function start(mdl:Model,vie:View) { 
    5049                model= mdl; 
    51                 model.addEventListener(ModelEvent.STATE,stateHandler); 
    5250                model.addEventListener(ModelEvent.META,metaHandler); 
    5351                model.addEventListener(ModelEvent.TIME,metaHandler); 
     
    9492                        skin.stage.displayState = 'normal'; 
    9593                } else { 
     94                        skin.stage["fullScreenSourceRect"] = new Rectangle(0,0, 
     95                                Capabilities.screenResolutionX,Capabilities.screenResolutionY); 
    9696                        skin.stage.displayState = 'fullScreen'; 
    9797                } 
     
    101101        /** Jump to a userdefined item in the playlist. **/ 
    102102        private function itemHandler(evt:ViewEvent) { 
     103                if(playlist[config['item']]['author'] == 'commercial') { return; } 
    103104                var itm = evt.data.index; 
    104105                if (itm < 0) { 
     
    163164        /** Jump to the next item in the playlist. **/ 
    164165        private function nextHandler(evt:ViewEvent) { 
     166                if(playlist[config['item']]['author'] == 'commercial') { return; } 
    165167                if(config['shuffle'] == true) {  
    166168                        playItem(randomizer.pick()); 
     
    177179                if(evt.data.state) { 
    178180                        dispatchEvent(new ControllerEvent(ControllerEvent.PLAY,{state:evt.data.state})); 
    179                 } else if(state == ModelStates.PLAYING || state == ModelStates.BUFFERING) { 
     181                } else if(config['state'] == ModelStates.PLAYING || config['state'] == ModelStates.BUFFERING) { 
    180182                        dispatchEvent(new ControllerEvent(ControllerEvent.PLAY,{state:false})); 
    181183                } else {  
     
    211213        /** Jump to the previous item in the playlist. **/ 
    212214        private function prevHandler(evt:ViewEvent) { 
     215                if(playlist[config['item']]['author'] == 'commercial') { return; } 
    213216                if(config['shuffle'] == true) {  
    214217                        playItem(randomizer.back()); 
     
    261264        /** Seek to a specific part in a mediafile. **/ 
    262265        private function seekHandler(evt:ViewEvent) { 
     266                if(playlist[config['item']]['author'] == 'commercial') { return; } 
    263267                var pos = evt.data.position; 
    264268                if(pos < 2) { pos = 0; } 
     
    277281        /** Manage playback state changes **/ 
    278282        private function stateHandler(evt:ModelEvent) { 
    279                 state = evt.data.newstate; 
    280283                if(evt.data.newstate == ModelStates.COMPLETED && (config['repeat'] == true || 
    281284                        (config['shuffle'] == true && randomizer.length > 0) ||  
  • trunk/as3/com/jeroenwijering/player/Model.as

    r5 r6  
    2727        /** Currently active model. **/ 
    2828        private var current:Object; 
    29         /** Current playback state **/ 
    30         public var state:String; 
    3129        /** Loader for the preview image. **/ 
    3230        private var loader:Loader; 
     
    123121        private function playHandler(evt:ControllerEvent) { 
    124122                if(evt.data.state == true) { 
    125                         if(state == ModelStates.IDLE) { 
     123                        if(config['state'] == ModelStates.IDLE) { 
    126124                                current.load(); 
    127                         } else if(state != ModelStates.PAUSED) { 
     125                        } else if(config['state'] != ModelStates.PAUSED) { 
    128126                                current.seek(playlist[config['item']]['start']); 
    129127                        } else { 
     
    151149        /** Seek inside a file. **/ 
    152150        private function seekHandler(evt:ControllerEvent) { 
    153                 if(state != ModelStates.IDLE) { 
     151                if(config['state'] != ModelStates.IDLE) { 
    154152                        current.seek(evt.data.position); 
    155153                } 
     
    166164        /**  Dispatch events. State switch is saved. **/ 
    167165        public function sendEvent(typ:String,dat:Object) { 
    168                 if(typ == ModelEvent.STATE && dat.newstate != state) { 
    169                         dat.oldstate = state; 
    170                         state = dat.newstate; 
     166                if(typ == ModelEvent.STATE && dat.newstate != config['state']) { 
     167                        dat.oldstate = config['state']; 
     168                        config['state'] = dat.newstate; 
    171169                        dispatchEvent(new ModelEvent(typ,dat)); 
    172170                } else if (typ != ModelEvent.STATE) { 
  • trunk/as3/com/jeroenwijering/player/Player.as

    r5 r6  
    4848 
    4949                abouttext:"About JW Player 4.0...", 
    50                 aboutlink:"http://www.jeroenwijering.com/?page=about", 
     50                aboutlink:"http://www.jeroenwijering.com/?page=player", 
    5151                linktarget:'_self', 
    5252                streamscript:undefined, 
     
    5656                controlbarheight:20, 
    5757                height:300, 
    58                 state:'IDLE', 
    59                 version:'4.0 r3', 
     58                state:undefined, 
     59                version:'4.0 r4', 
    6060                width:400 
    6161        }; 
     
    7272 
    7373 
    74         /** Constructor; Loads config. **/ 
     74        /** Constructor; Loads config parameters. **/ 
    7575        public function Player() { 
    7676                configger = new Configger(this); 
  • trunk/as3/com/jeroenwijering/utils/Animations.as

    r5 r6  
    2525        * @param spd    The amount of alpha change per frame. 
    2626        **/ 
    27         public static function fade(tgt:MovieClip,end:Number,spd:Number=undefined) { 
     27        public static function fade(tgt:MovieClip,end:Number=undefined,spd:Number=undefined) { 
    2828                if(arguments.length > 2) {  
    29                         Animations.speed = spd;  
     29                        tgt.speed = spd;  
     30                } else {  
     31                        tgt.speed = Animations.speed; 
    3032                } 
    3133                if(arguments.length > 1) {  
    32                         Animations.end = end;  
     34                        tgt.end = end;  
     35                } else {  
     36                        tgt.end = Animations.end; 
    3337                } 
    34                 if(tgt.alpha > Animations.end) { 
    35                         Animations.speed = -Math.abs(Animations.speed); 
     38                if(tgt.alpha > tgt.end) { 
     39                        tgt.speed = -Math.abs(tgt.speed); 
    3640                } else { 
    37                         Animations.speed = Math.abs(Animations.speed); 
     41                        tgt.speed = Math.abs(tgt.speed); 
    3842                } 
    39                 tgt.visible = true; 
    4043                tgt.addEventListener(Event.ENTER_FRAME,fadeHandler); 
    4144        }; 
     
    4548        private static function fadeHandler(evt:Event) { 
    4649                var tgt = MovieClip(evt.target); 
    47                 if((tgt.alpha >= Animations.end && Animations.speed > 0) || 
    48                         (tgt.alpha <= Animations.end && Animations.speed < 0)) { 
     50                if((tgt.alpha >= tgt.end && tgt.speed > 0) || 
     51                        (tgt.alpha <= tgt.end && tgt.speed < 0)) { 
    4952                        tgt.removeEventListener(Event.ENTER_FRAME,fadeHandler); 
    50                         tgt.alpha = Animations.end; 
    51                         if(Animations.end == 0) {  
     53                        tgt.alpha = tgt.end; 
     54                        if(tgt.end == 0) {  
    5255                                tgt.visible = false;  
    5356                        } 
    5457                } else { 
    55                         tgt.alpha += Animations.speed; 
     58                        tgt.visible = true; 
     59                        tgt.alpha += tgt.speed; 
    5660                } 
    5761        }; 
  • trunk/as3/com/jeroenwijering/utils/Skinner.as

    r3 r6  
    77 
    88 
     9import com.jeroenwijering.utils.Draw; 
    910import flash.display.Loader; 
    1011import flash.display.MovieClip; 
     
    2930        * Constructor. 
    3031        * 
    31         * @param skn    The MovieClip that contains the display, playlist and controlbar. 
     32        * @param skn    The player instance. 
    3233        **/ 
    3334        public function Skinner(ply:MovieClip) { 
     
    5253                        } 
    5354                } else { 
    54                         skin = player['player']; 
     55                        skin = player.root['player']; 
    5556                        dispatchEvent(new Event(Event.COMPLETE)); 
    5657                } 
     
    6667        /** SWF loading completed; add to stage and populate. **/ 
    6768        private function loaderHandler(evt:Event) { 
    68                 var cnt = MovieClip(loader.content); 
     69                if(loader.content['player']) { 
     70                        skin = MovieClip(loader.content['player']); 
     71                        trace(loader.content['player']); 
     72                } else { 
     73                        skin = MovieClip(loader.content); 
     74                } 
     75                Draw.clear(player); 
     76                player.addChild(skin); 
    6977                /* 
    7078                for(var i=0; i<cnt.numChildren; i++) { 
  • trunk/as3/com/jeroenwijering/utils/Stacker.as

    r4 r6  
    4747 
    4848        /** Check if an child overlaps with others. **/ 
    49         private function overlaps() {  
    50                 // working on this... 
     49        private function overlaps(idx:Number):Boolean {  
     50                var min = stack[idx].x; 
     51                var max = stack[idx].x+stack[idx].w; 
     52                for (var i in stack) { 
     53                        if(i!=idx && stack[i].c.visible==true && stack[i].n!='back' && 
     54                                stack[i].x < max && stack[i].x+stack[i].w > min) { 
     55                                return true; 
     56                        } 
     57                } 
     58                return false; 
    5159        }; 
    5260 
     
    6169                var rdf = latest-width; 
    6270                var ldf = 0; 
     71                // first run through the entire stack, closing the gaps. 
    6372                for(var i=0; i<stack.length; i++) { 
    64                         if(stack[i].x > stack[0].w/2) {  
     73                        if(stack[i].x > width/2) { 
    6574                                stack[i].c.x = stack[i].x + rdf; 
     75                                if(stack[i].c.visible == false && overlaps(i) == false) { 
     76                                        if(stack[i+1].x > stack[i].w+stack[i].x) { 
     77                                                rdf -= stack[i].w; 
     78                                        } else {  
     79                                                rdf -= stack[i+1].x - stack[i].x; 
     80                                        } 
     81                                } 
    6682                        } else { 
    67                                 stack[i].c.x = stack[i].x+ldf; 
     83                                stack[i].c.x = stack[i].x-ldf; 
     84                                if(stack[i].c.visible == false && overlaps(i) == false) { 
     85                                        if(stack[i+1].x > stack[i].w+stack[i].x) { 
     86                                                ldf += stack[i].w; 
     87                                        } else {  
     88                                                ldf += stack[i+1].x - stack[i].x; 
     89                                        } 
     90                                } 
    6891                        } 
    6992                        if(stack[i].w > width/3) { 
    7093                                stack[i].c.width = stack[i].w+rdf+ldf; 
     94                        } 
     95                } 
     96                // if gaps were closed, move all rightside stuff to fill the width. 
     97                var dif = latest-width-rdf; 
     98                if(dif>0) { 
     99                        for(var j=0; j<stack.length; j++) { 
     100                                if(stack[j].x > width/2) { 
     101                                        stack[j].c.x += dif; 
     102                                } 
     103                                if(stack[j].w>width/3 && stack[j].n!='back') { 
     104                                        stack[j].c.width += dif; 
     105                                } 
    71106                        } 
    72107                } 
  • trunk/as3/com/jeroenwijering/views/ControlbarView.as

    r5 r6  
    6262 
    6363 
    64         /** Handle clicks from all buttons **/ 
     64        /** Handle clicks from all buttons. **/ 
    6565        private function clickHandler(evt:MouseEvent) { 
    6666                view.sendEvent(BUTTONS[evt.target.name]); 
     67        }; 
     68 
     69 
     70        /** Fix the timeline display. **/ 
     71        private function fixTime() { 
     72                var scp = bar.timeSlider.scaleX; 
     73                bar.timeSlider.scaleX = 1; 
     74                bar.timeSlider.icon.x = Math.round(scp*bar.timeSlider.icon.x); 
     75                bar.timeSlider.mark.x = Math.round(scp*bar.timeSlider.mark.x); 
     76                bar.timeSlider.mark.width = Math.round(scp*bar.timeSlider.mark.width); 
     77                bar.timeSlider.rail.width = Math.round(scp*bar.timeSlider.rail.width); 
    6778        }; 
    6879 
     
    8091                        bar.linkButton.visible = false; 
    8192                } 
     93                stacker.rearrange(); 
    8294        }; 
    8395 
     
    170182                        bar.normalscreenButton.visible = true; 
    171183                } else { 
    172                         bar.fullscreenButton.visible = false; 
    173                         bar.normalscreenButton.visible = true; 
     184                        bar.fullscreenButton.visible = true; 
     185                        bar.normalscreenButton.visible = false; 
    174186                } 
    175187                stacker.rearrange(wid); 
     188                fixTime(); 
    176189        }; 
    177190 
     
    205218                switch(evt.data.newstate) {  
    206219                        case ModelStates.PLAYING: 
    207                                 if(view.config['controlbar'] == 'over') { 
     220                                if(view.config['controlbar'] == 'over' || bar.stage.displayState == 'fullScreen') { 
    208221                                        hiding = setTimeout(moveTimeout,1000); 
    209222                                        view.skin.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler); 
     
    214227                                break; 
    215228                        default:  
    216                                 if(view.config['controlbar'] == 'over') { 
     229                                if(view.config['controlbar'] == 'over' || bar.stage.displayState == 'fullScreen') { 
    217230                                        clearTimeout(hiding); 
    218231                                        Animations.fade(bar,1); 
     
    229242        private function timeHandler(evt:ModelEvent) { 
    230243                var dur = evt.data.duration; 
    231                 bar.elapsedText.field.text = Strings.digits(evt.data.position); 
    232                 bar.totalText.field.text = Strings.digits(evt.data.duration) 
     244                bar.elapsedText.text = Strings.digits(evt.data.position); 
     245                bar.totalText.text = Strings.digits(evt.data.duration) 
    233246                var pct = evt.data.position/evt.data.duration; 
    234                 var xps = Math.floor(pct*bar.timeSlider.rail.width); 
     247                var xps = Math.round(pct*bar.timeSlider.rail.width); 
    235248                if (dur <= 0) { 
    236249                        bar.timeSlider.icon.visible = false; 
  • trunk/as3/com/jeroenwijering/views/PlaylistView.as

    r5 r6  
    9494                        buttons[i].s.rearrange(wid); 
    9595                } 
     96                if(clr && proportion < 1) {  
     97                        clip.back.height = buttons.length*buttonheight; 
     98                } 
    9699        }; 
    97100 
     
    177180                        clip.x = clip.y = 0; 
    178181                        clip.back.width = evt.data.width; 
    179                         if(proportion > 1) { 
     182                        if(proportion > 1 || buttons == null) { 
    180183                                clip.back.height = evt.data.height; 
    181                         } else if(buttons) {  
     184                        } else { 
    182185                                clip.back.height = buttons.length*buttonheight; 
    183186                        } 
     
    227230                        } else if(itm == 'duration') { 
    228231                                if(view.playlist[idx][itm] > 0) { 
    229                                         buttons[idx].c[itm].field.text = Strings.digits(view.playlist[idx][itm]); 
     232                                        buttons[idx].c[itm].text = Strings.digits(view.playlist[idx][itm]); 
    230233                                } 
    231234                        } else { 
    232                                 buttons[idx].c[itm].field.text = view.playlist[idx][itm]; 
     235                                buttons[idx].c[itm].text = view.playlist[idx][itm]; 
    233236                        } 
    234237                } 
Note: See TracChangeset for help on using the changeset viewer.