# HG changeset patch # User hamidouk # Date 1320233600 -3600 # Node ID 158f0193ec548c9fd79861026f45dab5214bad53 # Parent 5150ae56e0a6dc8c800513fdb2abd2d8ddc01a6d added support for dependency widgets (i.e : a widget can now depend on another, and the latter will be instantiated and available to the former). diff -r 5150ae56e0a6 -r 158f0193ec54 src/js/init.js --- a/src/js/init.js Wed Nov 02 10:58:34 2011 +0100 +++ b/src/js/init.js Wed Nov 02 12:33:20 2011 +0100 @@ -42,21 +42,36 @@ var index; for (index = 0; index < guiOptions.widgets.length; index++) { - var widget = guiOptions.widgets[index]; - var container = layoutManager.createDiv(); - - var arr = IriSP.jQuery.extend({}, widget); - arr.container = container; - - var serializer = serialFactory.getSerializer(widget.metadata); - - // instantiate the object passed as a string - var widget = new IriSP[widget.type](popcornInstance, arr, serializer); - - serializer.sync(IriSP.wrap(widget, function() { this.draw(); })); + var widgetConfig = guiOptions.widgets[index]; + var widget = IriSP.instantiateWidget(popcornInstance, serialFactory, layoutManager, widgetConfig); ret_widgets.push(widget); }; return ret_widgets; +}; + +IriSP.instantiateWidget = function(popcornInstance, serialFactory, layoutManager, widgetConfig) { + var container = layoutManager.createDiv(); + var arr = IriSP.jQuery.extend({}, widget); + arr.container = container; + + var serializer = serialFactory.getSerializer(widgetConfig.metadata); + + // instantiate the object passed as a string + var widget = new IriSP[widgetConfig.type](popcornInstance, arr, serializer); + + if (widgetConfig.hasOwnProperty("requires")) { + // also create the widgets this one depends on. + // the dependency widget is available in the parent widget context as + // this.WidgetName (for instance, this.TipWidget); + + for(var j in widgetConfig.requires) { + var widgetName = widgetConfig.requires[j]["type"]; + widget[widgetName] = IriSP.instantiateWidget(popcornInstance, serialFactory, layoutManager, widgetConfig.requires[j]); + } + } + + serializer.sync(IriSP.wrap(widget, function() { this.draw(); })); + return widget; }; \ No newline at end of file diff -r 5150ae56e0a6 -r 158f0193ec54 unittests/tests/init.js --- a/unittests/tests/init.js Wed Nov 02 10:58:34 2011 +0100 +++ b/unittests/tests/init.js Wed Nov 02 12:33:20 2011 +0100 @@ -69,6 +69,55 @@ equal(elem.attr("src"), popcornOptions.file, "the src attribute is set correctly"); }); + test("test the instantiation of a single widget without dependencies", function() { + + var dt = new IriSP.DataLoader(); + var serialFactory = new IriSP.SerializerFactory(dt); + + var layoutManager = new IriSP.LayoutManager({container: "LdtPlayer", width: 327, height: 542}); + var pop = IriSP.configurePopcorn(layoutManager, this.popcornOptions); + var conf = {type: "PlayerWidget", + mode: "radio", + metadata:{ + format:'cinelab', + src:'test.json', + type:'dummy'} + }; + + var res = IriSP.instantiateWidget(pop, serialFactory, layoutManager, conf); + ok(res instanceof IriSP.PlayerWidget, "the returned widget is of the correct instance"); + }); + + test("test the instantiation of a single widget with one dependency", function() { + var dt = new IriSP.DataLoader(); + var serialFactory = new IriSP.SerializerFactory(dt); + + var layoutManager = new IriSP.LayoutManager({container: "LdtPlayer", width: 327, height: 542}); + + var pop = IriSP.configurePopcorn(layoutManager, this.popcornOptions); + var conf = {type: "PlayerWidget", + mode: "radio", + metadata:{ + format:'cinelab', + src:'test.json', + type:'dummy'}, + requires: [ + {type: "PlayerWidget", + mode: "radio", + metadata:{ + format:'cinelab', + src:'test.json', + type:'dummy' + } }] + }; + + + var res = IriSP.instantiateWidget(pop, serialFactory, layoutManager, conf); + + ok(res instanceof IriSP.PlayerWidget, "the returned widget is of the correct instance"); + ok(res.PlayerWidget instanceof IriSP.PlayerWidget, "the dependency widget is accessible from the parent"); + }); + test("test the instantiation of a bunch of widgets", function() { var layoutManager = new IriSP.LayoutManager({container: "LdtPlayer", width: 327, height: 542}); @@ -81,4 +130,6 @@ ok(widgets[2] instanceof IriSP.AnnotationsWidget, "third widget is an annotation widget"); equal(IriSP.jQuery("#" + this.widgetOptions.container).length, 1, "a new dom element has been created"); }); + + } \ No newline at end of file