2018-09-02 19:22:28 +00:00
"use strict" ;
2018-12-02 15:07:43 +00:00
var Uint64 = require ( "../wType/uint64" ) ;
var Address = require ( "../wType/address" ) ;
2018-09-02 19:22:28 +00:00
var Controller = require ( "./controller" ) ;
var Button = require ( "./button" ) ;
2018-12-02 15:07:43 +00:00
var ImageById = require ( "./imageById" ) ;
2018-09-02 19:22:28 +00:00
var Vocabulary = require ( "./vocabulary" ) ;
var Enum = require ( "../utils/enum" ) ;
var Player = Controller . inherit ( {
className : "Player" ,
constructor : function ( addr ) {
Controller . fn . constructor . call ( this , addr ) ;
this . controls = Object . create ( null ) ;
this . views = Object . create ( null ) ;
2018-12-02 15:07:43 +00:00
this . mode = PlayerMode . straight . playback ;
2018-09-02 19:22:28 +00:00
this . addHandler ( "get" ) ;
this . addHandler ( "viewsChange" ) ;
} ,
_addControl : function ( type , address ) {
var t = type . valueOf ( ) ;
if ( this . controls [ t ] !== undefined ) {
throw new Error ( "An attempt to add multiple instances of " + ItemType . reversed [ t ] + " into Player" ) ;
}
if ( ItemType . reversed [ t ] !== undefined ) {
switch ( t ) {
case ItemType . straight . playPause :
var btn = new Button ( address . clone ( ) ) ;
btn . itemType = t ;
this . controls [ t ] = btn ;
this . addController ( btn ) ;
2018-10-28 21:32:44 +00:00
this . trigger ( "newElement" , btn , t ) ;
2018-09-02 19:22:28 +00:00
break ;
default :
this . trigger ( "serviceMessage" , "An attempt to add ItemType " + ItemType . reversed [ t ] + " to controls of the Player, but it's not qualified to be a control" ) ;
}
} else {
this . trigger ( "serviceMessage" , "An unrecgnized item ItemType in Player: " + t ) ;
}
} ,
_addView : function ( type , address ) {
var t = type . valueOf ( ) ;
2018-12-02 15:07:43 +00:00
var ctrl ;
var supported = false ;
2018-09-02 19:22:28 +00:00
if ( this . views [ t ] !== undefined ) {
throw new Error ( "An attempt to add multiple instances of " + ItemType . reversed [ t ] + " into Player" ) ;
}
if ( ItemType . reversed [ t ] !== undefined ) {
switch ( t ) {
case ItemType . straight . queue :
this . trigger ( "serviceMessage" , "Queue is not supported yet in Player" ) ;
break ;
case ItemType . straight . currentPlayback :
2018-12-02 15:07:43 +00:00
ctrl = new Vocabulary ( address . clone ( ) ) ;
ctrl . on ( "newElement" , this . _onNewPlayBackElement , this ) ;
ctrl . on ( "removeElement" , this . _onNewRemoveBackElement , this ) ;
supported = true ;
break ;
case ItemType . straight . picture :
ctrl = new ImageById ( null , address . back ( ) ) ;
ctrl . ItemType = t ;
this . views [ t ] = ctrl ;
this . trigger ( "newElement" , ctrl , t ) ;
supported = false ; //just to avoid adding with addController, since ImageById is not a controller
2018-10-28 21:32:44 +00:00
break ;
2018-09-02 19:22:28 +00:00
default :
this . trigger ( "serviceMessage" , "An attempt to add ItemType " + ItemType . reversed [ t ] + " to views of the Player, but it's not qualified to be a view" ) ;
}
} else {
this . trigger ( "serviceMessage" , "An unrecgnized item ItemType in Player: " + t ) ;
}
2018-12-02 15:07:43 +00:00
if ( supported ) {
ctrl . ItemType = t ;
this . views [ t ] = ctrl ;
this . addController ( ctrl ) ;
this . trigger ( "newElement" , ctrl , t ) ;
}
2018-09-02 19:22:28 +00:00
} ,
_h _get : function ( ev ) {
var data = ev . getData ( ) ;
var controls = data . at ( "controls" ) ;
var views = data . at ( "views" ) ;
2018-12-02 15:07:43 +00:00
var mode = data . at ( "mode" ) . valueOf ( ) ;
2018-09-02 19:22:28 +00:00
var size , i , vc ;
size = controls . length ( ) ;
for ( i = 0 ; i < size ; ++ i ) {
vc = controls . at ( i ) ;
this . _addControl ( vc . at ( "type" ) , vc . at ( "address" ) ) ;
}
size = views . length ( ) ;
for ( i = 0 ; i < size ; ++ i ) {
vc = views . at ( i ) ;
2018-10-28 21:32:44 +00:00
this . _addView ( vc . at ( "type" ) , vc . at ( "address" ) ) ;
2018-09-02 19:22:28 +00:00
}
2018-10-28 21:32:44 +00:00
2018-12-02 15:07:43 +00:00
if ( this . mode !== mode ) {
if ( PlayerMode . reversed [ mode ] === undefined ) {
throw new Error ( "Unsupported mode of player: " + mode ) ;
}
this . mode = mode ;
}
2018-10-28 21:32:44 +00:00
this . initialized = true ;
this . trigger ( "data" ) ;
2018-09-02 19:22:28 +00:00
} ,
_h _viewsChange : function ( ev ) {
var data = ev . getData ( ) ;
var add = data . at ( "add" ) ;
var remove = data . at ( "remove" ) ;
var size , i , vc ;
size = remove . length ( ) ;
for ( i = 0 ; i < size ; ++ i ) {
this . _removeView ( remove . at ( i ) ) ;
}
size = add . length ( ) ;
for ( i = 0 ; i < size ; ++ i ) {
vc = add . at ( i ) ;
2018-10-28 21:32:44 +00:00
this . _addView ( vc . at ( "type" ) , vc . at ( "address" ) ) ;
2018-09-02 19:22:28 +00:00
}
} ,
2018-12-02 15:07:43 +00:00
_onNewPlayBackElement : function ( key , element ) {
switch ( key ) {
case "image" :
var address = new Address ( [ "images" , element . toString ( ) ] ) ;
this . _addView ( new Uint64 ( ItemType . straight . picture ) , address ) ;
address . destructor ( ) ;
break ;
}
} ,
_onNewRemoveBackElement : function ( key ) {
switch ( key ) {
case "image" :
this . _removeView ( new Uint64 ( ItemType . straight . picture ) ) ;
break ;
}
} ,
2018-09-02 19:22:28 +00:00
_removeControl : function ( type ) {
//TODO
} ,
_removeView : function ( type ) {
//TODO
}
} ) ;
var ItemType = new Enum ( "ItemType" ) ;
ItemType . add ( "playPause" ) ;
ItemType . add ( "currentPlayback" ) ;
ItemType . add ( "queue" ) ;
2018-12-02 15:07:43 +00:00
ItemType . add ( "picture" ) ;
var PlayerMode = new Enum ( "PlayerMode" ) ;
PlayerMode . add ( "playback" ) ;
2018-09-02 19:22:28 +00:00
Player . ItemType = ItemType ;
module . exports = Player ;