// Copyright (c) IPython Development Team. // Distributed under the terms of the Modified BSD License. define([ "widgets/js/widget", "jquery", ], function(widget, $){ var LinkModel = widget.WidgetModel.extend({ initialize: function() { this.on("change:widgets", function(model, value, options) { this.update_bindings(model.previous("widgets") || [], value); this.update_value(this.get("widgets")[0]); }, this); this.once("destroy", function(model, collection, options) { this.update_bindings(this.get("widgets"), []); }, this); }, update_bindings: function(oldlist, newlist) { var that = this; _.each(oldlist, function(elt) {elt[0].off("change:" + elt[1], null, that);}); _.each(newlist, function(elt) {elt[0].on("change:" + elt[1], function(model, value, options) { that.update_value(elt); }, that); // TODO: register for any destruction handlers // to take an item out of the list }); }, update_value: function(elt) { if (this.updating) {return;} var model = elt[0]; var attr = elt[1]; var new_value = model.get(attr); this.updating = true; _.each(_.without(this.get("widgets"), elt), function(element, index, list) { if (element[0]) { element[0].set(element[1], new_value); element[0].save_changes(); } }, this); this.updating = false; }, }); var DirectionalLinkModel = widget.WidgetModel.extend({ initialize: function() { this.on("change", this.update_bindings, this); this.once("destroy", function() { if (this.source) { this.source[0].off("change:" + this.source[1], null, this); } }, this); }, update_bindings: function() { if (this.source) { this.source[0].off("change:" + this.source[1], null, this); } this.source = this.get("source"); if (this.source) { this.source[0].on("change:" + this.source[1], function() { this.update_value(this.source); }, this); this.update_value(this.source); } }, update_value: function(elt) { if (this.updating) {return;} var model = elt[0]; var attr = elt[1]; var new_value = model.get(attr); this.updating = true; _.each(this.get("targets"), function(element, index, list) { if (element[0]) { element[0].set(element[1], new_value); element[0].save_changes(); } }, this); this.updating = false; }, }); return { "LinkModel": LinkModel, "DirectionalLinkModel": DirectionalLinkModel, } });