gui/gwlib.js (3,016 lines of code) (raw):
/////////////////////////////////////////////////////////////////////////////////
//
// Authors:
// Jean Le Feuvre, Telecom ParisTech
//
/////////////////////////////////////////////////////////////////////////////////
/*log function*/
function gwlog(lev, str) {
alert(lev, str);
}
/*log levels*/
l_err = 1;
l_war = 2;
l_inf = 3;
l_deb = 4;
/*default log level*/
gw_log_level = l_inf;
function gw_new_timer(progressive) {
var obj = new SFNode('TimeSensor');
obj.set_timeout = function (time, loop) {
this.cycleInterval = time ? time : 1;
this.loop = loop;
}
this.startTime = -1;
obj.start = function (when) {
if (arguments.length==0) this.startTime = this.getTime();
else this.startTime = when + this.getTime();
}
obj.stop = function (when) {
if (arguments.length==0) this.stopTime = this.getTime();
else this.stopTime = when + this.getTime();
}
obj.on_event = function (val) { };
obj._event = function (val) {
this.on_event(Math.floor(val / this.cycleInterval));
}
Browser.addRoute(obj, 'cycleTime', obj, obj._event);
if (progressive) {
obj.on_fraction = function (val) { }
obj._fraction = function (frac) {
this.on_fraction(frac);
}
Browser.addRoute(obj, 'fraction_changed', obj, obj._fraction);
}
obj.on_active = function (val) { }
obj._active = function (val) {
this.on_active(val);
}
Browser.addRoute(obj, 'isActive', obj, obj._active);
return obj;
}
//static
function setup_gw_object(obj, name) {
obj._name = name;
obj.set_color = function () { }
obj.set_size = function (width, height) {
this.width = width;
this.height = height;
}
obj.hide = function () {
this.scale.x = this.scale.y = 0;
this.visible = false;
if (arguments.length == 1) {
arguments[0].apply(this);
}
}
obj.show = function () { this.scale.x = this.scale.y = 1; this.visible = true; }
obj.visible = true;
obj.set_size = function (width, height) {
this.width = width;
this.height = height;
}
obj.move = function (x, y) {
this.translation.x = x;
this.translation.y = y;
}
obj.width = obj.height = 0;
obj.close = function () {
if (typeof this._pre_destroy != 'undefined') this._pre_destroy();
gw_detach_child(this);
};
}
function gw_object_set_dragable(obj) {
if (typeof (obj.on_drag) != 'undefined') return;
var ps2d = new SFNode('PlaneSensor2D');
obj._ps2d_idx = obj.children.length;
obj.children[obj.children.length] = ps2d;
ps2d.maxPosition.x = ps2d.maxPosition.y = -1;
ps2d.autoOffset = FALSE;
obj._drag = false;
obj.begin_drag = null;
obj.end_drag = null;
obj._drag_active = function (val) {
if (val) {
this.startx = this.translation.x;
this.starty = this.translation.y;
if (this.begin_drag) this.begin_drag();
} else {
if (this.end_drag) this.end_drag();
}
}
obj.on_drag = null;
obj._on_drag = function (val) {
if (this.on_drag) {
this.on_drag(this.startx + val.x, this.starty + val.y);
} else {
this.translation.x = this.startx + val.x;
this.translation.y = this.starty + val.y;
}
if (!this._drag && (val.x || val.y)) this._drag = true;
}
Browser.addRoute(ps2d, 'isActive', obj, obj._drag_active);
Browser.addRoute(ps2d, 'translation_changed', obj, obj._on_drag);
}
//static
function gw_object_set_hitable(obj) {
if (typeof (obj._active) != 'undefined') return;
var ts = new SFNode('TouchSensor');
obj._ts_idx = obj.children.length;
obj.children[obj.children.length] = ts;
obj._drag = false;
obj._over = false;
obj.on_over = null;
obj._on_over = function (val) {
this._over = val;
gw_reset_hit(this, val);
if (this.on_over) this.on_over(val);
}
obj.last_click = 0;
obj._nb_click = 0;
obj.on_long_click = null;
obj.on_click = null;
obj.on_down = null;
obj._on_active = function (val, timestamp) {
if (!this._over) return;
if (this.on_down) this.on_down(val);
if (!val) {
if (this._drag) {
this._drag = false;
return;
}
if (this.on_long_click && (timestamp - this.last_click > gwskin.long_click_delay)) this.on_long_click();
else if (this.on_click && this._over) this.on_click();
} else {
this.last_click = timestamp;
}
}
Browser.addRoute(ts, 'isOver', obj, obj._on_over);
Browser.addRoute(ts, 'isActive', obj, obj._on_active);
obj._disable_touch = function () {
this.children[this._ts_idx].enabled = false;
}
obj._enable_touch = function () {
this.children[this._ts_idx].enabled = true;
}
obj.new_over_handler = function(callback) {
Browser.addRoute(this.children[this._ts_idx], 'isOver', this, callback);
}
}
//static
function gw_new_appearance(r, g, b) {
var appearance = new SFNode('Appearance');
appearance.material = new SFNode('Material2D');
appearance.material.filled = TRUE;
appearance.material.emissiveColor = new SFColor(r, g, b);
return appearance;
}
//static
function gw_new_lineprops(red, green, blue) {
var lineProps = new SFNode('LineProperties');
lineProps.lineColor.r = red;
lineProps.lineColor.g = green;
lineProps.lineColor.b = blue;
return lineProps;
}
//static
function gw_make_gradient(type, keys, colors, opacities) {
var i;
var obj = new SFNode(type == 'radial' ? 'RadialGradient' : 'LinearGradient');
for (i = 0; i < keys.length; i++) {
obj.key[i] = keys[i];
}
for (i = 0; i < colors.length / 3; i++) {
obj.keyValue[i] = new SFColor(colors[3 * i], colors[3 * i + 1], colors[3 * i + 2]);
if (arguments.length == 4) {
obj.opacity[i] = opacities[i];
}
}
if (type == 'vertical') {
obj.endPoint.x = 0;
obj.endPoint.y = 1;
}
return obj;
}
//static
function gw_new_fontstyle(size, align) {
var fs = new SFNode('FontStyle');
fs.size = size;
fs.family[0] = gwskin.default_font_family;
switch (align) {
case 0:
fs.justify[0] = 'BEGIN';
break;
case 1:
fs.justify[0] = 'MIDDLE';
break;
case 2:
fs.justify[0] = 'END';
break;
default:
fs.justify[0] = 'MIDDLE';
break;
}
fs.justify[1] = 'MIDDLE';
return fs;
}
gw_resources_bank = [];
//static
function gw_load_resource(url, is_icon) {
var new_res;
if (gwskin.use_resource_bank) {
for (var i in gw_resources_bank) {
if (gw_resources_bank[i].res_url == url) {
gw_resources_bank[i].nb_instances++;
return gw_resources_bank[i];
}
}
}
if (is_icon) {
new_res = new SFNode('StyleGroup');
new_res.children[0] = new SFNode('Inline');
new_res.children[0].url[0] = url;
new_res.set_style = function (app) {
this.appearance = app;
};
new_res.set_style(gwskin.styles[0].normal);
} else {
// new_res = new SFNode('OffscreenGroup');
// new_res.offscreen_mode = 2;
// new_res.children[0] = new SFNode('Inline');
// new_res.children[0].url[0] = url;
new_res = new SFNode('Inline');
new_res.url[0] = url;
new_res.set_style = function () { };
}
new_res.nb_instances = 1;
if (gwskin.use_resource_bank) {
new_res.res_url = url;
gw_resources_bank.push(new_res);
}
return new_res;
}
//static
function gw_unload_resource(res) {
if (!gwskin.use_resource_bank) return;
if (!res.nb_instances) return;
res.nb_instances--;
if (res.nb_instances) return;
for (var i in gw_resources_bank) {
if (gw_resources_bank[i] == res) {
gw_resources_bank.splice(i, 1);
return;
}
}
gwlog(l_err, 'Unloading resource for url ' + res.children[0].url[0] + ' not found in resource bank');
}
//static
function gw_appy_effect_scale(timer, val) {
if (!timer.wnd.visible) {
timer.wnd.scale.x = 1 - val;
timer.wnd.scale.y = 1 - val;
timer.wnd.set_alpha((1 - val) * timer.target_alpha);
} else {
timer.wnd.scale.x = val;
timer.wnd.scale.y = val;
timer.wnd.set_alpha(val * timer.target_alpha);
}
}
//static
function gw_appy_effect_notif(timer, val) {
var final_x = gw_display_width / 2 - timer.wnd.width / 2;
var final_y = gw_display_height / 2 - timer.wnd.height/2;
if (!timer.wnd.visible) {
timer.wnd.translation.x = final_x;
timer.wnd.translation.y = final_y + val * timer.wnd.height;
timer.wnd.set_alpha((1 - val) * timer.target_alpha);
} else {
timer.wnd.translation.x = final_x;
timer.wnd.translation.y = final_y + (1-val) * timer.wnd.height;
timer.wnd.set_alpha(val * timer.target_alpha);
}
}
//static
function gw_window_show_hide() {
if (typeof this._wnd_timer == 'undefined') {
this._wnd_timer = gw_new_timer(1);
this._wnd_timer.wnd = null;
this._wnd_timer.effect = 0;
this._wnd_timer.set_timeout(0.25, false);
this._wnd_timer.on_fraction = function (val) {
if (!this.wnd) return;
switch (this.effect) {
case 0:
gw_appy_effect_scale(this, val);
break;
case 1:
gw_appy_effect_notif(this, val);
break;
}
}
this._wnd_timer.on_active = function (val) {
var fun;
if (val || !this.wnd) return;
var wnd = this.wnd;
this.wnd = null;
wnd.scale.x = wnd.visible ? 1 : 0;
wnd.scale.y = wnd.visible ? 1 : 0;
wnd.set_alpha(this.target_alpha);
if (wnd.visible) {
gw_ui_root.set_focus(wnd);
} else {
gw_ui_root.remove_focus(wnd);
}
fun = this.call_on_end;
this.call_on_end = null;
if (fun) {
fun.apply(wnd);
}
}
}
/*not done yet! This can happen when the function is called faster than the animation duration*/
if (this._wnd_timer.wnd) return;
this.visible = !this.visible;
this.set_alpha(1.0);
if (this.visible) {
this._wnd_timer.target_alpha = this.get_alpha();
this._wnd_timer.target_x = this.translation.x;
this._wnd_timer.target_y = this.translation.y;
this._wnd_timer.target_w = this.width;
this._wnd_timer.target_h = this.height;
}
if (typeof this.show_effect == 'string') {
if (this.show_effect == 'notif') this._wnd_timer.effect = 1;
}
this._wnd_timer.wnd = this;
this._wnd_timer.start(0);
this._wnd_timer.call_on_end = null;
if (arguments.length) {
this._wnd_timer.call_on_end = arguments[0];
}
}
//static
function gw_window_show() {
if (this.visible) return;
gw_window_show_hide.call(this);
}
//static
function gw_window_hide() {
if (!this.visible) return;
gw_window_show_hide.apply(this, arguments);
}
//Skin definition
var gwskin = new Object();
gwskin.back_color = new SFColor(0.2, 0.2, 0.2);
gwskin.pointing_device = true;
gwskin.long_click_delay = 0.5;
gwskin.use_resource_bank = false;
gwskin.default_window_alpha = 0.8;
gwskin.default_message_timeout = 3.0;
gwskin.default_tooltip_timeout = 0.75;
gwskin.default_tooltip_delay = 1;
gwskin.appearance_transparent = gw_new_appearance(0, 0, 0);
gwskin.appearance_transparent.material.transparency = 1;
gwskin.appearance_transparent.skin = true;
gwskin.no_gl_window_back = new SFNode('Background2D')
gwskin.no_gl_window_back.backColor = new SFColor(0, 0, 0);
//static
function gw_get_abs_pos(child) {
var pos = new SFVec2f(0, 0);
while (child != null) {
if (typeof (child.translation) != 'undefined') {
pos.x += child.translation.x;
pos.y += child.translation.y;
}
if (typeof (child.parent) == 'undefined') break;
if (typeof (child._is_window) == 'boolean') break;
child = child.parent;
}
return pos;
}
function gw_get_adjusted_abs_pos(child, width, height, type)
{
var pos = gw_get_abs_pos(child);
if (type == 0) {
pos.y += child.height/2 + height/2;
} else if (type==1) {
pos.y -= child.height/2 + height/2;
}
if (pos.x - width / 2 < - gw_display_width / 2)
pos.x = - gw_display_width / 2 + width / 2;
else if (pos.x + width / 2 > gw_display_width / 2)
pos.x = gw_display_width / 2 - width / 2;
if (pos.y + height/2 > gw_display_height / 2) {
if (type == 0) {
pos.y -= child.height + height;
} else {
pos.y = gw_display_height / 2 - height/2;
}
}
else if (pos.y - height/2 < -gw_display_height / 2) {
if (type==1) {
pos.y += child.height + height;
} else {
pos.y = height/2 - gw_display_height / 2;
}
}
return pos;
}
gwskin.tooltip_wnd = null;
gwskin.tooltip_timeout = gw_new_timer(false);
gwskin.tooltip_exec = function (obj, show) {
if (!show) return;
if (!gwskin.tooltip_wnd) {
wnd = gw_new_window(null, true, true, 'tooltip', true);
wnd.label = '';
gwskin.tooltip_wnd = wnd;
wnd.txt = gw_new_text(gwskin.tooltip_wnd, '');
wnd.on_display_size = function (w, h) {
if (! this.label) return;
width = this.label.length * gwskin.default_text_font_size;
this.set_size(width, 2 * gwskin.default_text_font_size);
this.txt.set_width(width);
this.move(-w / 2 + width / 2, h / 2 - gwskin.default_text_font_size);
}
wnd.on_close = function () {
this.timer = null;
gwskin.tooltip_wnd = null;
}
wnd.on_display_size(gw_display_width, gw_display_height);
wnd.set_alpha(0.9);
wnd.show();
wnd.timer = gw_new_timer(false);
wnd.timer.set_timeout(gwskin.default_tooltip_timeout, false);
wnd.timer.start(0);
wnd.timer.on_active = function (val) {
if (!val) gwskin.tooltip_wnd.close();
}
}
gwskin.tooltip_wnd.label = obj.get_label();
gwskin.tooltip_wnd.txt.set_label(gwskin.tooltip_wnd.label);
gwskin.tooltip_wnd.on_display_size(gw_display_width, gw_display_height);
var tt = gwskin.tooltip_wnd;
var dy = 1.2 * tt.height;
var pos = gw_get_adjusted_abs_pos(obj, tt.width, 1.2 * tt.height, 0);
tt.move(pos.x, pos.y);
}
gwskin.tooltip_callback = function (obj, show) {
if (!show) {
gwskin.tooltip_timeout.obj = null;
gwskin.tooltip_timeout.stop(0);
return;
}
gwskin.tooltip_timeout.set_timeout(gwskin.default_tooltip_delay, false);
gwskin.tooltip_timeout.obj = obj;
gwskin.tooltip_timeout.on_active = function (val) {
if (!val && gwskin.tooltip_timeout.obj) {
gwskin.tooltip_exec(gwskin.tooltip_timeout.obj, true);
}
}
gwskin.tooltip_timeout.start(0);
}
gwskin.default_label_font_size = 18;
gwskin.default_text_font_size = 18;
gwskin.default_font_family = 'SANS';
gwskin.default_icon_text_spacing = 8;
gwskin.default_control_height = 64;
gwskin.default_icon_height = 48;
//create styles
gwskin.styles = [];
var s = { name: 'default' };
gwskin.styles.push(s);
s.normal = gw_new_appearance(0.4, 0.6, 1);
s.normal.texture = gw_make_gradient('vertical', [0, 1], [0.0, 0.2, 0.4, 0.0, 0.4, 0.6]);
s.normal.skin = true;
if (gwskin.pointing_device) {
s.over = gw_new_appearance(0.0, 1.0, 1);
s.over.texture = gw_make_gradient('vertical', [0, 1], [0.0, 0.2, 0.4, 0.0, 0.8, 1]);
s.over.skin = true;
} else {
s.over = null;
}
s.down = gw_new_appearance(0, 0, 1);
s.down.texture = gw_make_gradient('vertical', [0, 1], [0.0, 0.2, 0.4, 0.0, 1, 1]);
s.down.skin = true;
s.disable = gw_new_appearance(0.4, 0.4, 0.4);
s.disable.skin = true;
s.text = gw_new_appearance(1, 1, 1);
s.text.skin = true;
s.font = gw_new_fontstyle(gwskin.default_label_font_size, 1);
s.font.skin = true;
//overrite style for button to have its own text color
var s = { name: 'button' };
gwskin.styles.push(s);
s.text = gw_new_appearance(1, 1, 1);
s.text.skin = true;
//override style for checkbox to have text alignment to 'begin'
s = { name: 'checkbox' };
gwskin.styles.push(s);
s.font = gw_new_fontstyle(gwskin.default_label_font_size, 0);
s.font.skin = true;
s.over = gw_new_appearance(0.0, 1.0, 1);
s.over.texture = gw_make_gradient('vertical', [0, 1], [0.0, 0.2, 0.4, 0.0, 0.8, 1]);
s.over.material.lineProps = gw_new_lineprops(0.0, 0.8, 1);
s.over.skin = true;
//override style for icon to have no text not fonts
s = { name: 'icon' };
gwskin.styles.push(s);
s.text = null;
s.font = null;
s = { name: 'root_icon' };
gwskin.styles.push(s);
s.text = gw_new_appearance(1, 1, 1);
s.text.skin = true;
//override listitems to have text alignment to 'begin'
s = { name: 'listitem' };
gwskin.styles.push(s);
s.font = gw_new_fontstyle(gwskin.default_label_font_size, 0);
s.font.skin = true;
s = { name: 'edit' };
gwskin.styles.push(s);
s.normal = gw_new_appearance(1, 1, 1);
s.normal.texture = gw_make_gradient('vertical', [0, 1], [0.0, 0.2, 0.4, 0.0, 0.8, 1]);
s.over = gw_new_appearance(1, 1, 1);
s.over.texture = gw_make_gradient('vertical', [0, 1], [0.0, 0.2, 0.4, 0.0, 0.8, 1]);
s.over.material.lineProps = gw_new_lineprops(0.0, 0.8, 1);
s.text = gw_new_appearance(0, 0, 0);
s.text.skin = true;
s.font = gw_new_fontstyle(gwskin.default_text_font_size, 0);
s.font.style += ' SIMPLE_EDIT';
s.font.skin = true;
s = { name: 'window' };
gwskin.styles.push(s);
s.normal = gw_new_appearance(0.6, 0.6, 0.6);
s.normal.texture = gw_make_gradient('vertical', [0, 0.1, 0.9, 1], [0.6, 0.6, 0.6, 0, 0, 0, 0, 0, 0, 0.6, 0.6, 0.6]);
s.normal.skin = true;
//override font to have middle alignment
s.font = gw_new_fontstyle(gwskin.default_label_font_size, 1);
s.font.skin = true;
s.hide = gw_window_hide;
s.show = gw_window_show;
tt_s = { name: 'tooltip' };
gwskin.styles.push(tt_s);
tt_s.normal = gw_new_appearance(0.6, 0.6, 0.6);
tt_s.normal.texture = s.normal.texture;
//tt_s.normal.material.lineProps = gw_new_lineprops(0, 0, 0);
//tt_s.normal.material.lineProps.width = 0.5;
tt_s.font = s.font;
//tt_s.hide = gw_window_hide;
//tt_s.show = gw_window_show;
s = { name: 'progress' };
gwskin.styles.push(s);
s.normal = gw_new_appearance(0.6, 0.6, 0.6);
s.normal.texture = gw_make_gradient('vertical', [0, 0.5, 1], [0.0, 0.4, 0.6, 0, 0, 0, 0.0, 0.4, 0.6]);
s.normal.skin = true;
s.over = gw_new_appearance(0.7, 0.7, 0.8);
s.over.texture = gw_make_gradient('vertical', [0, 0.5, 1], [0.0, 1, 1, 0, 0.2, 0.4, 0.0, 1, 1]);
s.over.skin = true;
s.down = gw_new_appearance(0.7, 0.7, 0.8);
s.down.texture = gw_make_gradient('vertical', [0, 0.5, 1], [0.8, 1, 1, 0, 0.4, 0.6, 0.8, 1, 1]);
s.down.skin = true;
//for gauge
s.text = gw_new_appearance(1, 1, 1);
s.text.skin = true;
s.font = gw_new_fontstyle(gwskin.default_label_font_size, 0);
s.font.skin = true;
s = { name: 'plot' };
gwskin.styles.push(s);
s.normal = gw_new_appearance(0.9, 0.9, 0.9);
s.normal.skin = true;
s.text = gw_new_appearance(0, 0, 0);
s.text.skin = true;
s.font = gw_new_fontstyle(gwskin.default_text_font_size, 0);
s.font.skin = true;
s = { name: 'text' };
gwskin.styles.push(s);
s.font = gw_new_fontstyle(gwskin.default_text_font_size, 0);
s.font.justify[1] = 'END';
s.font.skin = true;
s = { name: 'lefttext' };
gwskin.styles.push(s);
s.font = gw_new_fontstyle(gwskin.default_text_font_size, 0);
s.font.skin = true;
s = { name: 'righttext' };
gwskin.styles.push(s);
s.font = gw_new_fontstyle(gwskin.default_text_font_size, 0);
s.font.skin = true;
gwskin.images = new Object();
gwskin.labels = new Object();
gwskin.images.trash = 'icons/trash.svg';
gwskin.labels.trash = 'Delete';
gwskin.images.add = 'icons/add.svg';
gwskin.labels.add = 'Add';
gwskin.images.remove = 'icons/remove.svg';
gwskin.labels.remove = 'Remove';
gwskin.images.remote_display = 'icons/monitor.svg';
gwskin.labels.remote_display = 'Push to remote device';
gwskin.images.information = 'icons/info.svg';
gwskin.labels.information = 'Information';
gwskin.images.resize = 'icons/resize.svg';
gwskin.labels.resize = 'Resize';
gwskin.images.cancel = 'icons/cross.svg';
gwskin.labels.cancel = 'Cancel';
gwskin.images.close = 'icons/cross.svg';
gwskin.labels.close = 'Close';
gwskin.images.previous = 'icons/previous.svg';
gwskin.labels.previous = 'Previous';
gwskin.images.next = 'icons/next.svg';
gwskin.labels.next = 'Next';
gwskin.images.left = 'icons/left.svg';
gwskin.labels.left = 'Left';
gwskin.images.right = 'icons/right.svg';
gwskin.labels.right = 'Right';
gwskin.images.up = 'icons/up.svg';
gwskin.labels.up = 'Up';
gwskin.images.down = 'icons/down.svg';
gwskin.labels.down = 'Down';
gwskin.images.scan_directory = 'icons/overflowing.svg';
gwskin.labels.scan_directory = 'Select directory';
gwskin.images.history = 'icons/overflowing.svg';
gwskin.labels.history = 'History';
gwskin.images.media_next = 'icons/media_next.svg';
gwskin.labels.media_next = 'Next Item';
gwskin.images.media_prev = 'icons/media_prev.svg';
gwskin.labels.media_prev = 'Previous Clip';
gwskin.images.seek_forward = 'icons/seek_forward.svg';
gwskin.labels.seek_forward = 'Fast Forward';
gwskin.images.rewind = 'icons/rewind.svg';
gwskin.labels.rewind = 'Rewind';
gwskin.images.folder = 'icons/folder.svg';
gwskin.labels.folder = 'Directory';
gwskin.images.check = 'icons/check.svg';
gwskin.labels.check = 'Check';
gwskin.images.drive = 'icons/harddrive.svg';
gwskin.labels.drive = 'Storage Drive';
gwskin.images.device = 'icons/laptop.svg';
gwskin.labels.device = 'Device';
gwskin.images.home = 'icons/home.svg';
gwskin.labels.home = 'Home';
gwskin.images.osmo = 'icons/osmo.svg';
gwskin.labels.osmo = 'Home';
gwskin.images.media = 'icons/more.svg';
gwskin.labels.media = 'Media';
gwskin.images.favorite = 'icons/heart.svg';
gwskin.labels.favorite = 'Favorites';
gwskin.images.audio = 'icons/audio.svg';
gwskin.labels.audio = 'Audio On';
gwskin.images.audio_mute = 'icons/audio_mute.svg';
gwskin.labels.audio_mute = 'Audio Mute';
gwskin.images.play = 'icons/play.svg';
gwskin.labels.play = 'Play';
gwskin.images.pause = 'icons/pause.svg';
gwskin.labels.pause = 'Pause';
gwskin.images.stop = 'icons/stop2.svg';
gwskin.labels.stop = 'Stop';
gwskin.images.fullscreen = 'icons/expand.svg';
gwskin.labels.fullscreen = 'Fullscreen';
gwskin.images.fullscreen_back = 'icons/shrink.svg';
gwskin.labels.fullscreen_back = 'Exit Fullscreen';
gwskin.images.play_once = 'icons/play_single.svg';
gwskin.labels.play_once = 'Play once';
gwskin.images.play_loop = 'icons/play_loop.svg';
gwskin.labels.play_loop = 'Loop';
gwskin.images.play_shuffle = 'icons/play_shuffle.svg';
gwskin.labels.play_shuffle = 'Shuffle';
gwskin.images.navigation = 'icons/navigation.svg';
gwskin.labels.navigation = 'Navigation';
gwskin.images.network = 'icons/network.svg';
gwskin.labels.network = 'Network';
gwskin.images.file_open = 'icons/tray.svg';
gwskin.labels.file_open = 'Open';
gwskin.images.exit = 'icons/power.svg';
gwskin.labels.exit = 'Exit';
gwskin.images.remote_location = 'icons/world.svg';
gwskin.labels.remote_location = 'Enter URL';
gwskin.images.statistics = 'icons/speed.svg';
gwskin.labels.statistics = 'Statistics';
gwskin.images.live = 'icons/live.svg';
gwskin.labels.live = 'Back to live';
gwskin.images.sort = 'icons/sort.svg';
gwskin.labels.sort = 'Sort';
gwskin.images.playlist = 'icons/list.svg';
gwskin.labels.playlist = 'Playlist';
gwskin.images.playlist_next = 'icons/pl_next.svg';
gwskin.labels.playlist_next = 'Next';
gwskin.images.playlist_prev = 'icons/pl_prev.svg';
gwskin.labels.playlist_prev = 'Previous';
gwskin.images.channels = 'icons/tv.svg';
gwskin.labels.channels = 'TV Channels';
gwskin.mime_video_default_ext = " mp4 mp4s m4s 3gp 3gpp m2ts ts trp m3u8 mpd avi mov ";
gwskin.mime_audio_default_ext = " m4a mp3 aac wav ";
gwskin.mime_image_default_ext = " jpg jpeg png ";
gwskin.mime_model_default_ext = " bt xmt svg ";
gwskin.images.mime_video = 'icons/film.svg';
gwskin.images.mime_audio = 'icons/musical.svg';
gwskin.images.mime_model = 'icons/app.svg';
gwskin.images.mime_generic = 'icons/file.svg';
gwskin.images.mime_image = 'icons/image.svg';
gwskin.keys = new Object();
gwskin.keys.close = 'U+0008';
gwskin.keys.validate = 'Enter';
gwskin.last_hitable_obj = null;
//static
function gwskin_set_white_blue()
{
var s = gwskin.get_class('default');
//s.normal.texture.keyValue = [0.0, 0.2, 0.4, 0.0, 0.4, 0.6];
//if (s.over && s.over.texture) s.over.texture.keyValue = [0.0, 0.2, 0.4, 0.0, 0.8, 1];
//s.down.texture.keyValue = [0.0, 0.2, 0.4, 0.0, 1, 1];
s.text.material.emissiveColor = new SFColor(0, 0, 0);
//override style for checkbox to have text alignment to 'begin'
s = gwskin.get_class('checkbox');
// s.over.texture.keyValue = [0.0, 0.2, 0.4, 0.0, 0.8, 1];
s = gwskin.get_class('edit');
// s.normal.texture.keyValue = [0.0, 0.2, 0.4, 0.0, 0.8, 1];
// s.over.texture.keyValue = [0.0, 0.2, 0.4, 0.0, 0.8, 1];
s.over.material.lineProps.lineColor = new SFColor(0.0, 0.8, 1);
s.text.material.emissiveColor = new SFColor(0, 0, 0);
s = gwskin.get_class('window');
s.normal.material.emissiveColor = new SFColor(1, 1, 1);
gwskin.no_gl_window_back.backColor = new SFColor(1, 1, 1);
// s.normal.texture.keyValue = [0.6, 0.6, 0.6, 0, 0, 0, 0, 0, 0, 0.6, 0.6, 0.6];
if (s.normal.texture) {
s.normal.texture.keyValue[1] = new SFColor(1, 1, 1);
s.normal.texture.keyValue[2] = new SFColor(1, 1, 1);
}
s = gwskin.get_class('progress');
// s.normal.texture.keyValue = [0.0, 0.4, 0.6, 0, 0, 0, 0.0, 0.4, 0.6];
// s.normal.texture.keyValue[1] = new SFColor(1, 1, 1);
// s.over.texture.keyValue = [0.0, 1, 1, 0, 0.2, 0.4, 0.0, 1, 1];
// s.over.texture.keyValue[1] = new SFColor(0.4, 0.8, 1);
// s.down.texture.keyValue = [0.0, 0.4, 0.6, 0, 0.2, 0.4, 0.0, 0.4, 0.6];
// s.down.texture.keyValue[1] = new SFColor(0.4, 0.8, 1);
s.text.material.emissiveColor = new SFColor(1, 1, 1);
s = gwskin.get_class('root_icon');
s.text.material.emissiveColor = new SFColor(1, 1, 1);
}
function gwskin_set_default_control_height(value) {
gwskin.default_control_height = value;
}
function gwskin_set_default_icon_height(value) {
gwskin.default_icon_height = value;
var fsize = 1;
if (value>50) fsize = 32;
else if (value>30) fsize = 22;
else if (value > 10) fsize = value - 10;
gwskin.default_label_font_size = fsize;
gwskin.default_text_font_size = fsize;
for (var i = 0; i < gwskin.styles.length; i++) {
if ((typeof gwskin.styles[i].font != 'undefined') && gwskin.styles[i].font) {
gwskin.styles[i].font.size = fsize;
}
}
}
//static
function gwlib_filter_event(evt) {
if (gw_ui_root.has_popup && (evt.type == GF_EVENT_MOUSEDOWN)) {
//close all open popups
var count = gw_ui_root.children.length;
for (var i = count; i > 0; i--) {
var c = gw_ui_root.children[i - 1];
if (typeof c._popup != 'undefined') {
c.close();
if (count>gw_ui_root.children.length) i--;
}
}
gw_ui_root.has_popup = false;
}
if (gw_ui_top_wnd && gw_ui_top_wnd.on_event(evt)) return true;
/*
if ((evt.type == GF_EVENT_KEYDOWN) && ((evt.keycode == 'Up') || (evt.keycode == 'Down') || (evt.keycode == 'Right') || (evt.keycode == 'Left')))
return false;
*/
for (var i = 0; i < gw_event_filters.length; i++) {
if (gw_event_filters[i](evt) == true) return true;
}
return false;
}
function gwlib_init(root_node) {
gw_ui_root = gw_new_container();
gw_ui_root._name = 'Root Display';
gw_ui_root.has_popup = false;
gw_add_child(root_node, gw_ui_root);
gw_ui_root.set_focus = function(wnd) {
gw_ui_top_wnd = null;
if (typeof wnd.on_event != 'undefined') {
gw_ui_top_wnd = wnd;
}
if (typeof (wnd._no_focus) == 'boolean') return;
gpac.set_focus(gw_ui_top_wnd);
}
gw_ui_root.remove_focus = function(wnd) {
gw_ui_top_wnd = null;
for (var i = this.children.length; i > 0; i--) {
var c = this.children[i - 1];
if (c == wnd) continue;
if (!c.visible) continue;
if (typeof c.on_event != 'undefined') {
gw_ui_top_wnd = c;
break;
}
}
if (typeof (wnd._no_focus) == 'boolean') return;
gpac.set_focus(gw_ui_top_wnd);
}
gw_ui_root.add_child = function (child) {
this.children[this.children.length] = child;
this.set_focus(child);
}
gw_ui_root.remove_child = function (child) {
this.remove_focus(child);
this.removeChildren[0] = child;
}
gw_ui_top_wnd = null;
gw_event_filters = [];
gpac.set_event_filter(gwlib_filter_event);
gwskin.has_opengl = (gpac.get_option('Compositor', 'OpenGLMode') != 'disable') ? true : false;
gwskin.browser_mode = (gpac.get_option('Temp', 'BrowserMode') == 'yes') ? true : false;
gpac.focus_highlight = false;
gwskin.disable_transparency = false;
//remove window gradients
if (!gwskin.has_opengl && !gpac.hardware_rgba) {
s = gwskin.get_style('window', 'normal');
s.texture = null;
gwskin.disable_transparency = true;
gwskin.default_window_alpha = 1;
}
var device = gpac.get_option('General', 'DeviceType');
if ((device == 'iOS') || (device == 'Android')) gwskin.mobile_device = true;
else gwskin.mobile_device = false;
if (gwskin.mobile_device) {
var size = gw_display_width;
if (size> gw_display_height) size = gw_display_height;
gwskin_set_default_control_height(size/3);
gwskin_set_default_icon_height(size/3);
}
gwskin_set_white_blue();
gwskin._to_string = function (obj) {
var res = '';
if (obj instanceof Array) {
res = '[';
for (var i = 0; i < obj.length; i++) {
if (i) res += ', ';
res += gwskin._to_string(obj[i]);
}
res += ']';
} else {
var first = true;
res = '{';
for (var prop in obj) {
if (!first) res += ', ';
res += '' + prop;
res += ': ';
if (typeof obj[prop] == 'string') {
res += '"';
res += obj[prop];
res += '"';
} else if (typeof obj[prop] == 'function') {
} else if (typeof obj[prop] == 'object') {
res += gwskin._to_string(obj[prop]);
} else {
res += obj[prop];
}
first = false;
}
res += '}';
}
return res;
}
gwskin.stringify = function (obj) {
return this._to_string(obj);
}
gwskin.parse = function (serial_obj) {
if (serial_obj.charAt(0) != '(') {
return eval('(' + serial_obj + ')' );
}
return eval(serial_obj);
}
}
function gwlib_add_event_filter(evt_filter) {
if ((arguments.length==2) && (arguments[1]==true)) {
gw_event_filters.unshift(evt_filter);
} else {
gw_event_filters.push(evt_filter);
}
}
function gwlib_remove_event_filter(evt_filter) {
var idx = gw_event_filters.indexOf(evt_filter);
if (idx > -1) gw_event_filters.splice(idx, 1);
}
function gwlib_notify_display_size(width, height) {
for (var i = 0; i < gw_ui_root.children.length; i++) {
if (typeof gw_ui_root.children[i].on_display_size != 'undefined') {
gw_ui_root.children[i].on_display_size(width, height);
}
}
}
function gwlib_refresh_layout() {
for (var i = 0; i < gw_ui_root.children.length; i++) {
if (typeof gw_ui_root.children[i].layout != 'undefined') {
gw_ui_root.children[i].layout(gw_ui_root.children[i].width, gw_ui_root.children[i].height);
}
}
}
//static
function gw_reset_hit(obj, is_over) {
if (is_over) {
if (gwskin.last_hitable_obj && (gwskin.last_hitable_obj != obj)) {
//reset isOver value of previous touch sensor
if (typeof (gwskin.last_hitable_obj._ts_idx) != 'undefined') {
gwskin.last_hitable_obj.children[gwskin.last_hitable_obj._ts_idx].isOver = false;
}
gwskin.last_hitable_obj._on_over(false);
}
gwskin.last_hitable_obj = obj;
} else if (gwskin.last_hitable_obj == obj) {
gwskin.last_hitable_obj = null;
}
}
//static
function gw_add_child(container, child) {
if (container == null) container = gw_ui_root;
if (typeof (container.add_child) != 'undefined') {
container.add_child(child);
} else {
container.children[container.children.length] = child;
}
child.parent = container;
}
//static
function gw_detach_child(child) {
/*detach all default routes*/
Browser.deleteRoute(child, 'ALL', null, null);
if (typeof (child._ps2d_idx) != 'undefined') {
Browser.deleteRoute(child.children[child._ps2d_idx], 'ALL', null, null);
}
if (typeof (child._ts_idx) != 'undefined') {
Browser.deleteRoute(child.children[child._ts_idx], 'ALL', null, null);
}
if (typeof (child.dlg) != 'undefined') child.dlg = null;
if (typeof (child.parent) == 'undefined') return;
var p = child.parent;
child.parent = null;
if (typeof (p.remove_child) != 'undefined') {
p.remove_child(child);
} else {
p.removeChildren[0] = child;
}
if (gwskin.last_hitable_obj == child) gwskin.last_hitable_obj = null;
}
//static
function gw_close_child_list(list) {
var count = list.length;
if (!count) return;
for (var i = 0; i < count; i++) {
var child = list[i];
if (typeof child.close != 'undefined') child.close();
else gw_detach_child(child);
if (list.length < count) {
i -= (count - list.length);
count = list.length;
}
}
//trigger GC whenever we have closed a child list
gpac.trigger_gc();
}
//static
gwskin.get_class = function (class_name) {
if (arguments.length < 1) class_name = 'default';
var styles = gwskin.styles.filter(function (obj) { return obj.name == class_name; });
if (styles.length > 0) {
return styles[0];
}
return null;
}
//static
gwskin.get_style = function (class_name, style_name) {
if (arguments.length < 1) class_name = 'default';
if (arguments.length < 2) style_name = 'normal';
if (style_name == 'invisible') return gwskin.appearance_transparent;
var style = null;
var styles = gwskin.styles.filter(function (obj) { return obj.name == class_name; });
if (styles.length > 0) {
if (typeof styles[0][style_name] != 'undefined')
return styles[0][style_name];
} else {
gwlog(l_err, 'Non-existing class ' + class_name);
}
style = gwskin.styles[0];
if (typeof style[style_name] != 'undefined')
return style[style_name];
gwlog(l_err, 'Non-existing style ' + style_name + ' in default class');
return null;
}
//static
gwskin.get_font = function (class_name) {
if (arguments.length < 1) class_name = 'default';
var styles = gwskin.styles.filter(function (obj) { return obj.name == class_name; });
if (styles.length > 0) {
if (typeof styles[0].font != 'undefined') {
return styles[0].font;
}
} else {
gwlog(l_err, 'Non-existing class ' + class_name);
}
return gwskin.styles[0].font;
}
function gw_new_container() {
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'Container');
obj.push_to_top = function (wnd) {
this.removeChildren[0] = wnd;
this.addChildren[0] = wnd;
}
return obj;
}
function gw_new_curve2d(class_name)
{
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'Curve2D');
var shape = new SFNode('Shape');
obj.children[0] = shape;
shape.appearance = gw_new_appearance(0, 0, 0);
obj.children[0].appearance.material.filled = false;
obj.children[0].appearance.material.lineProps = new SFNode('LineProperties');
obj.set_color = function (r, g, b) {
this.children[0].appearance.material.lineProps.lineColor.r = r;
this.children[0].appearance.material.lineProps.lineColor.g = g;
this.children[0].appearance.material.lineProps.lineColor.b = b;
}
obj.set_line_width = function (width) {
if (!this.children[0].appearance.material.lineProps) this.children[0].appearance.material.lineProps = new SFNode('LineProperties');
this.children[0].appearance.material.lineProps.width = width;
}
shape.geometry = new SFNode('Curve2D');
shape.geometry.point = new SFNode('Coordinate2D');
obj.reset = function () {
this.children[0].geometry.point.point.length = 0;
this.children[0].geometry.type.length = 0;
}
obj._add_coord = function (x, y) {
var pts = this.children[0].geometry.point.point;
pts[pts.length] = new SFVec2f(x, y);
}
obj.add_move_to = function (x, y) {
this._add_coord(x, y);
//first moveto is implicit
if (this.children[0].geometry.type.length)
this.children[0].geometry.type[this.children[0].geometry.type.length] = 0;
}
obj.add_line_to = function (x, y) {
this._add_coord(x, y);
this.children[0].geometry.type[this.children[0].geometry.type.length] = 1;
}
obj.remove_first = function () {
var pts = this.children[0].geometry.point.point;
if (pts.length < 2) pts.length = 0;
else {
for (var i = 0; i < pts.length - 1; i++) {
pts[i] = pts[i + 1];
}
pts.length = i;
pts = this.children[0].geometry.type;
for (var i = 0; i < pts.length - 1; i++) {
pts[i] = pts[i + 1];
}
pts.length = i;
}
}
obj.get_num_points = function() {
return this.children[0].geometry.point.point.length;
}
return obj;
}
function gw_new_rectangle(class_name, style) {
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'Rectangle');
var shape = new SFNode('Shape');
obj.children[0] = shape;
if (arguments.length == 1) style = 'normal';
shape.appearance = gwskin.get_style(class_name, style);
if (shape.appearance && (typeof (shape.appearance.skin) == 'undefined')) {
obj.set_alpha = function (alpha) {
this.children[0].appearance.material.transparency = 1 - alpha;
}
obj.get_alpha = function () {
return 1 - this.children[0].appearance.material.transparency;
}
obj.set_fill_color = function (r, g, b) {
this.children[0].appearance.material.emissiveColor.r = r;
this.children[0].appearance.material.emissiveColor.g = g;
this.children[0].appearance.material.emissiveColor.b = b;
}
obj.set_strike_color = function (r, g, b) {
if (!this.children[0].appearance.material.lineProps) this.children[0].appearance.material.lineProps = new SFNode('LineProperties');
this.children[0].appearance.material.lineProps.lineColor.r = r;
this.children[0].appearance.material.lineProps.lineColor.g = g;
this.children[0].appearance.material.lineProps.lineColor.b = b;
}
obj.set_line_width = function (width) {
if (!this.children[0].appearance.material.lineProps) this.children[0].appearance.material.lineProps = new SFNode('LineProperties');
this.children[0].appearance.material.lineProps.width = width;
}
} else {
obj.set_alpha = function (alpha) { }
obj.set_fill_color = function (r, g, b) { }
obj.set_strike_color = function (r, g, b) { }
obj.set_line_width = function (width) { }
obj.get_alpha = function () { return 1; }
}
obj.set_style = function (classname, style) {
var app = gwskin.get_style(classname, style);
if (app) this.children[0].appearance = app;
}
shape.geometry = new SFNode('Curve2D');
shape.geometry.point = new SFNode('Coordinate2D');
obj.corner_tl = true;
obj.corner_tr = true;
obj.corner_bl = true;
obj.corner_br = true;
obj.set_corners = function (tl, tr, br, bl) {
this.corner_tl = tl;
this.corner_tr = tr;
this.corner_bl = bl;
this.corner_br = br;
}
obj.sfv = new SFVec2f(0, 0);
obj.set_size = function (w, h) {
var hw, hh, rx_bl, ry_bl, rx_br, ry_br, rx_tl, ry_tl, rx_tr, ry_tr, rx, ry;
var temp;
hw = w / 2;
hh = h / 2;
this.width = w;
this.height = h;
temp = this.children[0].geometry.type;
temp[0] = 7;
temp[1] = 1;
temp[2] = 7;
temp[3] = 1;
temp[4] = 7;
temp[5] = 1;
temp[6] = 7;
temp[7] = 6; /*close*/
/*compute default rx/ry*/
ry = rx = 10;
if (rx >= hw) rx = hw;
if (ry >= hh) ry = hh;
rx_bl = rx_br = rx_tl = rx_tr = rx;
ry_bl = ry_br = ry_tl = ry_tr = ry;
if (!this.corner_tl) rx_tl = ry_tl = 0;
if (!this.corner_tr) rx_tr = ry_tr = 0;
if (!this.corner_bl) rx_bl = ry_bl = 0;
if (!this.corner_br) rx_br = ry_br = 0;
if (shape.geometry.point.point.length < 12) {
shape.geometry.point.point.length = 12;
for (var i = 0; i < 12; i++) {
shape.geometry.point.point[i].x = 0;
}
}
temp = this.children[0].geometry.point.point;
this.sfv.x = hw - rx_tr;
this.sfv.y = hh;
temp[0] = this.sfv;
this.sfv.x = hw;
this.sfv.y = hh; /*bezier ctrl point or line-to*/
temp[1] = this.sfv;
this.sfv.x = hw;
this.sfv.y = hh - ry_tr;
temp[2] = this.sfv;
this.sfv.x = hw;
this.sfv.y = -hh + ry_br;
temp[3] = this.sfv;
this.sfv.x = hw;
this.sfv.y = -hh; /*bezier control point*/
temp[4] = this.sfv;
this.sfv.x = hw - rx_br;
this.sfv.y = -hh;
temp[5] = this.sfv;
this.sfv.x = -hw + rx_bl;
this.sfv.y = -hh;
temp[6] = this.sfv;
this.sfv.x = -hw;
this.sfv.y = -hh; /*bezier control point*/
temp[7] = this.sfv;
this.sfv.x = -hw;
this.sfv.y = -hh + ry_bl;
temp[8] = this.sfv;
this.sfv.x = -hw;
this.sfv.y = hh - ry_tl;
temp[9] = this.sfv;
this.sfv.x = -hw;
this.sfv.y = hh; /*bezier control point*/
temp[10] = this.sfv;
this.sfv.x = -hw + rx_tl;
this.sfv.y = hh;
temp[11] = this.sfv;
}
return obj;
}
function gw_new_text(parent, label, class_name) {
var obj = new SFNode('Transform2D');
if (arguments.length < 3) class_name = 'default';
setup_gw_object(obj, 'Text');
gw_add_child(parent, obj);
obj.children[0] = new SFNode('Transform2D');
obj.children[0].children[0] = new SFNode('Shape');
obj.children[0].children[0].geometry = new SFNode('Text');
if (class_name == 'custom') {
class_name = 'default';
obj.children[0].children[0].appearance = gw_new_appearance(0, 0, 0);
obj.children[0].children[0].geometry.fontStyle = gw_new_fontstyle(gwskin.default_label_font_size, 1);
} else {
obj.children[0].children[0].appearance = gwskin.get_style(class_name, 'text');
obj.children[0].children[0].geometry.fontStyle = gwskin.get_font(class_name);
}
obj.set_label = function (value) {
this.children[0].children[0].geometry.string.length = 0;
this.children[0].children[0].geometry.string[0] = value;
}
obj.set_labels = function () {
this.children[0].children[0].geometry.string.length = 0;
for (var i = 0; i < arguments.length; i++) {
this.children[0].children[0].geometry.string[i] = '' + arguments[i];
}
}
obj.get_label = function () {
var mfs = this.children[0].children[0].geometry.string;
return mfs.length ? this.children[0].children[0].geometry.string[0] : '';
}
obj.set_width = function (value) {
this.children[0].children[0].geometry.maxExtent = -value;
this.width = value;
}
obj.font_size = function (value) {
return this.children[0].children[0].geometry.fontStyle ? this.children[0].children[0].geometry.fontStyle.size : 1;
}
if (obj.children[0].children[0].appearance && (typeof (obj.children[0].children[0].appearance.skin) == 'undefined')) {
obj.set_color = function (r, g, b) {
this.children[0].children[0].appearance.material.emissiveColor = new SFColor(r, g, b);
}
obj.children[0].set_alpha = function (a) {
this.children[0].children[0].appearance.material.transparency = 1 - a;
}
obj.set_align = function (val) {
this.children[0].children[0].geometry.fontStyle.justify[0] = val;
}
obj.set_font_size = function (val) {
this.children[0].children[0].geometry.fontStyle.size = val;
}
} else {
obj.set_color = function (r, g, b) { }
obj.set_alpha = function (a) { }
obj.set_align = function (a) { }
obj.set_font_size = function (a) { }
}
obj.set_size = function (width, height) {
var justify = this.children[0].children[0].geometry.fontStyle ? this.children[0].children[0].geometry.fontStyle.justify[0] : '';
if (justify == 'BEGIN') {
this.children[0].translation.x = -width / 2;
} else if (justify == 'END') {
this.children[0].translation.x = width / 2;
} else {
this.children[0].translation.x = 0;
}
this.children[0].children[0].geometry.maxExtent = -width;
this.width = width;
this.height = height;
}
if (label) obj.set_label(label);
return obj;
}
function gw_new_window(parent, offscreen, background, class_name, no_focus) {
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'Window');
obj.background = null;
obj._is_window = true;
if (arguments.length < 4) class_name = 'window';
else if ((arguments.length == 4) && typeof (arguments[3]) == 'boolean') {
obj._no_focus = true;
class_name = 'window';
}
else if (arguments.length == 5) obj._no_focus = true;
if (class_name == 'popup') {
class_name = 'window';
obj._popup = true;
}
if (background)
obj.background = gw_new_rectangle(class_name);
obj.visible = false;
obj.scale.x = obj.scale.y = 0;
obj._disable_rect = gw_new_rectangle(class_name, 'invisible');
obj.on_event = function (evt) { return 0; }
obj.set_style = function (classname, style) {
if (this.background)
this.background.set_style(classname, style);
}
if (!offscreen) {
if (obj.background) gw_add_child(obj, obj.background);
var item = new SFNode('Layer2D');
setup_gw_object(item, 'Layer');
gw_add_child(obj, item);
obj.set_size = function (width, height) {
this.width = width;
this.height = height;
var idx = 0;
if (this.background) {
this.children[0].set_size(width, height);
idx++;
}
this.children[idx].size.x = width;
this.children[idx].size.y = height;
this.layout(width, height);
}
obj.set_alpha = function (alpha) {
if (this.background) {
this.children[0].set_alpha(alpha);
}
}
obj.get_alpha = function () {
if (this.background) {
return this.children[0].get_alpha();
}
return 0.0;
}
obj.add_child = function (child) {
var idx = this.background ? 1 : 0;
this.children[idx].children[this.children[idx].children.length] = child;
}
obj.remove_child = function (child) {
var idx = this.background ? 1 : 0;
this.children[idx].removeChildren[0] = child;
}
obj._wnd_close = function () {
obj.background = null;
obj._disable_rect = null;
gw_close_child_list(this.children);
}
} else {
var shape = new SFNode('Shape');
shape.appearance = new SFNode('Appearance');
shape.appearance.material = new SFNode('Material2D');
shape.appearance.material.filled = TRUE;
shape.appearance.texture = new SFNode('CompositeTexture2D');
if (obj.background) {
//use background to make sure the underlying texture is RGB, not RGBA
if (!gwskin.disable_transparency) {
shape.appearance.texture.children[0] = obj.background;
} else {
shape.appearance.texture.background = gwskin.no_gl_window_back;
}
}
shape.geometry = new SFNode('Bitmap');
obj.children[0] = shape;
obj.set_size = function (width, height) {
this.width = width;
this.height = height;
this.children[0].appearance.texture.pixelWidth = width;
this.children[0].appearance.texture.pixelHeight = height;
this.children[0].appearance.texture.children[0].set_size(width, height);
this.layout(width, height);
}
obj.set_alpha = function (alpha) {
//disable image blending for offscreens with backgrounds
if (this.background && gwskin.disable_transparency) alpha = 1;
this.children[0].appearance.material.transparency = 1 - alpha;
}
obj.get_alpha = function () {
return 1 - this.children[0].appearance.material.transparency;
}
obj.add_child = function (child) {
this.children[0].appearance.texture.children[this.children[0].appearance.texture.children.length] = child;
}
obj.remove_child = function (child) {
this.children[0].appearance.texture.removeChildren[0] = child;
}
obj._wnd_close = function () {
obj.background = null;
obj._disable_rect = null;
gw_close_child_list(this.children[0].appearance.texture.children);
}
}
obj._pre_destroy = obj._wnd_close;
obj.set_corners = function (tl, tr, br, bl) {
if (this.background)
this.background.set_corners(tl, tr, br, bl);
}
obj._is_disable = false;
obj.disable = function () {
if (this._is_disable) return;
this._is_disable = true;
this._disable_rect.set_size(this.width, this.height);
this.add_child(this._disable_rect);
}
obj.enable = function () {
if (!this._is_disable) return;
this._is_disable = false;
this.remove_child(this._disable_rect);
}
if (typeof obj._popup != 'boolean') {
var s = gwskin.get_class(class_name);
if (s) {
if (typeof s.show != 'undefined') obj.show = s.show;
if (typeof s.hide != 'undefined') obj.hide = s.hide;
}
}
obj.on_close = null;
obj._orig_close = obj.close;
obj._on_wnd_close = function () {
if (this.on_close != null) this.on_close();
this._orig_close();
}
obj.close = function () {
this.hide(this._on_wnd_close);
}
obj.layout = function (w, h) { }
obj.set_alpha(gwskin.default_window_alpha);
gw_add_child(parent, obj);
return obj;
}
function gw_new_icon_button(parent, icon_url, label, horizontal, class_name) {
var touch;
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'IconButton');
if (arguments.length == 3) {
horizontal = false;
class_name = 'default';
}
else if (arguments.length == 4) {
if (typeof arguments[3] == 'string') {
class_name = arguments[3];
horizontal = false;
} else {
class_name = 'default';
}
}
obj._icon_root = new SFNode('Transform2D');
obj._icon_root.children[0] = new SFNode('Layer2D');
obj._touch = new SFNode('TouchSensor');
obj._highlight = gw_new_rectangle(class_name, 'invisible');
obj._show_highlight = false;
obj._is_icon = false;
obj._tooltip = true;
if (class_name == 'icon') {
obj._is_icon = true;
}
else if (class_name == 'icon_label') {
obj._is_icon = true;
obj._show_highlight = false;
class_name = 'checkbox';
}
else if (class_name == 'listitem') {
obj._is_icon = true;
obj._show_highlight = true;
obj._tooltip = false;
} else {
obj._highlight = gw_new_rectangle(class_name, 'invisible');
obj._show_highlight = true;
}
if (obj._highlight)
obj.children[0] = obj._highlight;
obj.children[obj.children.length] = obj._icon_root;
obj.children[obj.children.length] = obj._touch;
obj._label = null;
var skip_label = (label == null) ? true : false;
if (!skip_label && gwskin.get_font(class_name) != null) {
obj._label = gw_new_text(obj, label, class_name);
if (horizontal) {
obj.set_size = function (width, height) {
this._icon_root.children[0].size.x = height;
this._icon_root.children[0].size.y = height;
this._icon_root.translation.x = (height - width) / 2;
if (this._highlight)
this._highlight.set_size(width, height);
this._label.set_width(width - height);
this._label.translation.x = height - width / 2;
this.width = width;
this.height = height;
};
} else {
obj.set_size = function (width, height) {
var fsize = this._label.font_size();
var h = height - fsize - gwskin.default_icon_text_spacing;
this._icon_root.children[0].size.x = h;
this._icon_root.children[0].size.y = h;
this._icon_root.translation.y = (height - h) / 2;
var w = width;
if (this._highlight)
this._highlight.set_size(w, height);
this._label.set_width(w);
this._label.translation.y = -height / 2 + fsize / 2;
this.width = w;
this.height = height;
};
}
obj.set_label = function (label) {
this._label.set_label(label);
}
obj.get_label = function () {
return this._label.get_label();
}
} else {
obj.set_size = function (width, height) {
this._icon_root.children[0].size.x = width;
this._icon_root.children[0].size.y = height;
if (this._highlight)
this._highlight.set_size(width, height);
this.width = width;
this.height = height;
};
obj.set_label = function (label) {
this.label = label;
}
obj.get_label = function () {
return this.label;
}
}
obj._last_ts = 0;
obj.on_long_click = NULL;
obj.on_click = NULL;
obj.on_over = null;
obj.down = false;
obj.over = false;
obj._on_active = function (value, timestamp) {
if (value) {
this.down = true;
if (this._is_icon) {
var app = gwskin.get_style(class_name, 'down');
this._icon_root.children[0].children[0].set_style(app);
}
if (this._show_highlight) {
this._highlight.set_style(class_name, 'down');
}
this._last_ts = timestamp;
} else {
if (this._is_icon) {
var app = gwskin.get_style(class_name, (this.over && gwskin.pointing_device) ? 'over' : 'normal');
this._icon_root.children[0].children[0].set_style(app);
}
if (this._show_highlight) {
this._highlight.set_style(class_name, (this.over && gwskin.pointing_device) ? 'over' : 'invisible');
}
if (this.down) {
if (this.on_long_click && (timestamp - this._last_ts > gwskin.long_click_delay)) this.on_long_click();
else if (this.on_click) this.on_click();
}
this.down = false;
}
};
obj._on_over = function (value) {
this.over = value;
gw_reset_hit(this, value);
if (gwskin.pointing_device) {
if (this._is_icon) {
var app = gwskin.get_style(class_name, value ? 'over' : 'normal');
if (app) {
this._icon_root.children[0].children[0].set_style(app);
}
}
if (this._show_highlight) {
this._highlight.set_style(class_name, value ? 'over' : 'invisible');
}
if (this.on_over) this.on_over(value);
if (this._tooltip && gwskin.tooltip_callback) gwskin.tooltip_callback(this, value);
}
};
Browser.addRoute(obj._touch, 'isOver', obj, obj._on_over);
Browser.addRoute(obj._touch, 'isActive', obj, obj._on_active);
obj.icons = [];
obj.add_icon = function (url) {
if (typeof url == 'string') {
var inl;
if (typeof gwskin.images[url] != 'undefined') {
inl = gw_load_resource(gwskin.images[url], this._is_icon);
} else {
inl = gw_load_resource(url, this._is_icon);
}
} else {
var inl = url;
}
this.icons[this.icons.length] = inl;
if (this._icon_root.children[0].children.length == 0) {
this._icon_root.children[0].children[0] = this.icons[0];
}
}
obj.switch_icon = function (idx) {
while (idx > this.icons.length) idx -= this.icons.length;
this._icon_root.children[0].children[0] = this.icons[idx];
}
obj._pre_destroy = function () {
for (var i in this.icons) {
gw_unload_resource(this.icons[i]);
}
this.icons.length = 0;
this._highlight = null;
this._icons = null;
this._label = null;
Browser.deleteRoute(this._touch, 'ALL', null, null);
this._touch = null;
}
if (icon_url) obj.add_icon(icon_url);
obj.set_label(label);
obj.enable = function() {
this._touch.enabled = true;
this._on_over(false);
}
obj.disable = function() {
this._touch.enabled = false;
var app = gwskin.get_style(class_name, 'disable');
if (app) {
this._icon_root.children[0].children[0].set_style(app);
}
}
obj.on_event = function () { return false; }
if (0 && (typeof gwskin[class_name] != 'undefined') && (typeof gwskin[class_name].height != 'undefined')) {
obj.set_size(gwskin[class_name].height, gwskin[class_name].height);
} else {
obj.set_size(gwskin.default_control_height, gwskin.default_control_height);
}
gw_add_child(parent, obj);
return obj;
}
function gw_new_icon(parent, icon_name) {
return gw_new_icon_button(parent, gwskin.images[icon_name], gwskin.labels[icon_name], false, 'icon');
}
function gw_new_checkbox(parent, label) {
var touch;
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'CheckBox');
obj._icon_root = new SFNode('Transform2D');
obj._icon_root.children[0] = new SFNode('Layer2D');
obj._touch = new SFNode('TouchSensor');
var class_name = 'checkbox';
obj.children[0] = gw_new_rectangle(class_name, 'invisible');
obj.children[1] = obj._icon_root;
gw_new_text(obj, label, class_name);
obj.children[3] = obj._touch;
obj.set_size = function (width, height) {
this._icon_root.children[0].size.x = height;
this._icon_root.children[0].size.y = height;
this._icon_root.translation.x = (height - width) / 2;
this.children[0].set_size(width, height);
this.children[2].set_width(width - height);
this.children[2].translation.x = (height - width) / 2 + height;
this.width = width;
this.height = height;
};
obj.set_label = function (label) {
this.children[2].set_label(label);
}
obj.get_label = function () {
return this.children[2].get_label();
}
obj.on_check = NULL;
obj.down = false;
obj.over = false;
obj._checked = false;
obj._on_active = function (value, timestamp) {
if (value) {
this.down = true;
} else {
if (this.down && this.over) {
this._set_checked(!this._checked);
if (this.on_check) this.on_check(this._checked);
}
this.down = false;
}
};
obj._on_over = function (value) {
this.over = value;
gw_reset_hit(this, value);
if (gwskin.pointing_device) {
var app = gwskin.get_style(class_name, value ? 'over' : (this._checked ? 'down' : 'normal') );
if (app) {
this._icon_root.children[0].children[0].set_style(app);
}
if (this.on_over) this.on_over(value);
if (gwskin.tooltip_callback) gwskin.tooltip_callback(this, value);
}
};
Browser.addRoute(obj._touch, 'isOver', obj, obj._on_over);
Browser.addRoute(obj._touch, 'isActive', obj, obj._on_active);
obj._set_checked = function (value) {
this._checked = value;
var app = gwskin.get_style(class_name, value ? 'down' : 'normal');
this._icon_root.children[0].children[0].set_style(app);
}
obj.set_checked = function (value) {
this._set_checked(value);
}
obj._icon_root.children[0].children[0] = gw_load_resource(gwskin.images.check, true);
obj._pre_destroy = function () {
for (var i in this.icons) {
gw_unload_resource(this.icons[i]);
}
Browser.deleteRoute(this._touch, 'ALL', null, null);
this._touch = null;
this._icon_root = null;
}
obj.set_label(label);
obj.on_event = function () { return false; }
if (0 && (typeof gwskin[class_name] != 'undefined') && (typeof gwskin[class_name].height != 'undefined')) {
obj.set_size(gwskin[class_name].height, gwskin[class_name].height);
} else {
obj.set_size(gwskin.default_control_height, gwskin.default_control_height);
}
gw_add_child(parent, obj);
return obj;
}
function gw_new_spincontrol(parent, horizontal) {
var touch;
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'SpinControl');
obj.value = 0;
if (arguments.length < 2) horizontal = false;
obj._horizontal = horizontal;
obj.on_click = function () { }
var tool = gw_new_icon(obj, horizontal ? 'right' : 'up');
obj.min = 0;
obj.max = -1;
tool.on_click = function () {
if (this.parent.min < this.parent.max) {
if (this.parent.value >= this.parent.max) {
return;
}
}
this.parent.value++;
this.parent.on_click(this.parent.value);
}
tool = gw_new_icon(obj, horizontal ? 'left' : 'down');
tool.on_click = function () {
if (this.parent.min < this.parent.max) {
if (this.parent.value <= this.parent.min) {
return;
}
}
this.parent.value--;
this.parent.on_click(this.parent.value);
}
obj.set_size = function (width, height) {
if (this._horizontal) {
this.children[0].set_size(width / 2, height);
this.children[1].set_size(width / 2, height);
this.children[0].translation.x = width / 4;
this.children[1].translation.x = -width / 4;
} else {
this.children[0].set_size(width, height / 2);
this.children[1].set_size(width, height / 2);
this.children[0].translation.y = height / 4;
this.children[1].translation.y = -height / 4;
}
this.width = width;
this.height = height;
};
obj._idx = 0;
obj.on_event = function (evt) {
if (evt.type == GF_EVENT_KEYDOWN) {
var idx = this._idx;
if (this._horizontal) {
if (evt.keycode == 'Left') idx--;
else if (evt.keycode == 'Right') idx++;
else return false;
} else {
if (evt.keycode == 'Up') idx--;
else if (evt.keycode == 'Down') idx++;
else return false;
}
if (idx < 0) {
return false;
}
if (idx > 1) {
return false;
}
this._idx = idx;
gpac.set_focus(this.children[idx]);
return true;
}
return false;
}
gw_add_child(parent, obj);
return obj;
}
function gw_new_subscene(parent) {
var inline = new SFNode('Inline');
inline._name = 'Subscene';
inline._pre_destroy = function () {
this.url[0] = '';
this.url.length = 0;
}
inline.connect = function (url) {
this.url.length = 0;
this.url[0] = url;
}
gw_add_child(parent, inline);
return inline;
}
function gw_new_button(parent, text, class_name) {
var label;
if (arguments.length < 3) class_name = 'button';
obj = gw_new_rectangle(class_name, 'normal');
label = gw_new_text(obj, text, class_name);
gw_object_set_hitable(obj);
obj.on_over = function (value) {
if (gwskin.pointing_device) {
this.set_style(class_name, value ? 'over' : 'normal');
}
//if (gwskin.tooltip_callback) gwskin.tooltip_callback(this, value);
}
obj.on_down = function (val) {
this.set_style(class_name, val ? 'down' : (this._over ? 'over' : 'normal'));
}
obj._set_size = obj.set_size;
obj.set_size = function (width, height) {
this._set_size(width, height);
this.children[1].set_size(width, height);
this.children[1].set_width(width);
};
obj.set_label = function (label) {
this.children[1].set_label(label);
}
obj.get_label = function () {
return this.children[1].get_label();
}
obj.set_labels = function () {
this.children[1].set_labels.apply(this.children[1], arguments);
}
obj.on_event = function (x, y) { return false; }
obj.disable = function () {
this._disable_touch();
}
obj.enable = function () {
this._enable_touch();
}
gw_add_child(parent, obj);
return obj;
}
function gw_new_gauge(parent, text) {
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'ProgressBar');
if (arguments.length <= 3) class_name = 'progress';
obj.children[0] = gw_new_rectangle(class_name, 'normal');
obj.children[1] = gw_new_rectangle(class_name, 'over');
gw_new_text(obj, text, class_name);
obj._value = 75;
obj._set_size = obj.set_size;
obj.set_size = function (width, height) {
this._set_size(width, height);
this.children[0].set_size(width, height);
this.children[1].set_size(this._value * width / 100, height);
this.children[1].move((this._value - 100) * width / 200, 0);
this.children[2].set_size(width, height);
this.children[2].set_width(width);
};
obj.set_label = function (label) {
this.children[2].set_label(label);
}
obj.get_label = function () {
return this.children[2].get_label();
}
obj.set_value = function (val) {
this._value = (val > 100) ? 100 : ((val < 0) ? 0 : val);
this.set_size(this.width, this.height);
}
obj.on_event = function (x, y) { return false; }
gw_add_child(parent, obj);
return obj;
}
function grid_event_navigate(dlg, children, type) {
var i;
if (dlg.current_focus == -1) {
if (type == 'Left') return false;
dlg.current_focus = 0;
gpac.set_focus(children[0]);
return true;
}
if (type == 'Right') {
var orig_focus = dlg.current_focus;
var switch_page = 0;
var tr = children[dlg.current_focus].translation.y - children[dlg.current_focus].height / 2;
if (dlg.current_focus + 1 == children.length) {
dlg.current_focus = orig_focus;
gpac.set_focus(children[dlg.current_focus]);
return false;
}
/*goto right item*/
dlg.current_focus++;
/*check we are not going down*/
while (1) {
if (children[dlg.current_focus].visible && (children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2 > tr))
break;
if (dlg.current_focus + 1 == children.length) {
dlg.current_focus = orig_focus;
gpac.set_focus(children[dlg.current_focus]);
return false;
}
dlg.current_focus++;
switch_page = 1;
}
/*check we haven't move to a new page*/
if (children[orig_focus].translation.y + children[orig_focus].height / 2 <= children[dlg.current_focus].translation.y - children[dlg.current_focus].height / 2) {
switch_page = 1;
}
}
else if (type == 'Left') {
var orig_focus = dlg.current_focus;
var switch_page = 0;
var tr = children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2;
if (!dlg.current_focus) {
dlg.current_focus = -1;
gpac.set_focus(null);
return false;
}
/*goto left item*/
dlg.current_focus--;
/*check we are not going up*/
while (1) {
if (children[dlg.current_focus].visible && (children[dlg.current_focus].translation.y - children[dlg.current_focus].height / 2 < tr))
break;
if (!dlg.current_focus) {
dlg.current_focus = orig_focus;
return false;
}
dlg.current_focus--;
switch_page = -1;
}
/*check we haven't move to a new page*/
if (children[orig_focus].translation.y - children[orig_focus].height / 2 >= children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2) {
switch_page = -1;
}
}
else if (type == 'Down') {
var orig_focus = dlg.current_focus;
var switch_page = 0;
var bottom_y = children[dlg.current_focus].translation.y - children[dlg.current_focus].height / 2;
var top_y = children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2;
if (dlg.current_focus + 1 == children.length) return false;
dlg.current_focus++;
/*goto next line*/
while (1) {
//next child below current
if (children[dlg.current_focus].visible && (children[dlg.current_focus].translation.y - children[dlg.current_focus].height / 2 < bottom_y))
break;
//next child above current - we need a page swicth
if (children[dlg.current_focus].visible && (children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2 > top_y)) {
switch_page = 1;
break;
}
//not found
if (dlg.current_focus + 1 == children.length) {
dlg.current_focus = orig_focus;
return false;
}
dlg.current_focus++;
}
/*find closest item on the left*/
var tx = children[orig_focus].translation.x - children[orig_focus].width / 2;
while (1) {
if (children[dlg.current_focus].visible && (children[dlg.current_focus].translation.x + children[dlg.current_focus].width / 2 > tx))
break;
if (dlg.current_focus + 1 == children.length) break;
dlg.current_focus++;
}
}
else if (type == 'Up') {
var orig_focus = dlg.current_focus;
var switch_page = 0;
var bottom_y = children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2;
var top_y = children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2;
if (!dlg.current_focus) return false;
dlg.current_focus--;
/*goto previous line*/
while (1) {
if (children[dlg.current_focus].visible && (children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2 > top_y))
break;
//next child below current - we need a page swicth
if (children[dlg.current_focus].visible && (children[dlg.current_focus].translation.y + children[dlg.current_focus].height / 2 < bottom_y)) {
switch_page = -1;
break;
}
if (!dlg.current_focus) {
dlg.current_focus = orig_focus;
return false;
}
dlg.current_focus--;
}
/*goto above child*/
var tx = children[orig_focus].translation.x + children[orig_focus].width / 2;
while (1) {
if (children[dlg.current_focus].visible && (children[dlg.current_focus].translation.x - children[dlg.current_focus].width / 2 < tx))
break;
if (!dlg.current_focus) {
dlg.current_focus = orig_focus;
return false;
}
dlg.current_focus--;
}
} else {
return false;
}
if (switch_page == 1) return dlg.on_next_page();
else if (switch_page == -1) return dlg.on_prev_page();
if (typeof children[dlg.current_focus].on_event == 'undefined') {
return grid_event_navigate(dlg, children, type);
}
gpac.set_focus(children[dlg.current_focus]);
return true;
}
function gw_new_grid_container(parent) {
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'Layout');
obj.children[0] = new SFNode('Layer2D');
obj._container = new SFNode('Transform2D');
obj.children[0].children[0] = obj._container;
obj._all_children = [];
obj._pages = [];
obj.on_page_changed = null;
obj.on_prev_page = function () {
this._move_page(-1);
return true;
};
obj.on_next_page = function () {
this._move_page(1);
return true;
};
obj.is_first_page = function () {
return this._page_idx == 0 ? true : false;
}
obj.is_last_page = function () {
return this._page_idx == (this._pages.length - 1) ? true : false;
}
obj._page_idx = 0;
obj._max_page_idx = 0;
obj._move_page = function (value) {
this._page_idx += value;
var i, child, last_child = 0;
if (this._page_idx <= 0) {
this._page_idx = 0;
}
if (this._page_idx * this.width >= this.max_width) {
this._page_idx = this.max_width / this.width;
}
this._container.translation.x = -this._page_idx * this.width;
this._container.children.length = 0;
if (this._page_idx + 1 >= this._pages.length) {
last_child = this._all_children.length;
} else {
last_child = this._pages[this._page_idx + 1];
}
i = 0;
child = this._pages[this._page_idx];
if (this.current_focus >= 0) {
if (this.current_focus < child) this.current_focus = child;
else if (this.current_focus >= last_child) this.current_focus = last_child - 1;
gpac.set_focus(this._all_children[this.current_focus]);
}
while (child < last_child) {
this._container.children[i] = this._all_children[child];
child++;
i++;
}
if (this.on_page_changed) this.on_page_changed();
}
obj.spread_h = false;
obj.spread_v = false;
obj.break_at_hidden = false;
obj.break_at_line = 0;
obj.set_focus_last = function () {
this._page_idx = this._pages.length ? this._pages.length - 1 : 0;
this.current_focus = this._all_children.length;
this._move_page(0);
}
obj.set_focus_first = function () {
this._page_idx = 0;
this.current_focus = 0;
this._move_page(0);
}
obj.set_size = function (width, height) {
this.width = width;
this.height = height;
this.children[0].size.x = width;
this.children[0].size.y = height;
this.nb_visible = 0;
this.current_focus = -1;
this.layout();
}
obj.max_width = 0;
obj.layout = function () {
var spread_x, nb_wid_h, start_x, start_y, maxh, width, height, page_x, nb_on_line;
var children = this._all_children;
var width = this.width;
var height = this.height;
if (width <= 0) return;
if (height <= 0) return;
if (typeof this.on_size != 'undefined')
this.on_size(width, height);
var page_x = 0;
var maxh = 0;
var spread_x = -1;
var start_x = -width / 2;
var init_y = this.height / 2;
var start_y = init_y;
var nb_on_line = 0;
this._pages = [0];
for (var i = 0; i < children.length; i++) {
//start of line: compute H spread and max V size
if (spread_x == -1) {
var j = 0, len = 0, maxh = 0, nb_child = 0, nb_spread_child = 0;
start_x = -width / 2 + page_x;
while (1) {
if (!children[i + j].visible) {
j++;
if (i + j == children.length) break;
if (this.break_at_hidden) break;
if (typeof (children[i+j-1].__separator) == 'boolean') break;
continue;
}
if (len + children[i + j].width > width) break;
len += children[i + j].width;
if (maxh < children[i + j].height) maxh = children[i + j].height;
j++;
nb_child++;
if ((i + j < children.length) && (typeof children[i+j].stick_to_previous == 'boolean') && children[i+j].stick_to_previous) {
} else {
nb_spread_child++;
}
if (this.break_at_line) break;
if (i + j == children.length) break;
}
if (nb_child <= 1) {
maxh = children[i].height;
if (this.spread_h && !this.break_at_line) start_x = -len / 2;
}
else if (this.spread_h && nb_spread_child) {
spread_x = (width - len) / (nb_spread_child);
start_x += spread_x / 2;
} else {
spread_x = 0;
}
}
if (!children[i].visible) {
if (nb_on_line && ( this.break_at_hidden || (typeof (children[i].__separator) == 'boolean')) ) {
nb_on_line = 0;
spread_x = -1;
start_y -= maxh / 2;
start_x = -width / 2;
}
continue;
}
if (start_y - maxh < -height / 2) {
//push new page only if not empty! (otherwise we've been asked to layout in a too small grid ...)
if (!this._pages.length || this._pages[this._pages.length - 1] < i) {
nb_on_line = 0;
page_x += width;
spread_x = -1;
start_y = init_y;
this._pages.push(i);
i--;
continue;
}
}
children[i].translation.x = start_x + children[i].width / 2;
children[i].translation.y = start_y - maxh / 2;
if ((i + 1 < children.length) && (typeof children[i + 1].stick_to_previous == 'boolean') && children[i+1].stick_to_previous) {
start_x += children[i].width;
} else {
start_x += children[i].width + spread_x;
}
nb_on_line++;
if (i + 1 == children.length) {
break;
}
if ((nb_on_line == nb_child) || (start_x - page_x + children[i + 1].width > width / 2)) {
nb_on_line = 0;
spread_x = -1;
start_y -= maxh;
start_x = -width / 2;
}
}
this.max_width = page_x;
this._move_page(0);
}
obj.add_child = function (child) {
this._all_children.push(child);
}
obj.remove_child = function (child) {
var index = this._all_children.indexOf(child);
if (index > -1) this._all_children.splice(index, 1);
}
obj.get_children = function () {
return this._all_children;
}
obj.reset_children = function () {
gw_close_child_list(this._all_children);
this._all_children.length = 0;
this._container.children.length = 0;
this._page_idx = 0;
this._max_page_idx = 0;
}
obj.on_event = function (evt) {
switch (evt.type) {
case GF_EVENT_MOUSEWHEEL:
var inc = -evt.wheel;
if (this._pages.length <= 1) return 0;
if ((inc < 0) && (this._page_idx == 0)) return 0;
if ((inc > 0) && (this._page_idx >= this._pages.length - 1)) return 0;
this._move_page((inc < 0) ? -1 : 1);
return 1;
case GF_EVENT_KEYDOWN:
if ((evt.keycode == 'Up') || (evt.keycode == 'Down') || (evt.keycode == 'Right') || (evt.keycode == 'Left')) {
if ((this.current_focus >= 0) && typeof this._all_children[this.current_focus].on_event != 'undefined') {
var res = this._all_children[this.current_focus].on_event(evt);
if (res) return res;
}
return grid_event_navigate(this, this._all_children, evt.keycode);
}
if ((evt.keycode == 'PageUp') && (this._page_idx > 0)) {
return this.on_prev_page();
}
if ((evt.keycode == 'PageDown') && (this._page_idx < this._pages.length)) {
return this.on_next_page();
}
return 0;
}
return 0;
}
obj._pre_destroy = function () {
this.reset_children();
this._container = null;
this._all_children.length = 0;
}
gw_add_child(parent, obj);
return obj;
}
function gw_new_separator(parent) {
var obj = gw_new_container();
obj.hide();
obj.show = function() {};
obj.__separator = true;
gw_add_child(parent, obj);
return obj;
}
function gw_new_progress_bar(parent, vertical, with_progress, class_name) {
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'ProgressBar');
var ps2d;
if (arguments.length <= 3) class_name = 'progress';
if (arguments.length <= 2) with_progress = false;
if (arguments.length <= 1) vertical = false;
obj.children[0] = gw_new_rectangle(class_name, 'normal');
if (with_progress) {
obj.children[1] = gw_new_rectangle(class_name, 'down');
if (vertical) {
obj.children[1].set_corners(true, false, false, true);
} else {
obj.children[1].set_corners(true, false, false, true);
}
obj.set_progress = function (prog) {
if (prog < 0) prog = 0;
else if (prog > 100) prog = 100;
this.prog = prog;
prog /= 100;
if (this.vertical) {
var pheight = prog * this.height;
this.children[1].set_size(this.width, pheight);
this.children[1].move(0, (this.height - pheight) / 2, 0);
} else {
var pwidth = prog * this.width;
this.children[1].set_size(pwidth, this.height);
this.children[1].move((pwidth - this.width) / 2, 0);
}
}
} else {
obj.set_progress = function (prog) { }
}
obj.slide_idx = obj.children.length;
obj.children[obj.slide_idx] = gw_new_rectangle(class_name, 'over');
if (vertical) {
obj.children[obj.slide_idx].set_corners(true, false, false, true);
} else {
obj.children[obj.slide_idx].set_corners(true, false, false, true);
}
obj.children[obj.slide_idx + 1] = gw_new_rectangle(class_name, 'invisible');
ps2d = new SFNode('PlaneSensor2D');
obj.children[obj.slide_idx + 1].children[1] = ps2d;
ps2d.maxPosition.x = -1;
ps2d.maxPosition.y = -1;
obj.on_slide = function (value, type) { }
obj._with_progress = with_progress;
obj._sliding = false;
obj._slide_active = function (val) {
obj._sliding = val;
this.on_slide(this.min + (this.max - this.min) * this.frac, val ? 1 : 2);
}
Browser.addRoute(ps2d, 'isActive', obj, obj._slide_active);
obj._set_trackpoint = function (value) {
if (this.vertical) {
this.frac = value.y / this.height;
} else {
this.frac = value.x / this.width;
}
this.frac += 0.5;
if (this.frac > 1) this.frac = 1;
else if (this.frac < 0) this.frac = 0;
this._set_frac();
this.on_slide(this.min + (this.max - this.min) * this.frac, 0);
}
Browser.addRoute(ps2d, 'trackPoint_changed', obj, obj._set_trackpoint);
obj._set_frac = function () {
if (this.vertical) {
var pheight = this.frac * this.height;
if (pheight < this.width) pheight = this.width;
this.children[this.slide_idx].set_size(this.width, pheight);
this.children[this.slide_idx].move(0, (this.height - pheight) / 2, 0);
} else {
var pwidth = this.frac * this.width;
if (pwidth < this.height) pwidth = this.height;
this.children[this.slide_idx].set_size(pwidth, this.height);
this.children[this.slide_idx].move((pwidth - this.width) / 2, 0);
}
}
obj.set_value = function (value) {
if (this._sliding) return;
value -= this.min;
if (value < 0) value = 0;
else if (value > this.max - this.min) value = this.max - this.min;
if (this.max == this.min) value = 0;
else value /= (this.max - this.min);
this.frac = value;
this._set_frac();
}
obj.vertical = vertical;
obj.set_size = function (w, h) {
this.width = w;
this.height = h;
this.children[0].set_size(w, h);
if (this._with_progress) {
this.children[3].set_size(w, h);
} else {
this.children[2].set_size(w, h);
}
this._set_frac();
this.set_progress(this.prog);
}
obj.min = 0;
obj.max = 100;
obj.move = function (x, y) {
this.translation.x = x;
this.translation.y = y;
}
obj.on_event = function (x, y) { return false; }
obj.prog = 0;
obj.frac = 0;
obj.set_size(vertical ? 10 : 200, vertical ? 200 : 10);
gw_add_child(parent, obj);
return obj;
}
function gw_new_slider(parent, vertical, class_name) {
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'Slider');
if (arguments.length <= 2) class_name = 'progress';
if (arguments.length <= 1) vertical = false;
obj.children[0] = gw_new_rectangle(class_name, 'normal');
obj.children[1] = gw_new_rectangle(class_name, 'over');
obj.children[2] = gw_new_rectangle(class_name, 'invisible');
var ps2d = new SFNode('PlaneSensor2D');
obj.children[2].children[1] = ps2d;
ps2d.maxPosition.x = -1;
ps2d.maxPosition.y = -1;
obj.on_slide = function (value, type) { }
obj.slide_active = function (val) {
this.on_slide(this.min + (this.max - this.min) * this.frac, val ? 1 : 2);
}
Browser.addRoute(ps2d, 'isActive', obj, obj.slide_active);
obj.set_trackpoint = function (value) {
if (vertical) {
if (this.height == this.children[1].height) return;
this.frac = value.y / (this.height - this.children[1].height);
} else {
if (this.width == this.children[1].width) return;
this.frac = value.x / (this.width - this.children[1].width);
}
this.frac += 0.5;
if (this.frac > 1) this.frac = 1;
else if (this.frac < 0) this.frac = 0;
if (vertical) {
value.y = (this.frac - 0.5) * (this.height - this.children[1].height);
value.x = 0;
} else {
value.x = (this.frac - 0.5) * (this.width - this.children[1].width);
value.y = 0;
}
this.children[1].translation = value;
this.on_slide(this.min + (this.max - this.min) * this.frac, 0);
}
Browser.addRoute(ps2d, 'trackPoint_changed', obj, obj.set_trackpoint);
obj.set_value = function (value) {
if (this.children[2].isActive) return;
value -= this.min;
if (value < 0) value = 0;
else if (value > this.max - this.min) value = this.max - this.min;
if (this.max == this.min) value = 0;
else value /= (this.max - this.min);
this.frac = value;
value -= 0.5;
value *= (vertical ? this.height : this.width);
if (vertical) {
this.children[1].translation.y = value;
} else {
this.children[1].translation.x = value;
}
}
obj.vertical = vertical;
obj.set_size = function (w, h, cursor_w, cursor_h) {
if (this.height && this.width) {
if (this.vertical) {
this.children[1].translation.y *= h;
this.children[1].translation.y /= this.height;
} else {
this.children[1].translation.x *= w;
this.children[1].translation.x /= this.width;
}
}
this.width = w;
this.height = h;
this.children[0].set_size(w, h);
if (typeof (cursor_w) == 'undefined') cursor_w = this.children[1].width;
if (typeof (cursor_h) == 'undefined') cursor_h = this.children[1].height;
this.children[1].set_size(cursor_w, cursor_h);
if (this.vertical) {
this.children[2].set_size(this.children[1].width, h);
} else {
this.children[2].set_size(w, this.children[1].height);
}
}
obj.set_cursor_size = function (w, h) {
this.children[1].set_size(w, h);
}
obj.min = 0;
obj.max = 100;
obj.frac = 0.0;
obj.height = 0;
obj.width = 0;
obj.set_size(vertical ? 10 : 200, vertical ? 200 : 10, 10, 10);
obj.set_trackpoint(0);
obj.move = function (x, y) {
this.translation.x = x;
this.translation.y = y;
}
obj.on_event = function (x, y) { return false; }
gw_add_child(parent, obj);
return obj;
}
function gw_new_text_edit(parent, text_data) {
var obj = new SFNode('Transform2D');
var rect, edit;
setup_gw_object(obj, 'TextEdit');
rect = gw_new_rectangle('edit');
gw_add_child(obj, rect);
gw_object_set_hitable(rect);
rect.on_down = function (val) {
if (val) gpac.set_focus(this.parent.children[1]);
}
edit = gw_new_text(obj, text_data, 'edit')
// gw_add_child(obj, edit);
obj.on_text = null;
obj._text_edited = function (val) {
if (this.on_text) this.on_text(val[0]);
};
Browser.addRoute(obj.children[1].children[0].children[0].geometry, 'string', obj, obj._text_edited);
obj.set_size = function (w, h) {
this.width = w;
this.height = h;
this.children[0].set_size(w, h);
this.children[1].move(5 - w / 2, 0);
};
obj.on_event = function (x, y) { return false; }
gw_add_child(parent, obj);
return obj;
}
function gw_new_text_area(parent, text_data) {
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'TextArea');
obj.children[0] = new SFNode('Layout');
obj.children[0].parent = obj;
obj.children[0].wrap = true;
obj.children[0].spacing = 1.1;
obj.children[0].justify[0] = "JUSTIFY";
obj.children[0].justify[1] = "FIRST";
gw_new_text(obj.children[0], text_data, 'text');
obj.set_size = function (width, height) {
this.children[0].size.x = width;
this.children[0].size.y = height;
this.width = width;
this.height = height;
}
obj.set_content = function (text) {
this.children[0].children[0].set_label(text);
}
obj.on_event = function (x, y) { return false; }
gw_add_child(parent, obj);
return obj;
}
function gw_new_scrolltext_area(parent, text_data) {
var obj = gw_new_text_area(parent, text_data);
/*erase the resize routine*/
obj._orig_set_size = obj.set_size;
obj.set_size = function (width, height) {
var bounds = this._bounds;
this.width = width;
this.height = Math.ceil(bounds.height);
this._orig_set_size(width, height);
}
obj.set_content = function (text) {
this.set_label(text);
}
return obj;
}
function gw_new_window_full(parent, offscreen, the_label, child_to_insert) {
var wnd = gw_new_window(parent, offscreen, true);
if (arguments.length <= 3) child_to_insert = null;
if (child_to_insert) {
gw_add_child(wnd, child_to_insert);
}
wnd.area = null;
wnd.tools = gw_new_grid_container(wnd);
wnd.tools._name = 'ToolBar';
wnd._has_extra_tools = false;
wnd.label = null;
if (the_label) {
wnd.label = gw_new_text(wnd.tools, the_label, 'window');
wnd.label._name = 'Label';
}
wnd.set_label = function (label) {
if (wnd.label) wnd.label.set_label(label);
}
wnd.add_tool = function (icon, name) {
var tool;
if (typeof gwskin.images[icon] != 'undefined') {
tool = gw_new_icon(this.tools, icon);
} else {
tool = gw_new_icon_button(this.tools, icon, name, false, 'icon');
}
if (this.label) {
this.tools.remove_child(this.label);
this.tools.add_child(this.label);
}
tool.set_size(gwskin.default_icon_height, gwskin.default_icon_height);
tool._name = name;
tool.dlg = this;
this._has_extra_tools = true;
return tool;
}
var icon = wnd.add_tool('close');
icon.on_click = function () {
this.dlg.close();
}
wnd._has_extra_tools = false;
wnd._pre_destroy = function () {
if (typeof this.predestroy != 'undefined') this.predestroy();
this.tools = null;
this.label = null;
this.area = null;
this._wnd_close();
}
wnd.on_size = null;
wnd.layout = function (width, height) {
var i;
var tools = this.tools.get_children();
var tool_size = gwskin.default_icon_height;
if (this.on_size) this.on_size(width, height - tool_size);
if (this.area) {
this.area.set_size(width, height - tool_size);
this.area.move(0, (this.area.height - height) / 2);
}
for (i = 0; i < tools.length; i++) {
tools[i].set_size(tool_size, tool_size);
}
if (this.label) {
var textw = width;
for (i = 0; i < tools.length; i++) {
if ((tools[i] != this.label) && tools[i].visible)
textw -= tools[i].width;
}
textw -= tool_size;
if (textw < 0) textw = 0;
this.label.set_size(textw, tool_size);
this.label.set_width(textw);
}
this.tools.move(0, (height - tool_size) / 2);
this.tools.set_size(width, tool_size);
}
wnd.on_event = function (evt) {
if ((evt.type == GF_EVENT_KEYUP) && (evt.keycode == gwskin.keys.close)) {
this.close();
return 1;
}
if ((evt.type == GF_EVENT_KEYUP) && (evt.keycode == gwskin.keys.validate)) {
if (typeof this.on_validate == 'function') {
this.on_validate();
return 1;
}
return 0;
}
if (!this._has_extra_tools) {
if (this.area) return this.area.on_event(evt);
return false;
}
if (!this.area) {
return this.tools.on_event(evt);
}
var is_left_or_right = (evt.type == GF_EVENT_KEYDOWN) && ((evt.keycode == 'Left') || (evt.keycode == 'Right')) ? 1 : 0;
if (this._focus_is_tools) {
if (this.tools.on_event(evt)) return 1;
if (this.area.on_event(evt)) {
//focus no longer on toolbar but on main content (means this is 'right'), switch order
if (is_left_or_right) {
this._focus_is_tools = false;
}
return 1;
}
} else {
if (this.area.on_event(evt)) return 1;
if (this.tools.on_event(evt)) {
//focus no longer on main but on toolbar content (means this is 'left'), switch order
if (is_left_or_right) {
this._focus_is_tools = true;
}
return 1;
}
}
return 0;
}
wnd._focus_is_tools = true;
return wnd;
}
function gw_new_message(container, label, content) {
var notif = gw_new_window_full(container, true, label);
notif.area = gw_new_text_area(notif, content);
notif.on_size = function (width, height) {
this.area.set_size(width - 10, height);
}
notif.set_size(0.8 * gw_display_width, 120);
notif.timer = gw_new_timer(false);
notif.timer.wnd = notif;
notif.timer.set_timeout(gwskin.default_message_timeout, false);
notif.timer.start(0);
notif.timer.on_active = function (val) {
if (!val) this.wnd.close();
}
notif.show_effect = 'notif';
notif._no_focus = true;
return notif;
}
function gw_new_confirm_wnd(container, label, confirm_yes, confirm_no) {
if (arguments.length < 4) confirm_no = 'no';
if (arguments.length < 3) confirm_yes = 'yes';
var notif = gw_new_window_full(container, true, label);
notif.area = gw_new_grid_container(notif);
notif.area.spread_h = true;
notif.on_confirm = null;
notif.btn_yes = gw_new_button(notif.area, confirm_yes);
notif.btn_yes.dlg = notif;
notif.btn_yes.on_click = function () {
if (this.dlg.on_confirm) this.dlg.on_confirm(true);
this.dlg.close();
}
notif.btn_no = gw_new_button(notif.area, confirm_no);
notif.btn_no.dlg = notif;
notif.btn_no.on_click = function () {
if (this.dlg.on_confirm) this.dlg.on_confirm(false);
this.dlg.close();
}
notif.on_close = function () {
if (this.on_confirm) this.on_confirm(false);
}
notif.on_display_size = function (width, height) {
var w = 0.9*width;
if (w>500) w=500;
this.btn_yes.set_size(w / 3, gwskin.default_control_height);
this.btn_no.set_size(w / 3, gwskin.default_control_height);
this.set_size(w, 2 * gwskin.default_control_height);
}
notif.on_display_size(gw_display_width, gw_display_height);
return notif;
}
function gw_guess_mime_icon(name)
{
var ext = name.split('.').pop();
var reg = new RegExp(' ' + ext + ' ', "gi");
//check default extensions
if (gwskin.mime_video_default_ext.match(reg)) return gwskin.images.mime_video;
else if (gwskin.mime_audio_default_ext.match(reg)) return gwskin.images.mime_audio;
else if (gwskin.mime_image_default_ext.match(reg)) return gwskin.images.mime_image;
else if (gwskin.mime_model_default_ext.match(reg)) return gwskin.images.mime_model;
var idx = 0;
while (1) {
var mime = gpac.get_option('MimeTypes', idx);
if (mime == null) break;
idx++;
var mime_ext = gpac.get_option('MimeTypes', mime).split('"')[1];
if (!mime_ext.match(reg)) continue;
if (mime.indexOf('video') != -1) return gwskin.images.mime_video;
else if (mime.indexOf('audio') != -1) return gwskin.images.mime_audio;
else if (mime.indexOf('model') != -1) return gwskin.images.mime_model;
else if (mime.indexOf('image') != -1) return gwskin.images.mime_image;
else if (mime.indexOf('application') != -1) return gwskin.images.mime_model;
break;
}
return gwskin.images.mime_generic;
}
function gw_new_file_dialog(container, label) {
var dlg = gw_new_window_full(container, true, label);
dlg.area = gw_new_grid_container(dlg);
dlg.area.break_at_line = true;
dlg.area.dlg = dlg;
dlg.on_close = function () {
if (this.do_sort_wnd) {
this.do_sort_wnd.close();
}
if (this.on_browse) {
this.on_browse(null, false);
}
}
dlg._sort_type = 0;
dlg.do_sort = function (value) {
this._page_idx = 0;
this._max_page_idx = 0;
switch (value) {
case 0:
this.area._all_children.sort(function (a, b) { var A = a.filename.toLowerCase(); var B = b.filename.toLowerCase(); if (A > B) { return 1; } else if (A < B) { return -1; } else return 0; });
break;
case 1:
this.area._all_children.sort(function (b, a) { var A = a.filename.toLowerCase(); var B = b.filename.toLowerCase(); if (A > B) { return 1; } else if (A < B) { return -1; } else return 0; });
break;
case 2:
this.area._all_children.sort(function (a, b) { return a.size - b.size });
break;
case 3:
this.area._all_children.sort(function (a, b) { return b.size - a.size });
break;
case 4:
this.area._all_children.sort(function (a, b) { return a.date - b.date });
break;
case 5:
this.area._all_children.sort(function (a, b) { return b.date - a.date });
break;
}
this.area.layout();
}
dlg.go_up = dlg.add_tool('up');
dlg.go_up.on_click = function () {
this.dlg._browse(null, true);
}
dlg.go_prev = dlg.add_tool('previous');
dlg.go_prev.on_click = function () {
this.dlg.area._move_page(-1);
}
dlg.go_next = dlg.add_tool('next');
dlg.go_next.on_click = function () {
this.dlg.area._move_page(1);
}
dlg.go_root = dlg.add_tool('device');
dlg.go_root.on_click = function () {
this.dlg._browse('/');
}
dlg.sort = dlg.add_tool('sort');
dlg.sort_wnd = null;
dlg.sort.on_click = function() {
if (this.dlg.sort_wnd) {
this.dlg.sort_wnd.close();
this.dlg.sort_wnd = null;
return;
}
var wnd = gw_new_popup(this.dlg.sort, 'down');
this.dlg.sort_wnd = wnd;
wnd.dlg = this.dlg;
wnd.on_close = function() {
this.dlg.sort_wnd = null;
}
wnd.add_menu_item('by Name', function () {
var wnd = this.dlg;
if (wnd._sort_type==0) wnd._sort_type = 1;
else wnd._sort_type = 0;
wnd.do_sort(wnd._sort_type);
} );
wnd.add_menu_item('by Size', function () {
var wnd = this.dlg;
if (wnd._sort_type==2) wnd._sort_type = 3;
else wnd._sort_type = 2;
wnd.do_sort(wnd._sort_type);
} );
wnd.add_menu_item('by Date', function () {
var wnd = this.dlg;
if (wnd._sort_type==4) wnd._sort_type = 5;
else wnd._sort_type = 4;
wnd.do_sort(wnd._sort_type);
} );
wnd.on_display_size(gw_display_width, gw_display_height);
wnd.show();
}
dlg.predestroy = function () {
this.go_up = null;
this.go_next = null;
this.go_prev = null;
this.go_root = null;
this.area.dlg = null;
}
dlg.directory = '';
dlg.show_directory = false;
dlg.filter = '*';
dlg._on_dir_browse = function () {
if (this.path) {
this.dlg._browse(this.path, false);
} else {
this.dlg._browse(this.dlg.path + this.filename, false);
}
}
dlg._on_file_select = function () {
if (this.dlg.on_browse) {
if (this.path) {
this.dlg.on_browse(this.path, null);
} else {
this.dlg.on_browse(this.dlg.path + this.filename, this.dlg.directory);
}
}
this.dlg.close();
}
dlg.area.on_page_changed = function () {
if (this.is_first_page()) this.dlg.go_prev.disable();
else this.dlg.go_prev.enable();
if (this.is_last_page()) this.dlg.go_next.disable();
else this.dlg.go_next.enable();
this.dlg.tools.layout(this.dlg.tools.width, this.dlg.tools.height);
}
dlg.on_long_click = null;
dlg.browse = function (dir) {
if (typeof dir == 'string') this.directory = dir;
this._browse(dir, false);
}
dlg._browse = function (dir, up) {
var w, h, i, y;
var filelist;
var is_listing = ((dir==null) || (typeof dir == 'string')) ? false : true;
if (is_listing) {
filelist = dir;
this.path = null;
} else {
if (dir) this.directory = dir;
if (up && !this.path) up = false;
filelist = gpac.enum_directory(this.directory, this.filter, up);
if (filelist.length) {
this.directory = filelist[0].path;
this.set_label(this.directory);
} else {
this.set_label('');
}
this.path = filelist.length ? filelist[0].path : '';
}
this.area.reset_children();
for (i = 0; i < filelist.length; i++) {
if (!is_listing && (filelist[i].hidden || filelist[i].system)) continue;
var icon_name = gwskin.images.mime_generic;
if ( (!is_listing || (typeof filelist[i].directory == 'boolean')) && (filelist[i].directory || (filelist[i].name.indexOf('.') < 0))) {
if (filelist[i].drive) icon_name = gwskin.images.drive;
else icon_name = gwskin.images.folder;
} else {
icon_name = gw_guess_mime_icon(is_listing ? filelist[i].path : filelist[i].name);
}
var item = gw_new_icon_button(this.area, icon_name, filelist[i].name, true, 'listitem');
item.dlg = this;
item.filename = filelist[i].name;
item.directory = filelist[i].directory;
item.set_size(this.width, gwskin.default_control_height);
item.path = is_listing ? filelist[i].path : null;
item.size = typeof filelist[i].size != 'undefined' ? filelist[i].size : 0;
item.date = typeof filelist[i].last_modified != 'undefined' ? filelist[i].last_modified : 0;
if (filelist[i].directory) {
item.on_click = this._on_dir_browse;
} else {
item.on_click = this._on_file_select;
}
item.on_long_click = function () {
if (this.dlg.on_long_click) {
var path = this.path ? this.path : (this.dlg.directory + this.filename);
this.dlg.on_long_click(this.filename, path, this.directory);
}
}
}
this.do_sort(this._sort_type);
if (this.directory == '/') this.go_up.disable();
else this.go_up.enable();
this.tools.layout(this.tools.width, this.tools.height);
}
dlg.on_size = function (width, height) {
var __children = this.area.get_children();
for (var i = 0; i < __children.length; i++) {
__children[i].set_size(width, gwskin.default_control_height);
}
this.area.set_size(width, height);
}
return dlg;
}
function gw_new_plotter(parent) {
var touch;
var obj = new SFNode('Transform2D');
setup_gw_object(obj, 'Plotter');
obj.children[0] = new SFNode('Layer2D');
var class_name = 'plot';
obj.children[0].children[0] = gw_new_rectangle(class_name, 'normal');
obj.set_size = function (width, height) {
this.children[0].size.x = width;
this.children[0].size.y = height;
this.children[0].children[0].set_size(width, height);
var w = 1;
var h = 1;
for (var i = 0; i < this.series.length; i++) {
var s = this.series[i];
s.scale = new SFVec2f(width - this.label_width, height);
s.but.set_size(this.label_width, 0.9*gwskin.default_text_font_size);
s.but.set_font_size(0.9 * gwskin.default_text_font_size);
s.translation.x = -this.label_width / 2;
}
this.width = width;
this.height = height;
}
obj.label_width = 120;
obj.series = [];
obj.add_serie = function (legend, units, r, g, b) {
var s = gw_new_curve2d('plot');
s.set_color(r, g, b);
s.dlg = this;
s.legend = legend;
s.units = units;
s.max_y = 0;
s.nb_refresh = 0;
s.refresh_serie = function (serie, name_x, name_y, nb_x, factor) {
var s = serie[0];
var count = serie.length;
var first_x = s[name_x];
this.nb_refresh += 1;
if (this.nb_refresh == 50) {
this.max_y = 0;
this.nb_refresh += 1;
}
var max_y = this.max_y;
if (!factor) factor = 1;
for (var i = 0; i < serie.length; i++) {
var s = serie[i];
if (max_y < s[name_y]) max_y = s[name_y];
}
s = serie[0];
this.reset();
for (var i = 0; i < count; i++) {
s = serie[i];
//get x and y between -0.5 and 0.5, and scale to width
var x = s[name_x] - first_x;
x /= nb_x;
x -= 0.5;
//x *= 0.9;
var y = s[name_y];
if (max_y) y /= max_y;
y = -0.9 / 2 + 0.9 * y / factor;
if (i) {
this.add_line_to(x, y);
} else {
this.add_move_to(x, y);
}
if (i + 1 == count) {
this.but.move(0.5 * this.dlg.width - this.but.width / 2, (-0.9 / 2 + 0.9 / factor) * this.dlg.height);
this.but.set_label('' + this.legend + ':' + s[name_y] + ' ' + units);
this.but.show();
}
}
}
this.children[0].children[this.children[0].children.length] = s;
this.series.push(s);
s.scale.x = this.width;
s.scale.y = this.height;
s.but = gw_new_text(this, '' + legend, 'custom');
s.but.set_align('END');
s.but.set_color(r, g, b);
s.but.set_size(this.label_width, gwskin.default_text_font_size);
s.but.hide();
return s;
}
gw_add_child(parent, obj);
return obj;
}
function gw_new_popup(anchor, type)
{
var popup = gw_new_window(null, true, false, 'popup');
popup.area = gw_new_grid_container(popup);
popup.anchor = anchor;
popup.type = (type=='up') ? 0 : 1;
popup._nb_over = 0;
popup.add_menu_item = function (label, callback) {
var item = gw_new_button(this.area, label, 'window');
item.wnd = this;
item.on_click = function () {
callback.call(this.wnd);
this.wnd.close();
}
item.on_over_ex = function (value) {
this.wnd.update_visibility();
}
item.new_over_handler(item.on_over_ex);
item.set_corners(false, false, false, false);
return item;
}
popup.reposition = function() {
var pos = gw_get_adjusted_abs_pos(this.anchor, this.width, this.height, this.type);
this.move(pos.x, pos.y);
}
popup.update_visibility = function() {
var nb_over = 0;
var children = this.area.get_children();
for (var i=0; i<children.length; i++) {
if (children[i]._over) nb_over++;
}
if (!nb_over) this.close();
}
popup.on_display_size = function (w, h) {
var children = this.area.get_children();
var max_s = 0;
for (var i=0; i<children.length; i++) {
var s = children[i].get_label().length;
if (s>max_s) max_s = s;
}
for (var i=0; i<children.length; i++) {
children[i].set_size(s * 0.9*gwskin.default_text_font_size, gwskin.default_icon_height);
}
this.area.set_size(s * gwskin.default_text_font_size, children.length * gwskin.default_icon_height);
this.set_size(s * gwskin.default_text_font_size, children.length * gwskin.default_icon_height);
this.reposition();
}
gw_ui_root.has_popup = true;
popup.set_alpha(0.9);
return popup;
}