radio/libjs/wController/player.js

125 lines
4.0 KiB
JavaScript

"use strict";
var Controller = require("./controller");
var Button = require("./button");
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);
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);
this.trigger("newElement", btn, t);
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();
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:
var cpb = new Vocabulary(address.clone());
cpb.ItemType = t;
this.views[t] = cpb;
this.addController(cpb);
this.trigger("newElement", cpb, t);
break;
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);
}
},
_h_get: function(ev) {
var data = ev.getData();
var controls = data.at("controls");
var views = data.at("views");
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);
this._addView(vc.at("type"), vc.at("address"));
}
this.initialized = true;
this.trigger("data");
},
_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);
this._addView(vc.at("type"), vc.at("address"));
}
},
_removeControl: function(type) {
//TODO
},
_removeView: function(type) {
//TODO
}
});
var ItemType = new Enum("ItemType");
ItemType.add("playPause");
ItemType.add("currentPlayback");
ItemType.add("queue");
Player.ItemType = ItemType;
module.exports = Player;