From 2ffd153e5dc9c5fb243c672f6258044f9645557d Mon Sep 17 00:00:00 2001 From: "Brian E. Granger" Date: Thu, 8 May 2014 11:44:49 -0500 Subject: [PATCH 1/5] Removing double call to model.views.push(view) in WidgetManager. --- IPython/html/static/widgets/js/manager.js | 1 - 1 file changed, 1 deletion(-) diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js index 67eeb90cb..66f8090f6 100644 --- a/IPython/html/static/widgets/js/manager.js +++ b/IPython/html/static/widgets/js/manager.js @@ -120,7 +120,6 @@ var parameters = {model: model, options: options}; view = new ViewType(parameters); view.render(); - model.views.push(view); model.on('destroy', view.remove, view); return view; } From 6c03b508a56520ef35f1fdadc0909b069cd12621 Mon Sep 17 00:00:00 2001 From: "Brian E. Granger" Date: Thu, 8 May 2014 11:59:20 -0500 Subject: [PATCH 2/5] Pop child view from child_model.view in delete_child_view --- IPython/html/static/widgets/js/widget.js | 1 + 1 file changed, 1 insertion(+) diff --git a/IPython/html/static/widgets/js/widget.js b/IPython/html/static/widgets/js/widget.js index 04a1fd878..e40ffef17 100644 --- a/IPython/html/static/widgets/js/widget.js +++ b/IPython/html/static/widgets/js/widget.js @@ -313,6 +313,7 @@ function(WidgetManager, _, Backbone){ if (view !== undefined) { delete this.child_views[child_model.id]; view.remove(); + child_model.views.pop(view); } }, From a0c1d37224ce69eee7743c2fb84eaa3918062eb2 Mon Sep 17 00:00:00 2001 From: "Brian E. Granger" Date: Thu, 8 May 2014 12:06:20 -0500 Subject: [PATCH 3/5] Remove model from WidgetManager._model on comm:close. --- IPython/html/static/widgets/js/manager.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js index 66f8090f6..d1af78c0a 100644 --- a/IPython/html/static/widgets/js/manager.js +++ b/IPython/html/static/widgets/js/manager.js @@ -197,9 +197,13 @@ WidgetManager.prototype._handle_comm_open = function (comm, msg) { // Handle when a comm is opened. + var that = this; var model_id = comm.comm_id; var widget_type_name = msg.content.target_name; var widget_model = new WidgetManager._model_types[widget_type_name](this, model_id, comm); + widget_model.on('comm:close', function () { + delete that._models[model_id]; + }); this._models[model_id] = widget_model; }; From c83a1cbb63a1a4a89ce12d83e613fbe0e64ce46b Mon Sep 17 00:00:00 2001 From: Jonathan Frederic Date: Thu, 8 May 2014 13:46:48 -0500 Subject: [PATCH 4/5] Fixed bugs in displayed event triggering for containers --- IPython/html/static/widgets/js/manager.js | 1 + .../static/widgets/js/widget_container.js | 35 ++++++++++++++++++- .../widgets/js/widget_selectioncontainer.js | 30 ++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js index d1af78c0a..4cab8e3f2 100644 --- a/IPython/html/static/widgets/js/manager.js +++ b/IPython/html/static/widgets/js/manager.js @@ -123,6 +123,7 @@ model.on('destroy', view.remove, view); return view; } + console.log('VIEW NOT REGISTERED?!'); return null; }; diff --git a/IPython/html/static/widgets/js/widget_container.js b/IPython/html/static/widgets/js/widget_container.js index 6fcbaca84..c55f35959 100644 --- a/IPython/html/static/widgets/js/widget_container.js +++ b/IPython/html/static/widgets/js/widget_container.js @@ -27,6 +27,18 @@ define(["widgets/js/widget"], function(WidgetManager) { this.update_children(model.previous('_children'), value); }, this); this.update(); + + // Trigger model displayed events for any models that are child to + // this model when this model is displayed. + var that = this; + this.model.on('displayed', function(){ + that.is_displayed = true; + for (var property in that.child_views) { + if (that.child_views.hasOwnProperty(property)) { + that.child_views[property].model.trigger('displayed'); + } + } + }); }, update_children: function(old_list, new_list) { @@ -47,6 +59,11 @@ define(["widgets/js/widget"], function(WidgetManager) { // Called when a model is added to the children list. var view = this.create_child_view(model); this.$el.append(view.$el); + + // Trigger the displayed event if this model is displayed. + if (this.is_displayed) { + model.trigger('displayed'); + } }, update: function(){ @@ -81,7 +98,7 @@ define(["widgets/js/widget"], function(WidgetManager) { // need to know about all of the top-level widgets. The IPython // widget manager uses this to register the elements with the // keyboard manager. - this.additional_elements = [this.$window] + this.additional_elements = [this.$window]; this.$title_bar = $('
') .addClass('popover-title') @@ -169,6 +186,17 @@ define(["widgets/js/widget"], function(WidgetManager) { this.update_children(model.previous('_children'), value); }, this); this.update(); + + // Trigger model displayed events for any models that are child to + // this model when this model is displayed. + this.model.on('displayed', function(){ + that.is_displayed = true; + for (var property in that.child_views) { + if (that.child_views.hasOwnProperty(property)) { + that.child_views[property].model.trigger('displayed'); + } + } + }); }, hide: function() { @@ -228,6 +256,11 @@ define(["widgets/js/widget"], function(WidgetManager) { // Called when a child is added to children list. var view = this.create_child_view(model); this.$body.append(view.$el); + + // Trigger the displayed event if this model is displayed. + if (this.is_displayed) { + model.trigger('displayed'); + } }, update: function(){ diff --git a/IPython/html/static/widgets/js/widget_selectioncontainer.js b/IPython/html/static/widgets/js/widget_selectioncontainer.js index 203135661..a585162ac 100644 --- a/IPython/html/static/widgets/js/widget_selectioncontainer.js +++ b/IPython/html/static/widgets/js/widget_selectioncontainer.js @@ -35,8 +35,17 @@ define(["widgets/js/widget"], function(WidgetManager){ this.model.on('change:_titles', function(model, value, options) { this.update_titles(value); }, this); + var that = this; this.model.on('displayed', function() { this.update_titles(); + // Trigger model displayed events for any models that are child to + // this model when this model is displayed. + that.is_displayed = true; + for (var property in that.child_views) { + if (that.child_views.hasOwnProperty(property)) { + that.child_views[property].model.trigger('displayed'); + } + } }, this); }, @@ -125,6 +134,11 @@ define(["widgets/js/widget"], function(WidgetManager){ this.update(); this.update_titles(); + + // Trigger the displayed event if this model is displayed. + if (this.is_displayed) { + model.trigger('displayed'); + } }, }); WidgetManager.register_widget_view('AccordionView', AccordionView); @@ -153,6 +167,17 @@ define(["widgets/js/widget"], function(WidgetManager){ this.model.on('change:_children', function(model, value, options) { this.update_children(model.previous('_children'), value); }, this); + + // Trigger model displayed events for any models that are child to + // this model when this model is displayed. + this.model.on('displayed', function(){ + that.is_displayed = true; + for (var property in that.child_views) { + if (that.child_views.hasOwnProperty(property)) { + that.child_views[property].model.trigger('displayed'); + } + } + }); }, update_children: function(old_list, new_list) { @@ -206,6 +231,11 @@ define(["widgets/js/widget"], function(WidgetManager){ .append(view.$el) .appendTo(this.$tab_contents); view.parent_container = contents_div; + + // Trigger the displayed event if this model is displayed. + if (this.is_displayed) { + model.trigger('displayed'); + } }, update: function(options) { From a65b6f3c1e0e48fdf63019126b5d51b341067aac Mon Sep 17 00:00:00 2001 From: Jonathan Frederic Date: Thu, 8 May 2014 13:50:00 -0500 Subject: [PATCH 5/5] Removed log statement --- IPython/html/static/widgets/js/manager.js | 1 - 1 file changed, 1 deletion(-) diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js index 4cab8e3f2..d1af78c0a 100644 --- a/IPython/html/static/widgets/js/manager.js +++ b/IPython/html/static/widgets/js/manager.js @@ -123,7 +123,6 @@ model.on('destroy', view.remove, view); return view; } - console.log('VIEW NOT REGISTERED?!'); return null; };