gui/gui_old.js (1,717 lines of code) (raw):

///////////////////////////////////////////////////////////////////////////////// // // Authors: // Jean Le Feuvre, Telecom ParisTech // Jean-Claude Dufourd, Telecom ParisTech // ///////////////////////////////////////////////////////////////////////////////// UPnP_Enabled = false; function new_extension() { var obj = new Object(); obj.type = 'extension'; return obj; } function on_movie_duration(value) { UPnP.MovieDuration = value; } function on_movie_time(value) { UPnP.MovieTime = value; current_time = value; } //function filter_event(evt) //{ // alert('event'); //} //Initialize the main UI script function initialize() { //var icon; var i, count, wid; gpac.caption = 'Osmo4'; current_time = 0; display_width = parseInt(gpac.get_option('General', 'LastWidth')); display_height = parseInt(gpac.get_option('General', 'LastHeight')); if (!gpac.fullscreen && display_width && display_height) { gpac.set_size(display_width, display_height); } else { display_width = gpac.get_screen_width(); display_height = gpac.get_screen_height(); } //request event listeners on the window - GPAC specific BIFS extensions !!! root.addEventListener('resize', on_resize, 0); root.addEventListener('zoom', on_zoom, 0); root.addEventListener('scroll', on_scroll, 0); Browser.addRoute(movie_sensor, 'mediaDuration', movie_sensor, on_movie_duration); Browser.addRoute(movie_sensor, 'mediaCurrentTime', movie_sensor, on_movie_time); // gpac.set_event_filter(filter_event); widget_default_size = 200; scene_width = 0; icon_size = 48; dock_height = 48; info_height = 32; toggle_bar_height = 16; screen_dpi = gpac.get_horizontal_dpi(); widget_remote_candidate = null; controlled_renderer = null; UPnP_Enabled = eval("(typeof(UPnP) != 'undefined');"); if (UPnP_Enabled) { UPnP.onMediaRendererAdd = onMediaRendererAdd; UPnP.onMediaConnect = onMediaConnect; UPnP.onMediaStop = onMediaStop; UPnP.onMediaPause = onMediaPause; UPnP.onMediaPlay = onMediaPlay; UPnP.onMediaSeek = OnMediaSeek; UPnP.onMigrate = OnMediaMigrate; UPnP.BindRenderer(); upnp_renders = null; UPnP.MovieURL = ''; UPnP.MovieDuration = 0.0; UPnP.MovieTime = 0.0; } /*setup dock*/ widget_ui_visible = false; /*widget subtree*/ widget_display = new SFNode('Transform2D'); ui_root.children[0] = widget_display; /*widget manager page*/ widget_ui = new SFNode('Layer2D'); ui_root.children[1] = widget_ui; /*all other UI elements subtree*/ dlg_display = new SFNode('Transform2D'); ui_root.children[2] = dlg_display; infobar = text_label('', 'MIDDLE'); ui_root.children[3] = infobar; /*our dock*/ dock = new SFNode('Transform2D'); ui_root.children[4] = dock; nb_widgets_on_screen = 0; first_visible_widget = 0; setup_icons(); /*init the widget manager*/ Browser.loadScript('mpegu-core.js', true); log_level = l_inf; widget_manager_init(); if (typeof(WidgetManager) != 'undefined') { WidgetManager.on_widget_remove = widget_remove; WidgetManager.on_widget_add = widget_insert; WidgetManager.coreOutSetSize = widget_request_size; WidgetManager.coreOutShow = widget_request_show; WidgetManager.coreOutHide = widget_request_hide; WidgetManager.coreOutRequestActivate = widget_request_activate; WidgetManager.coreOutRequestDeactivate = widget_request_deactivate; WidgetManager.coreOutShowNotification = widget_request_notification; WidgetManager.coreOutPlaceComponent = widget_place_component; WidgetManager.coreOutGetAttention = widget_request_attention; WidgetManager.coreOutInstallWidget = widget_request_install; WidgetManager.coreOutMigrateComponent = widget_migrate_component; WidgetManager.coreOutRequestMigrationTargets = widget_migration_targets; WidgetManager.coreOutActivateTemporaryWidget = widget_activate_temporary_widget; /*restore our widgets*/ widgets_init(); } /*extensions are no longer usable with old GUI as we changed the gwlib interfaces*/ /*init all extensions*/ /* var list = gpac.enum_directory('extensions', '*', 0); for (i=0; i<list.length; i++) { if (list[i].directory) { var extension = new_extension(); extension.path = gpac.current_path + 'extensions/' + list[i].name+'/'; log(l_inf, 'Loading UI extension '+list[i].name); Browser.loadScript('extensions/'+list[i].name+'/init.js', true); setup_extension(extension); if (extension.icon && extension.launch) { var icon = icon_button(extension.path+extension.icon, extension.label, 0); icon.extension = extension; icon.button_click = function () { this.extension.launch(this.extension); } dock.children[dock.children.length] = icon; } } } */ current_url = ''; //let's do the layout layout(); // set_movie_url("rtsp://localhost/video.mp4", 1, 0); } function gpacui_add_icon(icon_url, label, callback) { var icon = icon_button(icon_url, label, 0); icon.button_click = callback; dock.children[dock.children.length] = icon; } function gpacui_show_window(obj) { dlg_display.addChildren[0] = obj; layout(); } function gpacui_hide_window(obj) { dlg_display.removeChildren[0] = obj; layout(); } function set_movie_url(url, set_local, set_remote) { if (set_remote && (controlled_renderer==null) ) set_local = true; if (set_local) { movie.children[0].url[0] = url; movie_ctrl.url[0] = url; movie_sensor.url[0] = url; if (UPnP_Enabled) UPnP.MovieURL = url; } if (set_remote && (controlled_renderer!=null) ) { var uri = UPnP.ShareResource(url); controlled_renderer.Open(uri); } current_url = url; } function new_timeout(time) { var obj = new SFNode('TimeSensor'); obj.cycleInterval = time; obj.start = function(when) { var t = this.getTime(); this.startTime = when + this.getTime(); } obj.stop = function(when) { this.stopTime = when + this.getTime(); } obj.on_event = null; obj.event = function(val) { if (this.on_event) this.on_event(val); } Browser.addRoute(obj, 'fraction_changed', obj, obj.event); return obj; } function rectangle() { var obj = new SFNode('Shape'); obj.appearance = new SFNode('Appearance'); obj.appearance.material = new SFNode('Material2D'); obj.appearance.material.filled = TRUE; obj.appearance.material.emissiveColor = new SFColor(0.7, 0.7, 0.8); obj.appearance.material.lineProps = new SFNode('LineProperties'); obj.appearance.material.lineProps.width = 2; obj.appearance.material.lineProps.lineColor = new SFColor(0, 0, 0); obj.geometry = new SFNode('Curve2D'); obj.geometry.point = new SFNode('Coordinate2D'); temp = obj.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*/ obj.set_size = function(w, h) { var hw, hh, rx, ry; var temp; hw = w/2; hh = h/2; /*compute default rx/ry*/ ry = rx = 10; if ( (2*rx>=hw) || (2*ry>=hh)) rx = ry = 6; temp = this.geometry.point.point; temp[0] = new SFVec2f(hw-rx, hh); temp[1] = new SFVec2f(hw, hh);/*bezier ctrl point*/ temp[2] = new SFVec2f(hw, hh-ry); temp[3] = new SFVec2f(hw, -hh+ry); temp[4] = new SFVec2f(hw, -hh);/*bezier control point*/ temp[5] = new SFVec2f(hw-rx, -hh); temp[6] = new SFVec2f(-hw+rx, -hh); temp[7] = new SFVec2f(-hw, -hh);/*bezier control point*/ temp[8] = new SFVec2f(-hw, -hh+ry); temp[9] = new SFVec2f(-hw, hh-ry); temp[10] = new SFVec2f(-hw, hh);/*bezier control point*/ temp[11] = new SFVec2f(-hw+rx, hh); } obj.set_color = function(r, g, b) { this.appearance.material.emissiveColor.r = r; this.appearance.material.emissiveColor.g = g; this.appearance.material.emissiveColor.b = b; } return obj; } function icon_button(url, label, no_back) { var obj = new SFNode('Transform2D'); obj.visible = true; obj.children[0] = new SFNode('Transform2D'); obj.children[0].scale.x = 0; obj.children[0].children[0] = rectangle(); obj.children[1] = new SFNode('Layer2D'); obj.children[1].size.x = icon_size; obj.children[1].size.y = icon_size; obj.children[1].children[0] = new SFNode('Inline'); obj.children[1].children[0].url[0] = url; obj.touch = new SFNode('TouchSensor'); obj.children[1].children[1] = obj.touch; obj.button_click = NULL; obj.down = false; obj.over = false; obj.on_active = function(value) { if (value) { this.down = true; } else { if (this.down && this.over && this.button_click) this.button_click(); this.down = false; } }; obj.button_over = on_icon_over; obj.on_over = function(value) { this.over = value; if (!no_back) this.children[0].scale.x = value ? 1 : 0; if (this.button_over) this.button_over(value); }; Browser.addRoute(obj.touch, 'isOver', obj, obj.on_over); Browser.addRoute(obj.touch, 'isActive', obj, obj.on_active); obj.label = label; obj.hide = function() { this.scale.x = this.scale.y = 0; this.visible = false; }; obj.show = function() { this.scale.x = this.scale.y = 1; this.visible = true; }; obj.set_size = function(x, y) { this.children[0].children[0].set_size(x, y); this.children[1].size.x = x; this.children[1].size.y = y; }; return obj; } function text_label(label, justify) { var obj = new SFNode('Transform2D'); obj.children[0] = new SFNode('Shape'); obj.children[0].appearance = new SFNode('Appearance'); obj.children[0].appearance.material = new SFNode('Material2D'); obj.children[0].appearance.material.filled = TRUE; obj.children[0].appearance.material.emissiveColor = new SFColor(0, 0, 0); obj.children[0].geometry = new SFNode('Text'); obj.children[0].geometry.string[0] = label; obj.children[0].geometry.fontStyle = new SFNode('FontStyle'); obj.children[0].geometry.fontStyle.justify[0] = justify; obj.children[0].geometry.fontStyle.justify[1] = 'MIDDLE'; obj.children[0].geometry.fontStyle.size = 20; obj.set_label = function(value) { this.children[0].geometry.string[0] = value; } return obj; } function text_rect(label) { var obj = new SFNode('Transform2D'); obj.children[0] = rectangle(); obj.children[0].set_color(0.7, 0.7, 0.8); obj.children[1] = new SFNode('Shape'); obj.children[1].appearance = new SFNode('Appearance'); obj.children[1].appearance.material = new SFNode('Material2D'); obj.children[1].appearance.material.filled = TRUE; obj.children[1].appearance.material.emissiveColor = new SFColor(0, 0, 0); obj.children[1].geometry = new SFNode('Text'); obj.children[1].geometry.string[0] = label; obj.children[1].geometry.fontStyle = new SFNode('FontStyle'); obj.children[1].geometry.fontStyle.justify[0] = 'MIDDLE'; obj.children[1].geometry.fontStyle.justify[1] = 'MIDDLE'; obj.children[1].geometry.fontStyle.size = 20; obj.children[2] = new SFNode('TouchSensor'); obj.set_size = function(w, h) { this.children[0].set_size(w, h); }; obj.over = false; obj.on_over = function(value) { this.children[0].set_color(0.7, value ? 0.5 : 0.7, 0.8); this.over = value; }; Browser.addRoute(obj.children[2], 'isOver', obj, obj.on_over); obj.down = false; obj.button_click = null; obj.on_active = function(value) { if (value) { this.down = true; } else { if (this.down && this.over && this.button_click) this.button_click(); this.down = false; } }; Browser.addRoute(obj.children[2], 'isActive', obj, obj.on_active); return obj; } function new_slider(vertical) { var obj = new SFNode('Transform2D'); obj.children[0] = new SFNode('Shape'); obj.children[0].appearance = new SFNode('Appearance'); obj.children[0].appearance.material = new SFNode('Material2D'); obj.children[0].appearance.material.filled = TRUE; obj.children[0].appearance.texture = new SFNode('LinearGradient'); obj.children[0].appearance.texture.endPoint.x = vertical ? 1 : 0; obj.children[0].appearance.texture.endPoint.y = vertical ? 0 : 1; obj.children[0].appearance.texture.key[0] = 0; obj.children[0].appearance.texture.key[1] = 0.5; obj.children[0].appearance.texture.key[2] = 1; obj.children[0].appearance.texture.keyValue[0] = new SFColor(0.4, 0.4, 0.6); obj.children[0].appearance.texture.keyValue[1] = new SFColor(0.4, 0.4, 1); obj.children[0].appearance.texture.keyValue[2] = new SFColor(0.4, 0.4, 0.6); obj.children[0].geometry = new SFNode('Rectangle'); obj.children[1] = new SFNode('Transform2D'); obj.children[1].children[0] = new SFNode('Shape'); obj.children[1].children[0].appearance = new SFNode('Appearance'); obj.children[1].children[0].appearance.material = new SFNode('Material2D'); obj.children[1].children[0].appearance.material.filled = TRUE; obj.children[1].children[0].appearance.material.emissiveColor = new SFColor(0, 0, 1); obj.children[1].children[0].geometry = new SFNode('Circle'); obj.on_slide = function(value) { } obj.children[2] = new SFNode('PlaneSensor2D'); obj.set_translation = function(value) { this.frac = 0.5 + (vertical ? value.y/this.height : value.x/this.width); this.children[1].translation = value; this.on_slide(this.min + (this.max-this.min) * this.frac); } Browser.addRoute(obj.children[2], 'translation_changed', obj, obj.set_translation); obj.set_value = function(value) { 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); value -= 0.5; value *= (vertical ? this.height : this.width); if (vertical) { this.children[1].translation.y = value; this.children[2].offset.y = value; } else { this.children[1].translation.x = value; this.children[2].offset.x = value; } } obj.radius = 10; obj.vertical = vertical; obj.set_size = function(w, h) { var rad; this.children[0].geometry.size.x = w; this.children[0].geometry.size.y = h; rad = vertical ? w : h; rad/=1.33; this.children[1].children[0].geometry.radius = rad; this.children[2].maxPosition.x = this.vertical ? 0 : w/2; this.children[2].maxPosition.y = this.vertical ? h/2 : 0; this.children[2].minPosition.x = this.vertical ? 0 : -w/2; this.children[2].minPosition.y = this.vertical ? -h/2 : 0; this.width = w; this.height = h; } obj.min = 0; obj.max = 100; obj.set_size(vertical ? 10 : 200, vertical ? 200 : 10); return obj; } function new_radio_button(label) { var obj = new SFNode('Transform2D'); obj.children[0] = new SFNode('Shape'); obj.children[0].appearance = new SFNode('Appearance'); obj.children[0].appearance.material = new SFNode('Material2D'); obj.children[0].appearance.material.filled = TRUE; obj.children[0].appearance.material.emissiveColor = new SFColor(1, 1, 1); obj.children[0].appearance.material.lineProps = new SFNode('LineProperties'); obj.children[0].appearance.material.lineProps.lineColor = new SFColor(0, 0, 0); obj.children[0].appearance.material.lineProps.width = 1; obj.children[0].geometry = new SFNode('Circle'); obj.children[1] = new SFNode('Shape'); obj.children[1].appearance = new SFNode('Appearance'); obj.children[1].appearance.material = new SFNode('Material2D'); obj.children[1].appearance.material.filled = TRUE; obj.children[1].appearance.material.emissiveColor = new SFColor(0, 0, 0); obj.children[1].appearance.material.transparency = 1; obj.children[1].geometry = new SFNode('Circle'); obj.children[2] = text_label(label, 'BEGIN'); obj.children[3] = new SFNode ('TouchSensor'); obj.on = false; obj.on_select = function(value) {} obj.on_active = function(value) { if (!value) return; this.on = !this.on; this.children[1].appearance.material.transparency = this.on ? 0 : 1; this.on_select(this.on); } Browser.addRoute(obj.children[3], 'isActive', obj, obj.on_active); obj.enable = function(value) { this.on = value; this.children[1].appearance.material.transparency = this.on ? 0 : 1; } obj.set_width = function(w, h) { var rad = w<h ? w : h; rad /= 2; this.children[0].geometry.radius = rad; this.children[1].geometry.radius = rad/2; this.children[2].translation.x = 2*rad; } obj.set_width(100, 10); return obj; } function new_widget_control(widget) { var obj = new SFNode('Transform2D'); obj.children[0] = new SFNode('Transform2D'); obj.children[0].children[0] = rectangle(); obj.children[0].children[1] = new SFNode('TouchSensor'); obj.widget = widget; obj.component_bound=false; obj.show_ctrl = true; obj.onClick = function(value) { if (!value) return; this.show_ctrl = !this.show_ctrl; if (this.show_ctrl) { var i, comps, idx; this.children[0].children[0].appearance.material.transparency = 0; this.children[1].scale.x = 1; this.children[3].scale.x = 1; for (i=0; i<widget_display.children.length; i++) { if (widget_display.children[i]==this) continue; if (widget_display.children[i].show_ctrl) { widget_display.children[i].onClick(true); } } //widget is a component, do not push on top but hide some controls if (this.widget.is_component) { if (this.component_bound) { this.children[1].children[0].hide(); //close this.children[1].children[1].hide(); //remove this.children[1].children[4].hide(); //resize } return; } //otherwise push widget on top idx=0; widget_display.removeChildren[idx++] = this; widget_display.addChildren[idx++] = this; //and push components comps = this.widget.components; for (i=0; i<comps.length; i++) { if (comps[i].widget_control && comps[i].widget_control.component_bound) { widget_display.removeChildren[idx++] = comps[i].widget_control; widget_display.addChildren[idx++] = comps[i].widget_control; } } } else { this.children[0].children[0].appearance.material.transparency = 1; this.children[1].scale.x = 0; this.children[3].scale.x = 0; } } Browser.addRoute(obj.children[0].children[1], 'isActive', obj, obj.onClick); obj.children[1] = new SFNode('Transform2D'); obj.children[1].children[0] = icon_button('icons/process-stop.svg', 'Close', 0); obj.children[1].children[0].widget = widget; obj.children[1].children[0].button_click = function() { if (this.widget.discardable) widget_remove(this.widget); else widget_close(this.widget, 0); } obj.children[1].children[1] = icon_button('icons/user-trash.svg', 'Uninstall', 0); obj.children[1].children[1].widget = widget; obj.children[1].children[1].button_click = function() { widget_remove(this.widget); } obj.children[1].children[2] = icon_button('icons/applications-internet.svg', 'Push to remote display', 0); obj.children[1].children[2].widget = widget; obj.children[1].children[2].button_click = function() { if (UPnP_Enabled && UPnP.MediaRenderersCount) { widget_remote_candidate = this.widget; on_upnpopen(true, true); } } obj.children[1].children[3] = icon_button('icons/dialog-information.svg', 'Widget Information', 0); obj.children[1].children[3].widget = widget; obj.children[1].children[3].button_click = function() { display_widget_info(this.widget); } obj.children[1].children[4] = icon_button('icons/media-record.svg', 'Resize', 1); obj.children[1].children[4].children[1].children[2] = new SFNode('PlaneSensor2D'); obj.children[1].children[4].children[1].children[2].maxPosition = new SFVec2f(-1, -1); obj.prev_x=0; obj.prev_y=0; obj.onSize = function(value) { if (this.widget.width + 2*(value.x - this.prev_x)<0) return; if (this.widget.height + 2*(this.prev_y-value.y)<0) return; this.widget.width += 2*(value.x - this.prev_x); this.prev_x = value.x; this.widget.height += 2*(this.prev_y - value.y); this.prev_y = value.y; this.set_size(this.widget.width, this.widget.height); } Browser.addRoute(obj.children[1].children[4].children[1].children[2], 'translation_changed', obj, obj.onSize); obj.children[2] = new SFNode('Layer2D'); obj.inline = new SFNode('Inline'); obj.children[2].children[0] = obj.inline; obj.children[3] = new SFNode('Transform2D'); obj.children[3].children[0] = new SFNode('Shape'); obj.children[3].children[0].appearance = new SFNode('Appearance'); obj.children[3].children[0].appearance.material = new SFNode('Material2D'); obj.children[3].children[0].appearance.material.filled = TRUE; obj.children[3].children[0].appearance.material.transparency = 0.5; obj.children[3].children[0].appearance.material.emissiveColor = new SFColor(0.6, 0.6, 0.6); obj.children[3].children[0].geometry = new SFNode('Rectangle'); obj.children[3].children[0].geometry.size = new SFVec2f(50, 50); obj.children[3].children[1] = new SFNode('PlaneSensor2D'); obj.children[3].children[1].maxPosition = new SFVec2f(-1, -1); obj.children[3].children[1].offset = new SFVec2f(widget.x, widget.y); obj.onMove = function(value) { if (this.maximized) return; this.translation = value; this.widget.x = value.x; this.widget.y = value.y; this.refresh_layout(false, null); } Browser.addRoute(obj.children[3].children[1], 'translation_changed', obj, obj.onMove); obj.children[3].children[2] = new SFNode('TouchSensor'); obj.last_ts = 0; obj.onMaximize = function(value, timestamp) { if (!value) return; if (timestamp - this.last_ts < 0.5) { if (this.maximized) { this.maximized = false; this.translation.x = this.widget.x; this.translation.y = this.widget.y; this.set_size(this.prev_width, this.prev_height); } else { this.maximized = true; this.prev_width = this.widget.width; this.prev_height = this.widget.height; this.translation.x = 0; this.translation.y = -info_height; this.set_size(display_width, display_height - 2*info_height); } } this.last_ts = timestamp; } Browser.addRoute(obj.children[3].children[2], 'isActive', obj, obj.onMaximize); obj.set_size = function(w, h) { var i, x, s; s = 24; this.children[2].size.x = w; this.children[2].size.y = h; this.children[1].children[0].translation.y = this.children[1].children[1].translation.y = this.children[1].children[2].translation.y = this.children[1].children[3].translation.y = this.children[1].children[4].translation.y = h/2 + s/2; this.children[0].children[0].set_size(w+s, h+s); this.children[3].children[0].geometry.size.x = w; this.children[3].children[0].geometry.size.y = h; this.children[1].children[0].set_size(s, s); this.children[1].children[1].set_size(s, s); this.children[1].children[2].set_size(s, s); this.children[1].children[3].set_size(s, s); this.children[1].children[4].set_size(s, s); this.children[1].children[0].translation.x = -w/2; this.children[1].children[1].translation.x = -w/4; this.children[1].children[2].translation.x = 0; this.children[1].children[3].translation.x = w/4; this.children[1].children[4].translation.x = w/2; //set widget input params widget.width = w; widget.height = h; widget.set_input('width', w); widget.set_input('height', h); this.refresh_layout(true, null); //call core:in WidgetManager.corein_message(widget, 'setSize', 'width', w, 'height', w, 'dpi', screen_dpi); } obj.refresh_layout = function(send_resize, comp_target) { var i; var x, y, w, h, scale_x, scale_y; var comps; /*local to subscene transformation not known*/ if (!this.sub_w) return; if (!this.sub_h) return; comps = this.widget.components; for (i=0; i<comps.length; i++) { var comp = comps[i]; if (!comp.widget_control || !comp.widget_control.component_bound) continue; //compute scale from Widget Manager coord system to widget internal coordinate system scale_x = this.sub_vp_w / this.sub_w; scale_y = this.sub_vp_h / this.sub_h; w = comp.widget_control.place_w * scale_x; h = comp.widget_control.place_h * scale_y; x = this.translation.x - this.widget.width/2 + this.sub_vp_x + comp.widget_control.place_x * scale_x + w/2; comp.widget_control.translation.x = x; y = this.widget.height/2 + this.translation.y - h/2 - this.sub_vp_y - comp.widget_control.place_y * scale_y; comp.widget_control.translation.y = y; if (send_resize || (comp_target==comp)) comp.widget_control.set_size(w, h); } } obj.hide = function() { this.scale.x = 0; WidgetManager.corein_message(this.widget, 'hide'); } obj.show = function() { this.scale.x = 1; WidgetManager.corein_message(this.widget, 'show'); } obj.show_remote = function () { if (WidgetManager.upnp && UPnP.MediaRenderersCount) { this.children[1].children[2].show(); } else { this.children[1].children[2].hide(); } } obj.show_remove = function(show) { if (show) this.children[1].children[1].show(); else this.children[1].children[1].hide(); } obj.flash = function() { var time = new_timeout(0.25); time.loop = true; time.ctrl = this; time.on_event = function(val) { var scale = (val<0.5) ? 1+val : 2-val; this.ctrl.scale.x = this.ctrl.scale.y = scale; } time.stop(1); time.start(0); } obj.maximized = false; obj.show_remote(); obj.onClick(true); return obj; } function on_icon_over(value) { infobar.set_label(value ? this.label : ''); } function display_widget_info(wid) { var info_dlg = new SFNode('Transform2D'); var i, j, k, info; var y, txt, pref; infobar.set_label('Widget ' + wid.name + ' Information'); info = text_rect('Close'); info_dlg.children[0] = info; info.button_click = function() { dlg_display.children.length = 0; widget_display.scale.x = 1; infobar.set_label(''); layout(); } info = text_rect('Widget Metadata'); info_dlg.children[info_dlg.children.length] = info; info.visible = false; info.button_click = function() { this.visible = !this.visible; layout(); } i=3; info.children[i++] = text_label('id: ' + wid.identifier + ' - shortname: '+wid.shortName + ' - name: '+wid.name, 'BEGIN'); info.children[i++] = text_label('version: '+wid.version, 'BEGIN'); info.children[i++] = text_label('content type: ' + wid.mainMimeType + ' - content encoding: '+wid.mainEncoding, 'BEGIN'); info.children[i++] = text_label('default size: Width = ' + wid.defaultWidth + ' Height = '+wid.defaultHeight, 'BEGIN'); info.children[i++] = text_label('license: '+wid.license, 'BEGIN'); info.children[i++] = text_label('license ref: '+wid.licenseHref, 'BEGIN'); info.children[i++] = text_label('description: '+wid.description, 'BEGIN'); info.children[i++] = text_label('author name: '+wid.authorName + ' (mail: '+wid.authorEmail+')', 'BEGIN'); info.children[i++] = text_label('author href: '+wid.authorHref, 'BEGIN'); info.children[i++] = text_label('view modes: '+wid.viewmodes, 'BEGIN'); info.children[i++] = text_label('UUID: '+wid.uuid, 'BEGIN'); info.children[i++] = text_label('Discardable: '+wid.discardable, 'BEGIN'); info.children[i++] = text_label('Muliple Instances: '+wid.discardable, 'BEGIN'); var icons = wid.icons; for (j=0; j<icons.length; j++) { info.children[i++] = text_label('icon #'+(j+1)+': ' + icons[j].src, 'BEGIN'); } info = text_rect('Widget Manager Info'); info_dlg.children[info_dlg.children.length] = info; info.visible = false; info.button_click = function() { this.visible = !this.visible; layout(); } i=3; info.children[i++] = text_label('nb instances: '+wid.num_instances + ' nb components: '+wid.num_components, 'BEGIN' ); info.children[i++] = text_label('Permanently installed: '+wid.permanent + ' - is component: '+wid.is_component, 'BEGIN' ); if (wid.is_component) { info.children[i++] = text_label('parent widget name' + wid.parent.name, 'BEGIN'); } if (wid.originating_device_ip) { info.children[i++] = text_label('Widget was pushed from device IP '+wid.originating_device_ip, 'BEGIN' ); } info.children[i++] = text_label('Section name in GPAC config file: '+wid.section, 'BEGIN' ); info.children[i++] = text_label('UA Locale: ' + gpac.get_option('Systems', 'LanguageName') + ' (' + gpac.get_option('Systems', 'Language2CC') + ')', 'BEGIN'); info.children[i++] = text_label('widget src: ' + wid.url , 'BEGIN'); info.children[i++] = text_label('config src: ' + wid.manifest , 'BEGIN'); info.children[i++] = text_label('content src : '+wid.localizedSrc, 'BEGIN' ); pref = wid.features; info = text_rect('Features (' + pref.length + ')' ); info_dlg.children[info_dlg.children.length] = info; info.visible = false; info.button_click = function() { this.visible = !this.visible; layout(); } i=3; for (j=0; j<pref.length; j++) { info.children[i++] = text_label('Feature #'+(j+1)+' name=\''+pref[j].name+'\' required=\''+pref[j].required+'\'', 'BEGIN'); } pref = wid.preferences; info = text_rect('Preferences ('+pref.length+')'); info_dlg.children[info_dlg.children.length] = info; info.visible = false; info.button_click = function() { this.visible = !this.visible; layout(); } i=3; for (j=0; j<pref.length; j++) { var val = pref[j].value; if (val == '') val = gpac.get_option(wid.section, pref[j].name); info.children[i++] = text_label('Preference #'+(j+1)+' name=\''+pref[j].name+'\' value=\''+val+'\' readOnly=\''+pref[j].readonly +'\'', 'BEGIN'); } info = text_rect('Migration Context', 'BEGIN'); info_dlg.children[info_dlg.children.length] = info; info.visible = false; info.button_click = function() { this.visible = !this.visible; layout(); } i=3; txt=wid.get_context(); while (1) { var idx = txt.indexOf('\n', 0); if (idx>0) { info.children[i++] = text_label(txt.substring(0, idx), 'BEGIN'); txt = txt.substring(idx+1, txt.length); } else { info.children[i++] = text_label(txt, 'BEGIN'); break; } } info_dlg.ifce_idx = info_dlg.children.length; info = text_rect('Interfaces (count: ' + wid.num_interfaces + ' - bound: ' + wid.num_bound_interfaces+')', 'BEGIN'); info_dlg.children[info_dlg.ifce_idx] = info; info.visible = false; info.button_click = function() { this.visible = !this.visible; layout(); } i=3; for (j=0; j<wid.num_interfaces; j++) { var idx; var ifce = wid.get_interface(j); var item = text_rect('Interface #' + (j+1) + ' type: '+ifce.type); info.children[i++] = item; item.visible = false; item.button_click = function() { this.visible = !this.visible; layout(); } idx=3; item.children[idx++] = text_label('Multiple Binding: '+ifce.multipleBinding + ' - Service provider: '+ ifce.serviceProvider + ' - bound: ' + wid.is_interface_bound(ifce) , 'BEGIN'); for (k=0; k<ifce.num_messages; k++) { var string, l; var msg = ifce.get_message(k); string = ' Message #'+ (k+1) + ': ' + msg.name + '('; for (l=0; l<msg.num_params; l++) { par = msg.get_param(l); string += (par.is_input ? 'in' : 'out') + ':' +par.name + ' '; } string += ')'; item.children[idx++] = text_label(string, 'BEGIN'); } } info_dlg.set_size = function(w, h) { var i, j, y, dy; y = h/2 - 20; for (i=0; i<this.children.length; i++) { var item = this.children[i]; item.translation.x = 0; item.translation.y = y; item.set_size(w, 20); y -= 20; if (!i) continue; dy = 0; for (j=3; j<item.children.length; j++) { if (item.visible) { item.children[j].scale.x = 1; dy -= 20; item.children[j].translation.y = dy; if (i<this.ifce_idx) { item.children[j].translation.x = -w/2+10; } else { item.children[j].set_size(w-20, 20); var ddy=0; var k, sitem; sitem = item.children[j]; for (k=3; k<sitem.children.length; k++) { if (item.children[j].visible) { sitem.children[k].scale.x = 1; sitem.children[k].translation.x = -w/2+10; ddy -= 20; sitem.children[k].translation.y = ddy; } else { sitem.children[k].scale.x = 0; } } dy+=ddy; } } else { item.children[j].scale.x = 0; } } y += dy; } } dlg_display.children[0] = info_dlg; widget_display.scale.x = 0; layout(); } function widget_insert(widget) { /*insert the widget icon*/ if (widget.permanent && !widget.is_component) insert_widget_icon(widget, 0); /*and load the widget - comment this line to disable auto load of widget*/ widget_launch(widget); } function setup_icons() { var icon; //File open icon = icon_button('icons/applications-multimedia.svg', 'Open', 0); icon.button_click = on_fileopen; dock.children[dock.children.length] = icon; //Widget Manager Icon icon = icon_button('icons/applications-system.svg', 'Widgets', 0); icon.button_click = function () { widget_ui_visible = !widget_ui_visible; layout(); } dock.children[dock.children.length] = icon; //Widgets add Icon icon = icon_button('icons/list-add.svg', 'Add Widgets', 0); icon.button_click = function () { widget_browse(); } widget_ui.children[widget_ui.children.length] = icon; icon = icon_button('icons/user-trash.svg', 'Remove all widgets', 0); icon.button_click = function () { while (1) { var wid = WidgetManager.get(0); if (wid==null) break; widget_close(wid, 1); } widget_ui.children.length = widget_ui.nb_tools; layout(); } widget_ui.children[widget_ui.children.length] = icon; widget_ui.prev = icon_button('icons/go-previous.svg', 'Previous Widgets', 0); widget_ui.prev.button_click = function () { widget_ui_layout(-1); }; widget_ui.children[widget_ui.children.length] = widget_ui.prev; widget_ui.next = icon_button('icons/go-next.svg', 'Next Widgets', 0); widget_ui.next.button_click = function () { widget_ui_layout(1); }; widget_ui.children[widget_ui.children.length] = widget_ui.next; widget_ui.nb_tools = widget_ui.children.length; //push to display upnp_icon = null; if (UPnP_Enabled) { icon = icon_button('icons/video-display.svg', 'Select Display', 0); icon.button_click = function () { widget_remote_candidate = null; on_upnpopen(false, false); } upnp_icon = icon; upnp_icon.hide(); dock.children[dock.children.length] = icon; } //exit Icon icon = icon_button('icons/emblem-unreadable.svg', 'Exit', 0); icon.button_click = function() { gpac.exit(); }; dock.children[dock.children.length] = icon; } /*dock layout*/ function dock_layout() { var i; dock.translation.y = (dock_height - display_height)/2; infobar.translation.y = display_height/2 - info_height/2; num_in_dock = dock.children.length; tot_len = num_in_dock*icon_size; if (tot_len>display_width) { start_x = (icon_size-display_width)/2; } else { start_x = (icon_size-tot_len)/2; } /*translate / size all items in the dock*/ for (i=0;i<num_in_dock; i++) { if (dock.children[i].visible) { dock.children[i].set_size(icon_size, icon_size); dock.children[i].translation.x = start_x; start_x += icon_size; } } } function widget_ui_layout(dir) { var count, i, height, start_x, start_y, spread_x, nb_wid_h, nb_wid_v, nb_wid; if (!widget_ui_visible) { widget_ui.size.x = 0; widget_ui.size.y = 0; return; } widget_ui.size.x = display_width; widget_ui.size.y = display_height; start_x = (icon_size-display_width)/2; start_y = (display_height-icon_size/2)/2 - info_height; for (i=0; i<widget_ui.nb_tools; i++) { wid = widget_ui.children[i]; wid.set_size(icon_size/2, icon_size/2); wid.translation.x = start_x; wid.translation.y = start_y; start_x += icon_size/2; } start_x = (icon_size-display_width)/2; start_y -= icon_size; count = widget_ui.children.length - widget_ui.nb_tools; if (first_visible_widget<0) first_visible_widget=0; for (i=0; i<count; i++) { var wid = widget_ui.children[widget_ui.nb_tools+i]; wid.hide(); } nb_wid_h = Math.floor(display_width / icon_size); if (!nb_wid_h) nb_wid_h=1; height = display_height-dock_height-icon_size-icon_size/2; nb_wid_v = Math.floor(height / icon_size); if (!nb_wid_v) nb_wid_v=1; spread_x = (display_width / nb_wid_h) - icon_size; start_x += spread_x/2; nb_wid = (nb_wid_h*nb_wid_v); if (dir<0) { first_visible_widget -= nb_wid; if (first_visible_widget < 0) { first_visible_widget = 0; } } else if (dir>0) { first_visible_widget += nb_wid; } if (first_visible_widget) widget_ui.prev.show(); else widget_ui.prev.hide(); if (first_visible_widget+nb_wid < count) widget_ui.next.show(); else widget_ui.next.hide(); for (i=0; i<count; i++) { var wid; if (i+first_visible_widget >= count) { break; } wid = widget_ui.children[i +first_visible_widget+widget_ui.nb_tools]; wid.show(); wid.set_size(icon_size, icon_size); wid.translation.x = start_x; wid.translation.y = start_y; start_x += icon_size + spread_x; if (start_x + icon_size / 2 >= display_width/2) { start_x = (icon_size-display_width)/2 + spread_x/2; start_y -= icon_size; } nb_widgets_on_screen = i+1; if (start_y - icon_size < (dock_height-display_height)/2) { i++; break; } } } //performs layout on all contents function layout() { var i, list, start_x; gpac.set_option('General', 'LastWidth', ''+display_width); gpac.set_option('General', 'LastHeight', '' + display_height); if (dlg_display.children.length) { widget_display.scale.x = 0; widget_ui_visible = false; } //layout all icons in the dock dock_layout(); widget_ui_layout(0); if (dlg_display.children.length) { list = dlg_display.children; for (i=0; i<list.length; i++) { var dlg = list[i]; if (typeof (dlg.set_size) != 'undefined') dlg.set_size(display_width, display_height-icon_size-info_height); dlg.translation.y = (icon_size-info_height)/2; } } else if (widget_ui_visible) { widget_display.scale.x = 0; } else { widget_display.scale.x = 1; list = widget_display.children; for (i=0; i<list.length; i++) { var widctrl = list[i]; if (widctrl.maximized) { widctrl.translation.y = - info_height; widctrl.set_size(display_width, display_height - 2*info_height); } } } } //resize event callback function on_resize(evt) { display_width = evt.width; display_height = evt.height; layout(); } //zoom event callback function on_zoom(evt) { display_width = evt.width; display_height = evt.height; layout(); } //scroll event callback function on_scroll(evt) { layout(); } //starts a widget function on_widget_launch() { if (this.widget.visible) { var awid; if (!this.widget.multipleInstances) return; awid = WidgetManager.open(this.widget.manifest, null); widget_launch(awid); } else { widget_launch(this.widget); } } function widget_get_icon(widget) { var icon = 'icons/image-missing.svg'; var preferredIconType = '.svg'; for (var i = 0; i < widget.icons.length; i++) { icon = widget.icons[i].relocated_src; if (widget.icons[i].relocated_src.indexOf(preferredIconType) > 0) { break; } } return icon; } //initialize GPAC widget manager and load all widgets function widgets_init() { count = WidgetManager.num_widgets; for (i=0; i<count; i++) { wid = WidgetManager.get(i); if (wid == null) continue; wid.device = null; wid.device_ip = null; if (wid.in_panel == true) { icon = icon_button(widget_get_icon(wid), wid.name, 0); icon.tooltip = wid.name; icon.widget = wid; icon.button_click = on_widget_launch; wid.icon_dock = icon; widget_ui.children[widget_ui.children.length] = wid.icon_dock; } if (wid.visible) { widget_launch(wid); } } } function on_widget_size(value) { //remember variables this.width = value.x; this.height = value.y; //and set widget input params this.set_input('width', value.x); this.set_input('height', value.y); } function on_widget_move(value) { this.x = value.x; this.y = value.y; } //widget close function function widget_close(widget, force_remove) { var is_comp = widget.is_component; alert('closing widget '+widget.name + ' visible '+widget.visible); if (widget.visible) { widget.visible = false; WidgetManager.corein_message(widget, 'hide'); WidgetManager.corein_message(widget, 'deactivate'); widget.deactivate(); /*force disconnect of main resource - we do this because we are not sure when the widget_control will be destroyed due to JS GC*/ if (widget.widget_control) { widget.widget_control.inline.url[0] = ""; widget.widget_control.inline.url.length = 0; widget.scene_container.removeChildren[0] = widget.widget_control; alert('new url '+widget.widget_control.inline.url); } } if (!is_comp && (!widget.permanent || force_remove)) { WidgetManager.unload(widget, force_remove ? true : false); } alert('widget closed'); } function on_widget_close(value) { widget_close(this, 0); } //widget remove function (close and unregister) function widget_remove(wid) { if (typeof(wid.icon_dock) != 'undefined') widget_ui.removeChildren[0] = wid.icon_dock; widget_close(wid, 0); layout(); } function on_widget_control(value) { var i, count; if (!value) return; count = this.scene_container.children.length; for (i=0; i<count; i++) { if (this.scene_container.children[i] == this.widget_control) { this.scene_container.removeChildren[0] = this.widget_control; this.scene_container.children[this.scene_container.children.length] = this.widget_control; return; } } } //widget launcher function function widget_launch(wid) { var widg_ctrl; //assign default size to the widget if (wid.width == undefined) { wid.width = wid.defaultWidth; if (wid.width == 0) wid.width = widget_default_size; } if (wid.height == undefined) { wid.height = wid.defaultHeight; if (wid.height == 0) wid.height = widget_default_size; } if (wid.x== undefined) wid.x = 0; if (wid.y== undefined) wid.y = 0; widg_ctrl = new_widget_control(wid); widg_ctrl.component_bound = false; wid.visible = true; widg_ctrl.set_size(wid.width, wid.height); widg_ctrl.translation.x = wid.x; widg_ctrl.translation.y = wid.y; wid.widget_control = widg_ctrl; wid.scene_container = widget_display; widg_ctrl.show_remove( (!wid.discardable && wid.icon_dock) ? 1 : 0); widg_ctrl.sub_width = 0; widg_ctrl.sub_height = 0; widg_ctrl.sub_x = 0; widg_ctrl.sub_y = 0; widg_ctrl.sub_vp_w = 0; widg_ctrl.sub_vp_h = 0; widg_ctrl.inline.addEventListener('gpac_vp_changed', function(evt) { widg_ctrl.sub_vp_w = evt.width; widg_ctrl.sub_vp_h = evt.height; widg_ctrl.sub_vp_x = evt.offset_x; widg_ctrl.sub_vp_y = evt.offset_y; widg_ctrl.sub_w = evt.vp_width; widg_ctrl.sub_h = evt.vp_height; widg_ctrl.refresh_layout(true, null); }, 0); /*this will setup the scene graph for the widget in order to filter input and output communication pins*/ wid.activate(widg_ctrl.inline); widg_ctrl.inline.url[0] = wid.main; widget_display.addChildren[0] = widg_ctrl; /*send notifications once the widget scene is loaded*/ wid.on_load = function () { WidgetManager.corein_message(this, 'activate'); WidgetManager.corein_message(this, 'show'); WidgetManager.corein_message(this, 'setSize', 'width', 50, 'height', 50, 'dpi', 96); }; if (widget_ui_visible) { widget_ui_visible = 0; layout(); } } function widget_request_size(widget, args) { if (args.length==2) { w = (typeof args[0] == 'string') ? parseInt(args[0]) : args[0]; h = (typeof args[1] == 'string') ? parseInt(args[1]) : args[1]; widget.widget_control.set_size(w, h); } } function widget_request_show(widget, args) { widget.widget_control.show(); } function widget_request_hide(widget, args) { widget.widget_control.hide(); } function widget_request_activate(widget, args) { if (!widget.visible) widget_launch(widget); } function widget_request_deactivate(widget, args) { if (widget.visible) widget_close(widget, 0); } function widget_request_attention(widget, args) { if (widget.visible) { widget_display.removeChildren[0] = widget.widget_control; widget_display.addChildren[0] = widget.widget_control; widget.widget_control.flash(); } } function widget_request_notification(widget, args) { var notif = text_rect(''); notif.children[1].geometry.string[0] = 'Notification from widget'; notif.children[1].geometry.string[1] = ' '+widget.name; notif.children[1].geometry.string[2] = ' '; notif.children[1].geometry.string[3] = args[0]; dlg_display.children[0] = notif; notif.set_size(320, 240); notif.button_click = function() { dlg_display.removeChildren[0] = this; } } function widget_place_component(widget, args) { var comp = widget.get_component(args[0]); if (comp==null) { log(l_err, 'Component '+args[0]+' cannot be found in widget '+widget.name); return; } comp.widget_control.place_x = args[1]; comp.widget_control.place_y = args[2]; comp.widget_control.place_w = args[3]; comp.widget_control.place_h = args[4]; comp.widget_control.place_z = args[5]; comp.widget_control.component_bound = true; widget.widget_control.refresh_layout(false, comp); } // // implementation of core:out install widget // function widget_request_install(wid, args) { var wid_url = args[0]; /*locate widget with same URL*/ var j, count = WidgetManager.num_widgets; for (j = 0; j < count; j++) { var wid = WidgetManager.get(j); if (wid.url == wid_url) { if (!wid.in_panel) { insert_widget_icon(wid, 0); } break; } } /*not found, install new widget*/ if (j == count) { var new_wid = WidgetManager.open(wid_url, null); if (new_wid==null) return; insert_widget_icon(new_wid, 0); } var ifce = getInterfaceByType(wid, "urn:mpeg:mpegu:schema:widgets:core:out:2010"); if (ifce != null) { wmjs_core_out_invoke_reply(coreOut.installWidgetMessage, ifce.get_message("installWidget"), wid, 1); // send return code 1 = success } } function widget_migrate_component(wid, args) { alert('Fetching for migration component '+args[0]); var comp = wid.get_component(args[0], true); var ifce = getInterfaceByType(wid, "urn:mpeg:mpegu:schema:widgets:core:out:2010"); if (comp==null) { log(l_err, 'Component '+args[0]+' cannot be found in widget '+wid.name); if (ifce != null) { wmjs_core_out_invoke_reply(coreOut.migrateComponentMessage, ifce.get_message("migrateComponent"), wid, 0); } return; } comp.widget_control = null; if (args.length > 1 && args[1] != null) { alert('Migrating component to ' + UPnP.GetMediaRenderer(parseInt(args[1])).Name); WidgetManager.migrate_widget(UPnP.GetMediaRenderer(parseInt(args[1])), comp); widget_close(comp); } else { widget_remote_candidate = comp; on_upnpopen(false, false); } if (ifce != null) { wmjs_core_out_invoke_reply(coreOut.migrateComponentMessage, ifce.get_message("migrateComponent"), wid, 1); // send return code 1 = success } } function widget_migration_targets(wid, args) { var count = UPnP.MediaRenderersCount, codes = new Array(), names = new Array(), descriptions = new Array(), i; for (i = 0; i < count; i++) { var render = UPnP.GetMediaRenderer(i); codes.push(""+i); names.push(render.Name); descriptions.push(render.HostName +" "+ render.UUID); } i = null; var ifce_count = wid.num_interfaces, j; for (j = 0; j < ifce_count; j++) { var ifce = wid.get_interface(j); if (ifce.type == "urn:mpeg:mpegu:schema:widgets:core:out:2010") { i = ifce; break; } } if (i != null) { wmjs_core_out_invoke_reply(coreOut.requestMigrationTargetsMessage, i.get_message("requestMigrationTargets"), wid, codes, names, descriptions); } } // // implementation of core:out activate temporary widget // function widget_activate_temporary_widget(wid, args) { var w = WidgetManager.open(args[0], null); if (w != null) widget_launch(w); var ifce = getInterfaceByType(wid, "urn:mpeg:mpegu:schema:widgets:core:out:2010"); if (ifce != null) { wmjs_core_out_invoke_reply(coreOut.activateTemporaryWidgetMessage, ifce.get_message("activateTemporaryWidget"), wid, (w != null ? 1 : 0)); // send return code 1 = success } } function insert_widget_icon(new_wid, no_layout) { var icon; icon = icon_button(widget_get_icon(new_wid), new_wid.name, 0); icon.tooltip = new_wid.name; new_wid.in_panel = true; new_wid.visible = false; new_wid.icon_dock = icon; icon.button_click = on_widget_launch; icon.widget = new_wid; widget_ui.addChildren[0] = new_wid.icon_dock; if (!no_layout) layout(); } function scan_directory(dir) { var i, j, count, list, new_wid, uri; list = gpac.enum_directory(dir, '.xml;.wgt;.mgt', 0); for (i=0; i<list.length; i++) { uri = list[i].path + list[i].name; if (list[i].directory) { scan_directory(uri); } else { count = WidgetManager.num_widgets; for (j=0; j<count; j++) { var wid = WidgetManager.get(j); if (wid.url==uri) break; } if (j==count) { new_wid = WidgetManager.open(uri, null); if (new_wid!=null) { insert_widget_icon(new_wid, 1); } } } } } function new_file_browse(init_directory, label, filter, show_scan, show_upnp) { var filebrowse = new SFNode('Transform2D'); filebrowse.list = new Array(); infobar.set_label(label); dlg_display.children[0] = filebrowse; filebrowse.upnp = null; filebrowse.upnp_mode = false; filebrowse.children[0] = icon_button('icons/emblem-unreadable.svg', 'Close', 0); filebrowse.children[0].button_click = function() { dlg_display.children.length = 0; widget_display.scale.x = 1; layout(); } filebrowse.children[1] = icon_button('icons/go-previous.svg', 'Previous', 0); filebrowse.children[1].filebrowse = filebrowse; filebrowse.children[1].button_click = function () { this.filebrowse.layout(0) }; filebrowse.children[2] = icon_button('icons/go-next.svg', 'Next', 0); filebrowse.children[2].filebrowse = filebrowse; filebrowse.children[2].button_click = function () { this.filebrowse.layout(1) }; filebrowse.icon_up = icon_button('icons/go-up.svg', 'Up', 0); filebrowse.icon_up.filebrowse = filebrowse; filebrowse.icon_up.button_click = function () { this.filebrowse.browse(true) }; filebrowse.children[3] = filebrowse.icon_up; if (show_scan) { filebrowse.on_dir_scan = null; filebrowse.children[4] = icon_button('icons/folder.svg', 'Scan Directory', 0); filebrowse.children[4].filebrowse = filebrowse; filebrowse.children[4].button_click = function () { if (this.filebrowse.on_dir_scan) this.filebrowse.on_dir_scan(this.filebrowse.directory); dlg_display.children.length = 0; widget_display.scale.x = 0; widget_ui_visible = true; layout(); } } if (show_upnp && UPnP_Enabled) { filebrowse.upnp = icon_button('icons/applications-internet.svg', 'Network Servers', 0); filebrowse.upnp.filebrowse = filebrowse; filebrowse.children[filebrowse.children.length] = filebrowse.upnp; filebrowse.server_uuid = null; filebrowse.upnp.button_click = function() { if (this.filebrowse.upnp_mode) { this.label = 'Network Servers'; this.filebrowse.upnp_mode = false; this.filebrowse.directory = init_directory; this.filebrowse.browse(false); } else { this.label = 'Local Drive'; this.filebrowse.upnp_mode = true; this.filebrowse.browse(true); } } filebrowse.upnp_get_server_list = function() { var count, server, item; this.directory = null; this.children[3].hide(); this.server_uuid = null; count = UPnP.MediaServersCount; this.list.length = 0; for (i=0; i<count; i++) { server = UPnP.GetMediaServer(i); item = new Object(); item.name = server.Name; item.directory = true; item.is_server = true; item.path = server.UUID; this.list[i] = item; } }; filebrowse.server_uuid = null; } filebrowse.label = text_label('', 'BEGIN'); filebrowse.set_label = function(label) { this.label.set_label(label); } filebrowse.children[filebrowse.children.length] = filebrowse.label; filebrowse.nb_tools = filebrowse.children.length; filebrowse.browse = function(go_up) { if (this.upnp_mode) { var item; var server = null; if (this.server_uuid) server = UPnP.GetMediaServer(this.server_uuid); if (!server || (go_up && !server.HasParentDirectory())) { this.upnp_get_server_list(); this.icon_up.hide(); this.set_label('Media Servers'); this.first = 0; this.layout(0); return; } if (go_up) this.directory = '..'; this.icon_up.show(); server.Browse(this.directory, filter); this.list.length = 0; for (i=0; i<server.FilesCount; i++) { var file = server.GetFile(i); if (file.Directory) { item = new Object(); item.directory = true; item.name = file.Name; item.path = file.ObjectID; item.is_server = false; this.list[this.list.length] = item; } else { var j; for (j=0; j<file.ResourceCount; j++) { item = new Object(); item.directory = false; item.resource_uri = file.GetResourceURI(j); item.name = file.Name; var protoInfo = item.resource_uri.split(":"); item.name += ' ('+protoInfo[0]+')'; item.path = file.ObjectID; item.is_server = false; this.list[this.list.length] = item; } } } if (this.directory) this.set_label(this.directory); else this.set_label(server.Name); this.first = 0; this.layout(0); return; } if (this.directory == '') this.icon_up.hide(); else this.icon_up.show(); this.list = gpac.enum_directory(this.directory, filter, go_up); if (this.list.length) { this.directory = this.list[0].path; this.set_label(this.directory); } else { this.set_label(''); } this.first = 0; this.layout(0); } filebrowse.on_browse = null; filebrowse.layout = function(type) { var w, h, i, y; this.children.length = this.nb_tools; if (this.upnp != null) { if (UPnP.MediaServersCount) { this.upnp.show(); } else { this.upnp.hide(); } } this.children[1].hide(); this.children[2].hide(); if (type==0) { this.first -= this.nb_items; if (this.first<0) this.first = 0; } else if (type) { this.first += this.nb_items; if (this.first + this.nb_items > this.list.length) this.first = this.list.length - this.nb_items; } if (this.first) this.children[1].show(); if (this.first+this.nb_items < this.list.length) this.children[2].show(); for (i=0; i<this.nb_items; i++) { var item; if (i+this.first>=this.list.length) break; item = text_rect(this.list[i+this.first].name); item.path = this.list[i+this.first].path; item.name = this.list[i+this.first].name; item.directory = this.list[i+this.first].directory; item.filebrowse = this; if (this.upnp_mode) { item.is_server = this.list[i+this.first].is_server; item.resource_uri = this.list[i+this.first].resource_uri; item.button_click = function() { if (this.directory) { if (this.is_server) { this.filebrowse.server_uuid = this.path; } else { this.filebrowse.directory = this.path; } this.filebrowse.browse(false); } else { dlg_display.children.length = 0; if (this.filebrowse.on_browse) { this.filebrowse.on_browse(this.resource_uri, null); } } }; } else { item.button_click = function() { if (this.directory) { this.filebrowse.directory = this.path + this.name; this.filebrowse.browse(false); } else { dlg_display.children.length = 0; if (this.filebrowse.on_browse) { this.filebrowse.on_browse(this.path + this.name, this.filebrowse.directory); } } }; } this.children[this.nb_tools+i] = item; } this.set_size(this.width, this.height); } filebrowse.set_size = function(w, h) { var i, x, y, isize, nbi; isize = 24; if (w>display_width - isize) w = display_width - isize; this.width = w; this.height = h; i = 1; while ((i+1)*isize <= h - isize) i++; if (i != this.nb_items) { this.nb_items = i; this.layout(0); return; } x = -w/2 + isize/2; y = h/2 - isize/2; for (i=0;i<this.nb_tools;i++) { if (this.nb_tools>i+1) { this.children[i].set_size(isize, isize); } this.children[i].translation.x = x; this.children[i].translation.y = y; x += isize; } y-=isize; while (i<this.children.length) { this.children[i].set_size(w, isize); this.children[i].translation.x = 0; this.children[i].translation.y = y; y-=isize; i++; } } filebrowse.nb_items = 0; filebrowse.directory = init_directory; gpac.set_focus(filebrowse); return filebrowse; } function widget_browse() { filebrowse = new_file_browse(WidgetManager.last_widget_dir, 'Select widget', '*.xml;*.wgt;*.mgt', true, false); filebrowse.on_dir_scan = function(directory) { scan_directory(directory); WidgetManager.last_widget_dir = directory; } filebrowse.on_browse = function(value, directory) { widget_display.scale.x = 1; widget_ui_visible = true; layout(); var new_wid = WidgetManager.open(value, null); if (new_wid==null) return; WidgetManager.last_widget_dir = directory; insert_widget_icon(new_wid, 0); } filebrowse.browse(0); widget_display.scale.x = 0; layout(); } //fileOpen function function on_fileopen() { filebrowse = new_file_browse(gpac.last_working_directory, 'Select file', '*', false, true); filebrowse.on_browse = function(value, directory) { if (directory) gpac.last_working_directory = directory; set_movie_url(value, false, true); } filebrowse.browse(0); widget_display.scale.x = 0; layout(); } function onMediaRendererAdd(name, uuid, is_add) { var i, count; count = WidgetManager.num_widgets; for (i=0; i<count; i++) { wid = WidgetManager.get(i); if (wid == null) continue; if (!wid.widget_control) continue; wid.widget_control.show_remote(); } if (UPnP.MediaRenderersCount) upnp_icon.show(); else upnp_icon.hide(); dock_layout(); if (upnp_renders) upnp_renders.refresh(); if (!is_add && controlled_renderer && (name==controlled_renderer.Name) ) controlled_renderer = null; } function is_local_url(url) { if (url.indexOf('://') < 0) return true; if (url.indexOf('file://') >= 0) return true; return false; } function on_upnpopen(push_mode, remote_only) { upnp_renders = new SFNode('Transform2D'); upnp_renders.nb_items = 0; upnp_renders.refresh = function () { var i, count, render, item, start_y, w, str; this.children.length = 0; count = UPnP.MediaRenderersCount; if (count+1>this.nb_items) count = this.nb_items-1; item = text_rect('Close'); item.button_click = function() { dlg_display.children.length = 0; upnp_renders=null; widget_display.scale.x = 1; infobar.set_label(''); } this.children[this.children.length] = item; if (!remote_only) { str = (controlled_renderer==null) ? '+ ' : ''; str += 'Local Renderer'; item = text_rect(str); item.button_click = function() { dlg_display.children.length = 0; upnp_renders=null; widget_display.scale.x = 1; infobar.set_label(''); controlled_renderer = null; } this.children[this.children.length] = item; } for (i=0; i<count; i++) { render = UPnP.GetMediaRenderer(i); str = (controlled_renderer && controlled_renderer.Name==render.Name) ? '+ ' : ''; str +=render.Name; item = text_rect(str); item.render = render; item.button_click = function() { var uri; dlg_display.children.length = 0; upnp_renders=null; widget_display.scale.x = 1; infobar.set_label(''); if (widget_remote_candidate) { WidgetManager.migrate_widget(this.render, widget_remote_candidate); widget_close(widget_remote_candidate, 0); widget_remote_candidate = null; } else { controlled_renderer = this.render; if (current_url != "") { if (is_local_url(current_url) ) { if (UPnP.MediaServerEnabled) { uri = UPnP.ShareResource(current_url); log(l_inf, 'Sharing '+current_url+' to renderer '+item.render.Name + ' as resource '+uri); item.render.Open(uri); item.render.Seek(current_time); set_movie_url('', true, false); } else { log(l_err, 'GPAC Media Server is disabled - Cannot share '+current_url); } } else if (gpac.get_option('Network', 'MobileIPEnabled')=='yes') { uri = gpac.migrate_url(movie.children[0].url[0]); log(l_inf, 'Migrating '+current_url+' to renderer '+item.render.Name + ' as Mobile IP resource '+uri); set_movie_url('', true, false); item.render.Open(uri); } else { log(l_inf, 'Migrating '+current_url+' to renderer '+item.render.Name); item.render.Open(current_url); item.render.Seek(current_time); set_movie_url('', true, false); } } } } this.children[this.children.length] = item; } this.set_size(this.width, this.height); } upnp_renders.set_size = function (w, h) { var i, count, start_y, w; this.width = w<300 ? w : 300; this.height = h; i = 1; while ((i+1)*icon_size <= h - icon_size) i++; if (i != this.nb_items) { this.nb_items = i; this.refresh(); return; } count = this.children.length; start_y = this.height/2 - icon_size - 4; for (i=0; i<count; i++) { this.children[i].set_size(this.width, icon_size); this.children[i].translation.y = start_y; start_y-=icon_size+2; } } infobar.set_label('Select remote display'); dlg_display.children[0] = upnp_renders; widget_display.scale.x = 0; layout(); } function onMediaConnect(url, src_ip) { if (WidgetManager.probe(url)) { alert('OnMediaConnect receive widget '+url+' - ip '+src_ip); var new_wid = WidgetManager.open(url, src_ip); if (new_wid==null) { return; } widget_insert(new_wid); } else { log(l_inf, 'DLNA URL connect ' + url); movie_ctrl.mediaStartTime = -1; set_movie_url(url, true, false); } } function onMediaStop() { log(l_inf, 'DLNA Media Stop'); movie_ctrl.mediaStartTime = 0; movie_ctrl.mediaSpeed = 0; } function onMediaPause() { log(l_inf, 'DLNA Media pause'); movie_ctrl.mediaSpeed = 0; movie_ctrl.mediaStartTime = -1; } function onMediaPlay() { log(l_inf, 'DLNA Media Play'); movie_ctrl.mediaSpeed = 1; } function OnMediaSeek(time) { log(l_inf, 'DLNA Media Seek to '+time); movie_ctrl.mediaStartTime = time; } function OnMediaMigrate() { log(l_inf, 'InterMedia Migration Request received'); var str = gpac.migrate_url(movie.children[0].url[0]); set_movie_url('', true, false); return str; }