Show More
@@ -7,7 +7,7 b' define([' | |||
|
7 | 7 | "jquery", |
|
8 | 8 | "base/js/namespace" |
|
9 | 9 | ], function (_, Backbone, $, IPython) { |
|
10 | ||
|
10 | "use strict"; | |
|
11 | 11 | //-------------------------------------------------------------------- |
|
12 | 12 | // WidgetManager class |
|
13 | 13 | //-------------------------------------------------------------------- |
@@ -52,15 +52,14 b' define([' | |||
|
52 | 52 | console.log("Could not determine where the display" + |
|
53 | 53 | " message was from. Widget will not be displayed"); |
|
54 | 54 | } else { |
|
55 | var view = this.create_view(model, {cell: cell}); | |
|
56 | if (view === null) { | |
|
57 | console.error("View creation failed", model); | |
|
58 | } | |
|
59 | this._handle_display_view(view); | |
|
60 | if (cell.widget_subarea) { | |
|
61 | cell.widget_subarea.append(view.$el); | |
|
62 | } | |
|
63 | view.trigger('displayed'); | |
|
55 | var that = this; | |
|
56 | this.create_view(model, {cell: cell, callback: function(view) { | |
|
57 | that._handle_display_view(view); | |
|
58 | if (cell.widget_subarea) { | |
|
59 | cell.widget_subarea.append(view.$el); | |
|
60 | } | |
|
61 | view.trigger('displayed'); | |
|
62 | }}); | |
|
64 | 63 | } |
|
65 | 64 | }; |
|
66 | 65 | |
@@ -78,28 +77,43 b' define([' | |||
|
78 | 77 | } |
|
79 | 78 | } |
|
80 | 79 | }; |
|
80 | ||
|
81 | 81 | |
|
82 |
WidgetManager.prototype.create_view = function(model, options |
|
|
82 | WidgetManager.prototype.create_view = function(model, options) { | |
|
83 | 83 | // Creates a view for a particular model. |
|
84 | ||
|
84 | 85 | var view_name = model.get('_view_name'); |
|
85 | var ViewType = WidgetManager._view_types[view_name]; | |
|
86 | if (ViewType) { | |
|
87 | ||
|
88 | // If a view is passed into the method, use that view's cell as | |
|
89 | // the cell for the view that is created. | |
|
90 | options = options || {}; | |
|
91 | if (view !== undefined) { | |
|
92 |
options |
|
|
86 | var view_mod = model.get('_view_module'); | |
|
87 | var errback = options.errback || function(err) {console.log(err);}; | |
|
88 | ||
|
89 | var instantiate_view = function(ViewType) { | |
|
90 | if (ViewType) { | |
|
91 | // If a view is passed into the method, use that view's cell as | |
|
92 | // the cell for the view that is created. | |
|
93 | options = options || {}; | |
|
94 | if (options.parent !== undefined) { | |
|
95 | options.cell = options.parent.options.cell; | |
|
96 | } | |
|
97 | ||
|
98 | // Create and render the view... | |
|
99 | var parameters = {model: model, options: options}; | |
|
100 | var view = new ViewType(parameters); | |
|
101 | view.render(); | |
|
102 | model.on('destroy', view.remove, view); | |
|
103 | options.callback(view); | |
|
104 | } else { | |
|
105 | errback({unknown_view: true, view_name: view_name, | |
|
106 | view_module: view_mod}); | |
|
93 | 107 | } |
|
108 | }; | |
|
94 | 109 | |
|
95 | // Create and render the view... | |
|
96 | var parameters = {model: model, options: options}; | |
|
97 | view = new ViewType(parameters); | |
|
98 |
|
|
|
99 | model.on('destroy', view.remove, view); | |
|
100 | return view; | |
|
110 | if (view_mod) { | |
|
111 | require([view_mod], function(module) { | |
|
112 | instantiate_view(module[view_name]); | |
|
113 | }, errback); | |
|
114 | } else { | |
|
115 | instantiate_view(WidgetManager._view_types[view_name]); | |
|
101 | 116 | } |
|
102 | return null; | |
|
103 | 117 | }; |
|
104 | 118 | |
|
105 | 119 | WidgetManager.prototype.get_msg_cell = function (msg_id) { |
@@ -317,18 +317,21 b' define(["widgets/js/manager",' | |||
|
317 | 317 | // TODO: this is hacky, and makes the view depend on this cell attribute and widget manager behavior |
|
318 | 318 | // it would be great to have the widget manager add the cell metadata |
|
319 | 319 | // to the subview without having to add it here. |
|
320 | options = $.extend({ parent: this }, options || {}); | |
|
321 | var child_view = this.model.widget_manager.create_view(child_model, options, this); | |
|
322 | ||
|
323 | // Associate the view id with the model id. | |
|
324 |
if (th |
|
|
325 |
|
|
|
326 | } | |
|
327 |
|
|
|
320 | var that = this; | |
|
321 | var old_callback = options.callback || function(view) {}; | |
|
322 | options = $.extend({ parent: this, callback: function(child_view) { | |
|
323 | // Associate the view id with the model id. | |
|
324 | if (that.child_model_views[child_model.id] === undefined) { | |
|
325 | that.child_model_views[child_model.id] = []; | |
|
326 | } | |
|
327 | that.child_model_views[child_model.id].push(child_view.id); | |
|
328 | 328 | |
|
329 | // Remember the view by id. | |
|
330 |
|
|
|
331 |
|
|
|
329 | // Remember the view by id. | |
|
330 | that.child_views[child_view.id] = child_view; | |
|
331 | old_callback(child_view); | |
|
332 | }}, options || {}); | |
|
333 | ||
|
334 | this.model.widget_manager.create_view(child_model, options); | |
|
332 | 335 | }, |
|
333 | 336 | |
|
334 | 337 | pop_child_view: function(child_model) { |
@@ -74,13 +74,15 b' define([' | |||
|
74 | 74 | |
|
75 | 75 | add_child_model: function(model) { |
|
76 | 76 | // Called when a model is added to the children list. |
|
77 | var view = this.create_child_view(model); | |
|
78 | this.$box.append(view.$el); | |
|
77 | var that = this; | |
|
78 | this.create_child_view(model, {callback: function(view) { | |
|
79 | that.$box.append(view.$el); | |
|
79 | 80 | |
|
80 | // Trigger the displayed event of the child view. | |
|
81 |
|
|
|
82 | view.trigger('displayed'); | |
|
83 | }); | |
|
81 | // Trigger the displayed event of the child view. | |
|
82 | that.after_displayed(function() { | |
|
83 | view.trigger('displayed'); | |
|
84 | }); | |
|
85 | }}); | |
|
84 | 86 | }, |
|
85 | 87 | }); |
|
86 | 88 |
@@ -81,7 +81,6 b' define([' | |||
|
81 | 81 | |
|
82 | 82 | add_child_model: function(model) { |
|
83 | 83 | // Called when a child is added to children list. |
|
84 | var view = this.create_child_view(model); | |
|
85 | 84 | var index = this.containers.length; |
|
86 | 85 | var uuid = utils.uuid(); |
|
87 | 86 | var accordion_group = $('<div />') |
@@ -114,15 +113,18 b' define([' | |||
|
114 | 113 | var container_index = this.containers.push(accordion_group) - 1; |
|
115 | 114 | accordion_group.container_index = container_index; |
|
116 | 115 | this.model_containers[model.id] = accordion_group; |
|
117 | accordion_inner.append(view.$el); | |
|
116 | ||
|
117 | this.create_child_view(model, {callback: function(view) { | |
|
118 | accordion_inner.append(view.$el); | |
|
118 | 119 | |
|
119 |
|
|
|
120 |
|
|
|
120 | that.update(); | |
|
121 | that.update_titles(); | |
|
121 | 122 | |
|
122 | // Trigger the displayed event of the child view. | |
|
123 |
|
|
|
124 | view.trigger('displayed'); | |
|
125 | }); | |
|
123 | // Trigger the displayed event of the child view. | |
|
124 | that.after_displayed(function() { | |
|
125 | view.trigger('displayed'); | |
|
126 | }); | |
|
127 | }}); | |
|
126 | 128 | }, |
|
127 | 129 | }); |
|
128 | 130 | |
@@ -176,7 +178,6 b' define([' | |||
|
176 | 178 | |
|
177 | 179 | add_child_model: function(model) { |
|
178 | 180 | // Called when a child is added to children list. |
|
179 | var view = this.create_child_view(model); | |
|
180 | 181 | var index = this.containers.length; |
|
181 | 182 | var uuid = utils.uuid(); |
|
182 | 183 | |
@@ -184,34 +185,37 b' define([' | |||
|
184 | 185 | var tab = $('<li />') |
|
185 | 186 | .css('list-style-type', 'none') |
|
186 | 187 | .appendTo(this.$tabs); |
|
187 | view.parent_tab = tab; | |
|
188 | ||
|
189 | var tab_text = $('<a />') | |
|
190 | .attr('href', '#' + uuid) | |
|
191 | .attr('data-toggle', 'tab') | |
|
192 | .text('Page ' + index) | |
|
193 | .appendTo(tab) | |
|
194 | .click(function (e) { | |
|
195 | 188 | |
|
196 | // Calling model.set will trigger all of the other views of the | |
|
197 | // model to update. | |
|
198 | that.model.set("selected_index", index, {updated_view: this}); | |
|
199 |
|
|
|
200 | that.select_page(index); | |
|
189 | this.create_child_view(model, {callback: function(view) { | |
|
190 | view.parent_tab = tab; | |
|
191 | ||
|
192 | var tab_text = $('<a />') | |
|
193 | .attr('href', '#' + uuid) | |
|
194 | .attr('data-toggle', 'tab') | |
|
195 | .text('Page ' + index) | |
|
196 | .appendTo(tab) | |
|
197 | .click(function (e) { | |
|
198 | ||
|
199 | // Calling model.set will trigger all of the other views of the | |
|
200 | // model to update. | |
|
201 | that.model.set("selected_index", index, {updated_view: that}); | |
|
202 | that.touch(); | |
|
203 | that.select_page(index); | |
|
204 | }); | |
|
205 | tab.tab_text_index = that.containers.push(tab_text) - 1; | |
|
206 | ||
|
207 | var contents_div = $('<div />', {id: uuid}) | |
|
208 | .addClass('tab-pane') | |
|
209 | .addClass('fade') | |
|
210 | .append(view.$el) | |
|
211 | .appendTo(that.$tab_contents); | |
|
212 | view.parent_container = contents_div; | |
|
213 | ||
|
214 | // Trigger the displayed event of the child view. | |
|
215 | that.after_displayed(function() { | |
|
216 | view.trigger('displayed'); | |
|
201 | 217 | }); |
|
202 | tab.tab_text_index = this.containers.push(tab_text) - 1; | |
|
203 | ||
|
204 | var contents_div = $('<div />', {id: uuid}) | |
|
205 | .addClass('tab-pane') | |
|
206 | .addClass('fade') | |
|
207 | .append(view.$el) | |
|
208 | .appendTo(this.$tab_contents); | |
|
209 | view.parent_container = contents_div; | |
|
210 | ||
|
211 | // Trigger the displayed event of the child view. | |
|
212 | this.after_displayed(function() { | |
|
213 | view.trigger('displayed'); | |
|
214 | }); | |
|
218 | }}); | |
|
215 | 219 | }, |
|
216 | 220 | |
|
217 | 221 | update: function(options) { |
@@ -100,6 +100,8 b' class Widget(LoggingConfigurable):' | |||
|
100 | 100 | #------------------------------------------------------------------------- |
|
101 | 101 | _model_name = Unicode('WidgetModel', help="""Name of the backbone model |
|
102 | 102 | registered in the front-end to create and sync this widget with.""") |
|
103 | _view_module = Unicode(help="""A requirejs module in which to find _view_name. | |
|
104 | If empty, look in the global registry.""", sync=True) | |
|
103 | 105 | _view_name = Unicode(None, allow_none=True, help="""Default view registered in the front-end |
|
104 | 106 | to use to represent the widget.""", sync=True) |
|
105 | 107 | comm = Instance('IPython.kernel.comm.Comm') |
General Comments 0
You need to be logged in to leave comments.
Login now