From 3e89d6390d92b454597863598db7d5c961db0b9d 2014-01-16 10:56:04 From: Jonathan Frederic Date: 2014-01-16 10:56:04 Subject: [PATCH] Decoupled cell_index from widget model code. --- diff --git a/IPython/html/static/notebook/js/widget.js b/IPython/html/static/notebook/js/widget.js index d1b6ceb..44d8a5c 100644 --- a/IPython/html/static/notebook/js/widget.js +++ b/IPython/html/static/notebook/js/widget.js @@ -55,8 +55,8 @@ define(["components/underscore/underscore-min", this.last_modified_view = caller; this.save(this.changedAttributes(), {patch: true}); - for (var cell_index in this.views) { - var views = this.views[cell_index]; + for (var output_area in this.views) { + var views = this.views[output_area]; for (var view_index in views) { var view = views[view_index]; if (view !== caller) { @@ -123,7 +123,7 @@ define(["components/underscore/underscore-min", } var data = {sync_method: method, sync_data: send_json}; - var output_area = this._get_view_output_area(this.last_modified_view); + var output_area = this.last_modified_view.output_area; var callbacks = this._make_callbacks(output_area); this.comm.send(data, callbacks); this.pending_msgs++; @@ -143,14 +143,14 @@ define(["components/underscore/underscore-min", case 'display': // Try to get the cell index. - var cell_index = this._get_cell_index(msg.parent_header.msg_id); - if (cell_index == -1) { + var output_area = this._get_output_area(msg.parent_header.msg_id); + if (output_area == null) { console.log("Could not determine where the display" + " message was from. Widget will not be displayed") } else { this.display_view(msg.content.data.view_name, msg.content.data.parent, - cell_index); + output_area); } break; case 'update': @@ -183,8 +183,8 @@ define(["components/underscore/underscore-min", // Handle when a widget is closed. handle_comm_closed: function (msg) { - for (var cell_index in this.views) { - var views = this.views[cell_index]; + for (var output_area in this.views) { + var views = this.views[output_area]; for (var view_index in views) { var view = views[view_index]; view.remove(); @@ -194,18 +194,18 @@ define(["components/underscore/underscore-min", // Create view that represents the model. - display_view: function (view_name, parent_comm_id, cell_index) { + display_view: function (view_name, parent_comm_id, output_area) { var new_views = []; var displayed = false; if (parent_comm_id != undefined) { var parent_comm = this.comm_manager.comms[parent_comm_id]; var parent_model = parent_comm.model; - var parent_views = parent_model.views[cell_index]; + var parent_views = parent_model.views[output_area]; for (var parent_view_index in parent_views) { var parent_view = parent_views[parent_view_index]; if (parent_view.display_child != undefined) { - var view = this._create_view(view_name, cell_index); + var view = this._create_view(view_name, output_area); new_views.push(view); parent_view.display_child(view); displayed = true; @@ -216,10 +216,9 @@ define(["components/underscore/underscore-min", if (!displayed) { // No parent view is defined or exists. Add the view's // element to cell's widget div. - var view = this._create_view(view_name, cell_index); + var view = this._create_view(view_name, output_area); new_views.push(view); - var cell = IPython.notebook.get_cell(cell_index); - cell.element.find('.widget-area').find('.widget-subarea') + output_area.element.find('.widget-area').find('.widget-subarea') .append(view.$el) .parent().show(); // Show the widget_area (parent of widget_subarea) @@ -233,25 +232,25 @@ define(["components/underscore/underscore-min", // Create a view - _create_view: function (view_name, cell_index) { + _create_view: function (view_name, output_area) { var view = new this.widget_view_types[view_name]({model: this}); view.render(); - if (this.views[cell_index]==undefined) { - this.views[cell_index] = [] + if (this.views[output_area]==undefined) { + this.views[output_area] = [] } - this.views[cell_index].push(view); - view.cell_index = cell_index; + this.views[output_area].push(view); + view.output_area = output_area; // Handle when the view element is remove from the page. var that = this; view.$el.on("remove", function(){ - var index = that.views[cell_index].indexOf(view); + var index = that.views[output_area].indexOf(view); if (index > -1) { - that.views[cell_index].splice(index, 1); + that.views[output_area].splice(index, 1); } view.remove(); // Clean-up view - if (that.views[cell_index].length()==0) { - delete that.views[cell_index]; + if (that.views[output_area].length()==0) { + delete that.views[output_area]; } // Close the comm if there are no views left. @@ -275,12 +274,12 @@ define(["components/underscore/underscore-min", status : function(msg){ that.handle_status(output_area, msg); }, - get_cell_index : function() { + get_output_area : function() { if (that.last_modified_view != undefined && - that.last_modified_view.cell_index != undefined) { - return that.last_modified_view.cell_index; + that.last_modified_view.output_area != undefined) { + return that.last_modified_view.output_area; } else { - return -1 + return null } }, }, @@ -291,41 +290,32 @@ define(["components/underscore/underscore-min", // Get the cell index corresponding to the msg_id. - _get_cell_index: function (msg_id) { + // output_area is a JQuery DOM element handle that has widget_area + // and nested widget_subarea elements. + _get_output_area: function (msg_id) { // First, guess cell.execute triggered var cells = IPython.notebook.get_cells(); for (var cell_index in cells) { if (cells[cell_index].last_msg_id == msg_id) { - return cell_index; + var cell = IPython.notebook.get_cell(cell_index) + return cell.output_area; } } // Second, guess widget triggered var callbacks = this.comm_manager.kernel.get_callbacks_for_msg(msg_id) - if (callbacks != undefined && callbacks.iopub != undefined && callbacks.iopub.get_cell_index != undefined) { - var cell_index = callbacks.iopub.get_cell_index(); - if (cell_index > -1) { - return cell_index; + if (callbacks != undefined && callbacks.iopub != undefined && callbacks.iopub.get_output_area != undefined) { + var output_area = callbacks.iopub.get_output_area(); + if (output_area != null) { + return output_area; } } // Not triggered by a widget or a cell - return -1; + return null; }, - - // Get the cell output area corresponding to the view. - _get_view_output_area: function (view) { - return this._get_cell_output_area(view.cell_index); - }, - - - // Get the cell output area corresponding to the cell index. - _get_cell_output_area: function (cell_index) { - var cell = IPython.notebook.get_cell(cell_index) - return cell.output_area; - }, });