##// END OF EJS Templates
LOTS OF WIDGET CHANGES...
Jonathan Frederic -
Show More
@@ -20,8 +20,8
20 20 // Use require.js 'define' method so that require.js is intelligent enough to
21 21 // syncronously load everything within this file when it is being 'required'
22 22 // elsewhere.
23 define(["static/components/underscore/underscore-min.js",
24 "static/components/backbone/backbone-min.js",
23 define(["../../components/underscore/underscore-min.js",
24 "../../components/backbone/backbone-min.js",
25 25 ], function(){
26 26
27 27 // Only run once on a notebook.
@@ -31,15 +31,236 define(["static/components/underscore/underscore-min.js",
31 31 // WidgetModel class
32 32 //--------------------------------------------------------------------
33 33 var WidgetModel = Backbone.Model.extend({
34 apply: function(sender) {
34 constructor: function(comm_manager, comm, widget_view_types) {
35 this.comm_manager = comm_manager;
36 this.widget_view_types = widget_view_types;
37 this.pending_msgs = 0;
38 this.msg_throttle = 3;
39 this.msg_buffer = {};
40 this.views = {};
41
42 // Remember comm associated with the model.
43 this.comm = comm;
44 comm.model = this;
45
46 // Hook comm messages up to model.
47 comm.on_close($.proxy(this.handle_comm_closed, this));
48 comm.on_msg($.proxy(this.handle_comm_msg, this));
49
50 return Backbone.Model.apply(this);
51 },
52
53
54 update_other_views: function(caller) {
55 this.last_modified_view = caller;
35 56 this.save(this.changedAttributes(), {patch: true});
36 57
37 for (var index in this.views) {
38 var view = this.views[index];
39 if (view !== sender) {
58 for (var cell_index in this.views) {
59 var view = this.views[cell_index];
60 if (view !== caller) {
40 61 view.refresh();
41 62 }
42 63 }
64 },
65
66
67 handle_status: function (output_area, msg) {
68 //execution_state : ('busy', 'idle', 'starting')
69 if (msg.content.execution_state=='idle') {
70
71 // Send buffer if this message caused another message to be
72 // throttled.
73 if (this.msg_throttle == this.pending_msgs &&
74 this.msg_buffer.length > 0) {
75
76 var output_area = this._get_msg_output_area(msg);
77 var callbacks = this._make_callbacks(output_area);
78 var data = {sync_method: 'patch', sync_data: this.msg_buffer};
79 comm.send(data, callbacks);
80 this.msg_buffer = {};
81 } else {
82
83 // Only decrease the pending message count if the buffer
84 // doesn't get flushed (sent).
85 --this.pending_msgs;
86 }
87 }
88 },
89
90
91 // Custom syncronization logic.
92 handle_sync: function (method, options) {
93 var model_json = this.toJSON();
94
95 // Only send updated state if the state hasn't been changed
96 // during an update.
97 if (!this.updating) {
98 if (this.pending_msgs >= this.msg_throttle) {
99 // The throttle has been exceeded, buffer the current msg so
100 // it can be sent once the kernel has finished processing
101 // some of the existing messages.
102 if (method=='patch') {
103 for (var attr in options.attrs) {
104 this.msg_buffer[attr] = options.attrs[attr];
105 }
106 } else {
107 this.msg_buffer = $.extend({}, model_json); // Copy
108 }
109
110 } else {
111 // We haven't exceeded the throttle, send the message like
112 // normal. If this is a patch operation, just send the
113 // changes.
114 var send_json = model_json;
115 if (method=='patch') {
116 send_json = {};
117 for (var attr in options.attrs) {
118 send_json[attr] = options.attrs[attr];
119 }
120 }
121
122 var data = {sync_method: method, sync_data: send_json};
123 var output_area = this._get_view_output_area(this.last_modified_view);
124 var callbacks = this._make_callbacks();
125 this.comm.send(data, callbacks);
126 this.pending_msgs++;
127 }
128 }
129
130 // Since the comm is a one-way communication, assume the message
131 // arrived.
132 return model_json;
133 },
134
135
136 // Handle incomming comm msg.
137 handle_comm_msg: function (comm, msg) {
138 var method = msg.content.data.method;
139 switch (method){
140 case 'display':
141
142 ////////////////////////// TODO: Get cell index via currently executing cell.
143 var cell_index = IPython.notebook.get_selected_index()-1;
144
145 this.display_view(msg.content.data.view_name,
146 msg.content.data.parent,
147 cell_index);
148 break;
149 case 'update':
150 this.handle_update(msg.content.data.state);
151 break;
152 }
153 }
154
155
156 // Handle when a widget is updated via the python side.
157 handle_update: function (state) {
158 this.updating = true;
159 try {
160 for (var key in state) {
161 if (state.hasOwnProperty(key)) {
162 if (key == "_css"){
163 this.css = state[key];
164 } else {
165 this.set(key, state[key]);
166 }
167 }
168 }
169 this.id = this.comm.comm_id;
170 this.save();
171 } finally {
172 this.updating = false;
173 }
174 }
175
176
177 // Handle when a widget is closed.
178 handle_comm_closed: function (msg) {
179 for (var cell_index in this.views) {
180 var view = this.views[cell_index];
181 view.remove();
182 }
183 }
184
185
186 // Create view that represents the model.
187 display_view = function (view_name, parent_comm_id, cell_index) {
188 var view = new this.widget_view_types[view_name]({model: this});
189 view.render();
190 this.views[cell_index] = view;
191 view.cell_index = cell_index;
192
193 // Handle when the view element is remove from the page.
194 var that = this;
195 view.$el.on("remove", function(){
196 var index = that.views.indexOf(view);
197 if (index > -1) {
198 that.views.splice(index, 1);
199 }
200 view.remove(); // Clean-up view
201
202 // Close the comm if there are no views left.
203 if (that.views.length()==0) {
204 that.comm.close();
205 }
206 });
207
208 var display_child = null;
209 if (parent_comm_id != undefined) {
210 var parent_comm = this.comm_manager.comms[parent_comm_id];
211 var parent_model = parent_comm.model;
212 var parent_view = parent_model.views[cell_id];
213 if (parent_view.display_child != undefined) {
214 display_child = parent_view.display_child;
215 }
216 }
217
218 if (display_child != null) {
219 display_child(view.$el);
220 } else {
221 // No parent view is defined or exists. Add the view's
222 // element to cell's widget div.
223 var cell = IPython.notebook.get_cell(cell_index);
224 cell.element.find('.widget_area').find('.widget_subarea')
225 .append(view.$el)
226 .parent().show(); // Show the widget_area (parent of widget_subarea)
227
228 }
229
230 // Update the view based on the model contents.
231 view.refresh();
232 }
233
234
235 // Build a callback dict.
236 _make_callbacks: function (output_area) {
237 var callbacks = {};
238 if (output_area != null) {
239 var that = this;
240 callbacks = {
241 iopub : {
242 output : $.proxy(output_area.handle_output, output_area),
243 clear_output : $.proxy(output_area.handle_clear_output, output_area),
244 status : function(msg){
245 that.handle_status(output_area, msg);
246 },
247 },
248 };
249 }
250 return callbacks;
251 },
252
253
254 // Get the cell output area corresponding to the view.
255 _get_view_output_area : function (view) {
256 return this._get_cell_output_area(view.cell_index);
257 }
258
259
260 // Get the cell output area corresponding to the cell id.
261 _get_cell_output_area : function (cell_id) {
262 var cell = IPython.notebook.get_cell(cell_id)
263 return cell.output_area;
43 264 }
44 265 });
45 266
@@ -53,8 +274,8 define(["static/components/underscore/underscore-min.js",
53 274 this.model.on('change',this.refresh,this);
54 275 },
55 276
56 refresh: function() {
57 this.update();
277 update: function() {
278 var results = Backbone.Model.prototype.update.call(this);
58 279
59 280 if (this.model.css != undefined) {
60 281 for (var selector in this.model.css) {
@@ -79,6 +300,7 define(["static/components/underscore/underscore-min.js",
79 300 }
80 301 }
81 302 }
303 return results;
82 304 },
83 305 });
84 306
@@ -86,240 +308,43 define(["static/components/underscore/underscore-min.js",
86 308 //--------------------------------------------------------------------
87 309 // WidgetManager class
88 310 //--------------------------------------------------------------------
89 // Public constructor
90 311 var WidgetManager = function(comm_manager){
91 312 this.comm_manager = comm_manager;
92 313 this.widget_model_types = {};
93 314 this.widget_view_types = {};
94 this.model_widget_views = {};
95 this.pending_msgs = 0;
96 this.msg_throttle = 3;
97 this.msg_buffer = {};
98 315
99 316 var that = this;
100 317 Backbone.sync = function(method, model, options, error) {
101 var result = that.handle_sync(method, model, options);
318 var result = model.handle_sync(method, options);
102 319 if (options.success) {
103 320 options.success(result);
104 321 }
105 322 };
106 323 }
107 324
108 // Register a widget model type.
325
109 326 WidgetManager.prototype.register_widget_model = function (widget_model_name, widget_model_type) {
110
111 327 // Register the widget with the comm manager. Make sure to pass this object's context
112 328 // in so `this` works in the call back.
113 329 this.comm_manager.register_target(widget_model_name, $.proxy(this.handle_com_open, this));
114
115 // Register the types of the model and view correspong to this widget type. Later
116 // the widget manager will initialize these when the comm is opened.
117 330 this.widget_model_types[widget_model_name] = widget_model_type;
118 331 }
119 332
120 // Register a widget view type.
333
121 334 WidgetManager.prototype.register_widget_view = function (widget_view_name, widget_view_type) {
122 335 this.widget_view_types[widget_view_name] = widget_view_type;
123 336 }
124 337
125 // Handle when a comm is opened.
338
126 339 WidgetManager.prototype.handle_com_open = function (comm, msg) {
127 340 var widget_type_name = msg.content.target_name;
128
129 // Create the corresponding widget model.
130 var widget_model = new this.widget_model_types[widget_type_name];
131
132 // Remember comm associated with the model.
133 widget_model.comm = comm;
134 comm.model = widget_model;
135
136 // Create an array to remember the views associated with the model.
137 widget_model.views = [];
138
139 // Add a handle to delete the control when the comm is closed.
140 var that = this;
141 var handle_close = function(msg) {
142 that.handle_comm_closed(comm, msg);
143 }
144 comm.on_close(handle_close);
145
146 // Handle incomming messages.
147 var handle_msg = function(msg) {
148 that.handle_comm_msg(comm, msg);
149 }
150 comm.on_msg(handle_msg);
341 var widget_model = new this.widget_model_types[widget_type_name](this.comm_manager, comm, view_types);
151 342 }
152 343
153 // Create view that represents the model.
154 WidgetManager.prototype.show_view = function (widget_area, widget_model, widget_view_name) {
155 var widget_view = new this.widget_view_types[widget_view_name]({model: widget_model});
156 widget_view.render();
157 widget_model.views.push(widget_view);
158
159 // Handle when the view element is remove from the page.
160 widget_view.$el.on("remove", function(){
161 var index = widget_model.views.indexOf(widget_view);
162 if (index > -1) {
163 widget_model.views.splice(index, 1);
164 }
165 widget_view.remove(); // Clean-up view
166
167 // Close the comm if there are no views left.
168 if (widget_model.views.length()==0) {
169 widget_model.comm.close();
170 }
171 });
172
173 // Add the view's element to cell's widget div.
174 widget_area
175 .append(widget_view.$el)
176 .parent().show(); // Show the widget_area (parent of widget_subarea)
177
178 // Update the view based on the model contents.
179 widget_view.refresh();
180 }
181
182 // Handle incomming comm msg.
183 WidgetManager.prototype.handle_comm_msg = function (comm, msg) {
184 // Different logic for different methods.
185 var method = msg.content.data.method;
186 switch (method){
187 case 'show':
188
189 // TODO: Get cell from registered output handler.
190 var cell = IPython.notebook.get_cell(IPython.notebook.get_selected_index()-1);
191 var widget_subarea = cell.element.find('.widget_area').find('.widget_subarea');
192
193 if (msg.content.data.parent != undefined) {
194 var find_results = widget_subarea.find("." + msg.content.data.parent);
195 if (find_results.length > 0) {
196 widget_subarea = find_results;
197 }
198 }
199
200 this.show_view(widget_subarea, comm.model, msg.content.data.view_name);
201 break;
202 case 'update':
203 this.handle_update(comm, msg.content.data.state);
204 break;
205 }
206 }
207
208 // Handle when a widget is updated via the python side.
209 WidgetManager.prototype.handle_update = function (comm, state) {
210 this.updating = true;
211 for (var key in state) {
212 if (state.hasOwnProperty(key)) {
213 if (key == "_css"){
214 comm.model.css = state[key];
215 } else {
216 comm.model.set(key, state[key]);
217 }
218 }
219 }
220 comm.model.id = comm.comm_id;
221 comm.model.save();
222 this.updating = false;
223 }
224
225 // Handle when a widget is closed.
226 WidgetManager.prototype.handle_comm_closed = function (comm, msg) {
227 for (var view_index in comm.model.views) {
228 var view = comm.model.views[view_index];
229 view.remove();
230 }
231 }
232
233 // Handle when a msg status changes in the kernel.
234 WidgetManager.prototype.handle_status = function (msg) {
235 //execution_state : ('busy', 'idle', 'starting')
236 if (msg.content.execution_state=='idle') {
237 // Send buffer if this message caused another message to be
238 // throttled.
239 if (this.msg_throttle == --this.pending_msgs &&
240 this.msg_buffer.length > 0) {
241 var outputarea = this._get_msg_outputarea(msg);
242 var callbacks = this._make_callbacks(outputarea);
243 var data = {sync_method: 'patch', sync_data: this.msg_buffer};
244 comm.send(data, callbacks);
245 this.pending_msgs++;
246 this.msg_buffer = {};
247 }
248 }
249 }
250
251 // Get the cell output area corresponding to the comm.
252 WidgetManager.prototype._get_comm_outputarea = function (comm) {
253 // TODO: get element from comm instead of guessing
254 var cell = IPython.notebook.get_cell(IPython.notebook.get_selected_index())
255 return cell.output_area;
256 }
257
258 // Get the cell output area corresponding to the msg_id.
259 WidgetManager.prototype._get_msg_outputarea = function (msg) {
260 // TODO: get element from msg_id instead of guessing
261 // msg.parent_header.msg_id
262 var cell = IPython.notebook.get_cell(IPython.notebook.get_selected_index())
263 return cell.output_area;
264 }
265
266 // Build a callback dict.
267 WidgetManager.prototype._make_callbacks = function (outputarea) {
268 var callbacks = {};
269 if (outputarea != null) {
270 callbacks = {
271 iopub : {
272 status : $.proxy(this.handle_status, this),
273 output : $.proxy(outputarea.handle_output, outputarea),
274 clear_output : $.proxy(outputarea.handle_clear_output, outputarea)}
275 };
276 }
277 return callbacks;
278 }
279
280 // Send widget state to python backend.
281 WidgetManager.prototype.handle_sync = function (method, model, options) {
282 var model_json = model.toJSON();
283
284 // Only send updated state if the state hasn't been changed during an update.
285 if (!this.updating) {
286 // Create a callback for the output if the widget has an output area associate with it.
287 var callbacks = this._make_callbacks(this._get_comm_outputarea(comm));
288 var comm = model.comm;
289
290 if (this.pending_msgs >= this.msg_throttle) {
291 // The throttle has been exceeded, buffer the current msg so
292 // it can be sent once the kernel has finished processing
293 // some of the existing messages.
294 if (method=='patch') {
295 for (var attr in options.attrs) {
296 this.msg_buffer[attr] = options.attrs[attr];
297 }
298 } else {
299 this.msg_buffer = $.extend({}, model_json); // Copy
300 }
301 } else {
302 // We haven't exceeded the throttle, send the message like
303 // normal. If this is a patch operation, just send the
304 // changes.
305 var send_json = model_json;
306 if (method=='patch') {
307 send_json = {};
308 for (var attr in options.attrs) {
309 send_json[attr] = options.attrs[attr];
310 }
311 }
312 var data = {sync_method: method, sync_data: send_json};
313 comm.send(data, callbacks);
314 this.pending_msgs++;
315 }
316 }
317
318 // Since the comm is a one-way communication, assume the message
319 // arrived.
320 return model_json;
321 }
322 344
345 //--------------------------------------------------------------------
346 // Init code
347 //--------------------------------------------------------------------
323 348 IPython.WidgetManager = WidgetManager;
324 349 IPython.WidgetModel = WidgetModel;
325 350 IPython.WidgetView = WidgetView;
@@ -1,5 +1,5
1 1
2 require(["notebook/js/widget"], function(){
2 require(["../static/notebook/js/widget"], function(){
3 3
4 4 var BoolWidgetModel = IPython.WidgetModel.extend({});
5 5 IPython.notebook.widget_manager.register_widget_model('BoolWidgetModel', BoolWidgetModel);
@@ -9,8 +9,7 require(["notebook/js/widget"], function(){
9 9 // Called when view is rendered.
10 10 render : function(){
11 11 this.$el
12 .html('')
13 .addClass(this.model.comm.comm_id);
12 .html('');
14 13
15 14 var $label = $('<label />')
16 15 .addClass('checkbox')
@@ -39,7 +38,7 require(["notebook/js/widget"], function(){
39 38 handleChanged: function(e) {
40 39 this.user_invoked_update = true;
41 40 this.model.set('value', $(e.target).prop('checked'));
42 this.model.apply(this);
41 this.model.update_other_views(this);
43 42 this.user_invoked_update = false;
44 43 },
45 44 });
@@ -51,8 +50,7 require(["notebook/js/widget"], function(){
51 50 // Called when view is rendered.
52 51 render : function(){
53 52 this.$el
54 .html('')
55 .addClass(this.model.comm.comm_id);
53 .html('');
56 54
57 55 this.$button = $('<button />')
58 56 .addClass('btn')
@@ -82,7 +80,7 require(["notebook/js/widget"], function(){
82 80 handleClick: function(e) {
83 81 this.user_invoked_update = true;
84 82 this.model.set('value', ! $(e.target).hasClass('active'));
85 this.model.apply(this);
83 this.model.update_other_views(this);
86 84 this.user_invoked_update = false;
87 85 },
88 86 });
@@ -1,5 +1,5
1 1
2 require(["notebook/js/widget"], function(){
2 require(["../static/notebook/js/widget"], function(){
3 3
4 4 var ButtonWidgetModel = IPython.WidgetModel.extend({});
5 5 IPython.notebook.widget_manager.register_widget_model('ButtonWidgetModel', ButtonWidgetModel);
@@ -13,7 +13,7 require(["notebook/js/widget"], function(){
13 13 .addClass('btn')
14 14 .click(function() {
15 15 that.model.set('clicks', that.model.get('clicks') + 1);
16 that.model.apply(that);
16 that.model.update_other_views(that);
17 17 });
18 18
19 19 this.update(); // Set defaults.
@@ -1,4 +1,4
1 require(["notebook/js/widget"], function(){
1 require(["../static/notebook/js/widget"], function(){
2 2 var ContainerModel = IPython.WidgetModel.extend({});
3 3 IPython.notebook.widget_manager.register_widget_model('ContainerWidgetModel', ContainerModel);
4 4
@@ -6,8 +6,7 require(["notebook/js/widget"], function(){
6 6
7 7 render : function(){
8 8 this.$el = $('<div />')
9 .addClass('widget_container')
10 .addClass(this.model.comm.comm_id);
9 .addClass('widget_container');
11 10 },
12 11
13 12 update : function(){
@@ -24,6 +23,10 require(["notebook/js/widget"], function(){
24 23 }
25 24 }
26 25 },
26
27 display_child : function($element) {
28 this.$el.append($element);
29 },
27 30 });
28 31
29 32 IPython.notebook.widget_manager.register_widget_view('ContainerView', ContainerView);
@@ -1,4 +1,4
1 require(["notebook/js/widget"], function(){
1 require(["../static/notebook/js/widget"], function(){
2 2 var FloatWidgetModel = IPython.WidgetModel.extend({});
3 3 IPython.notebook.widget_manager.register_widget_model('FloatWidgetModel', FloatWidgetModel);
4 4 }); No newline at end of file
@@ -1,4 +1,4
1 require(["notebook/js/widget"], function(){
1 require(["../static/notebook/js/widget"], function(){
2 2 var FloatRangeWidgetModel = IPython.WidgetModel.extend({});
3 3 IPython.notebook.widget_manager.register_widget_model('FloatRangeWidgetModel', FloatRangeWidgetModel);
4 4
@@ -7,8 +7,7 require(["notebook/js/widget"], function(){
7 7 // Called when view is rendered.
8 8 render : function(){
9 9 this.$el
10 .html('')
11 .addClass(this.model.comm.comm_id);
10 .html('');
12 11 this.$slider = $('<div />')
13 12 .slider({})
14 13 .addClass('slider');
@@ -41,7 +40,7 require(["notebook/js/widget"], function(){
41 40 events: { "slide" : "handleSliderChange" },
42 41 handleSliderChange: function(e, ui) {
43 42 this.model.set('value', ui.value);
44 this.model.apply(this);
43 this.model.update_other_views(this);
45 44 },
46 45 });
47 46
@@ -53,8 +52,7 require(["notebook/js/widget"], function(){
53 52 // Called when view is rendered.
54 53 render : function(){
55 54 this.$el
56 .html('')
57 .addClass(this.model.comm.comm_id);
55 .html('');
58 56 this.$textbox = $('<input type="text" />')
59 57 .addClass('input')
60 58 .appendTo(this.$el);
@@ -106,7 +104,7 require(["notebook/js/widget"], function(){
106 104 if (numericalValue != this.model.get('value')) {
107 105 this.changing = true;
108 106 this.model.set('value', numericalValue);
109 this.model.apply(this);
107 this.model.update_other_views(this);
110 108 this.changing = false;
111 109 }
112 110 }
@@ -1,4 +1,4
1 require(["notebook/js/widget"], function(){
1 require(["../static/notebook/js/widget"], function(){
2 2 var IntWidgetModel = IPython.WidgetModel.extend({});
3 3 IPython.notebook.widget_manager.register_widget_model('IntWidgetModel', IntWidgetModel);
4 4 }); No newline at end of file
@@ -1,4 +1,4
1 require(["notebook/js/widget"], function(){
1 require(["../static/notebook/js/widget"], function(){
2 2 var IntRangeWidgetModel = IPython.WidgetModel.extend({});
3 3 IPython.notebook.widget_manager.register_widget_model('IntRangeWidgetModel', IntRangeWidgetModel);
4 4
@@ -41,7 +41,7 require(["notebook/js/widget"], function(){
41 41 events: { "slide" : "handleSliderChange" },
42 42 handleSliderChange: function(e, ui) {
43 43 this.model.set('value', ~~ui.value); // Double bit-wise not to truncate decimel
44 this.model.apply(this);
44 this.model.update_other_views(this);
45 45 },
46 46 });
47 47
@@ -105,7 +105,7 require(["notebook/js/widget"], function(){
105 105 if (numericalValue != this.model.get('value')) {
106 106 this.changing = true;
107 107 this.model.set('value', numericalValue);
108 this.model.apply(this);
108 this.model.update_other_views(this);
109 109 this.changing = false;
110 110 }
111 111 }
@@ -1,4 +1,4
1 require(["notebook/js/widget"], function(){
1 require(["../static/notebook/js/widget"], function(){
2 2 var SelectionWidgetModel = IPython.WidgetModel.extend({});
3 3 IPython.notebook.widget_manager.register_widget_model('SelectionWidgetModel', SelectionWidgetModel);
4 4
@@ -8,8 +8,7 require(["notebook/js/widget"], function(){
8 8 render : function(){
9 9
10 10 this.$el
11 .html('')
12 .addClass(this.model.comm.comm_id);
11 .html('');
13 12 this.$buttongroup = $('<div />')
14 13 .addClass('widget_item')
15 14 .addClass('btn-group')
@@ -44,7 +43,7 require(["notebook/js/widget"], function(){
44 43 .html(items[index])
45 44 .on('click', function(e){
46 45 that.model.set('value', $(e.target).html(), this );
47 that.model.apply(that);
46 that.model.update_other_views(that);
48 47 })
49 48
50 49 this.$droplist.append($('<li />').append(item_button))
@@ -72,8 +71,7 require(["notebook/js/widget"], function(){
72 71 // Called when view is rendered.
73 72 render : function(){
74 73 this.$el
75 .html('')
76 .addClass(this.model.comm.comm_id);
74 .html('');
77 75 this.update();
78 76 },
79 77
@@ -99,7 +97,7 require(["notebook/js/widget"], function(){
99 97 .prependTo($label)
100 98 .on('click', function(e){
101 99 that.model.set('value', $(e.target).val(), this);
102 that.model.apply();
100 that.model.update_other_views();
103 101 });
104 102 }
105 103
@@ -137,8 +135,7 require(["notebook/js/widget"], function(){
137 135 // Called when view is rendered.
138 136 render : function(){
139 137 this.$el
140 .html('')
141 .addClass(this.model.comm.comm_id);
138 .html('');
142 139 this.$buttongroup = $('<div />')
143 140 .addClass('btn-group')
144 141 .attr('data-toggle', 'buttons-radio')
@@ -164,7 +161,7 require(["notebook/js/widget"], function(){
164 161 .appendTo(this.$buttongroup)
165 162 .on('click', function(e){
166 163 that.model.set('value', $(e.target).html(), this);
167 that.model.apply();
164 that.model.update_other_views();
168 165 });
169 166 }
170 167
@@ -1,4 +1,4
1 require(["notebook/js/widget"], function(){
1 require(["../static/notebook/js/widget"], function(){
2 2 var StringWidgetModel = IPython.WidgetModel.extend({});
3 3 IPython.notebook.widget_manager.register_widget_model('StringWidgetModel', StringWidgetModel);
4 4
@@ -6,8 +6,7 require(["notebook/js/widget"], function(){
6 6
7 7 // Called when view is rendered.
8 8 render : function(){
9 this.$el = $('<div />')
10 .addClass(this.model.comm.comm_id);
9 this.$el = $('<div />');
11 10 this.update(); // Set defaults.
12 11 },
13 12
@@ -26,8 +25,7 require(["notebook/js/widget"], function(){
26 25 // Called when view is rendered.
27 26 render : function(){
28 27 this.$el
29 .html('')
30 .addClass(this.model.comm.comm_id);
28 .html('');
31 29 this.$textbox = $('<textarea />')
32 30 .attr('rows', 5)
33 31 .appendTo(this.$el);
@@ -50,7 +48,7 require(["notebook/js/widget"], function(){
50 48 handleChanging: function(e) {
51 49 this.user_invoked_update = true;
52 50 this.model.set('value', e.target.value);
53 this.model.apply(this);
51 this.model.update_other_views(this);
54 52 this.user_invoked_update = false;
55 53 },
56 54 });
@@ -62,8 +60,7 require(["notebook/js/widget"], function(){
62 60 // Called when view is rendered.
63 61 render : function(){
64 62 this.$el
65 .html('')
66 .addClass(this.model.comm.comm_id);
63 .html('');
67 64 this.$textbox = $('<input type="text" />')
68 65 .addClass('input')
69 66 .appendTo(this.$el);
@@ -86,7 +83,7 require(["notebook/js/widget"], function(){
86 83 handleChanging: function(e) {
87 84 this.user_invoked_update = true;
88 85 this.model.set('value', e.target.value);
89 this.model.apply(this);
86 this.model.update_other_views(this);
90 87 this.user_invoked_update = false;
91 88 },
92 89 });
@@ -18,7 +18,7 def init_widget_js():
18 18 name = filename.rsplit('.', 1)[0]
19 19 if not (name == 'widget' or name == '__init__') and name.startswith('widget_'):
20 20 # Remove 'widget_' from the start of the name before compiling the path.
21 js_path = 'static/notebook/js/widgets/%s.js' % name[7:]
21 js_path = '../static/notebook/js/widgets/%s.js' % name[7:]
22 22 display(Javascript(data='$.getScript("%s");' % js_path))
23 23
24 24
@@ -141,13 +141,13 class Widget(LoggingConfigurable):
141 141
142 142 # Show view.
143 143 if self.parent is None:
144 self.comm.send({"method": "show", "view_name": view_name})
144 self.comm.send({"method": "display", "view_name": view_name})
145 145 else:
146 self.comm.send({"method": "show",
146 self.comm.send({"method": "display",
147 147 "view_name": view_name,
148 148 "parent": self.parent.comm.comm_id})
149 149
150 # Now show children if any.
150 # Now display children if any.
151 151 for child in self.children:
152 152 child._repr_widget_()
153 153 return None
General Comments 0
You need to be logged in to leave comments. Login now