##// END OF EJS Templates
Store views in the models and store child views in the views
Store views in the models and store child views in the views

File last commit:

r14493:010861f6
r14493:010861f6
Show More
widgetmanager.js
213 lines | 8.1 KiB | application/javascript | JavascriptLexer
Jonathan Frederic
Added widjet.js...
r14224 //----------------------------------------------------------------------------
// Copyright (C) 2013 The IPython Development Team
//
// Distributed under the terms of the BSD License. The full license is in
// the file COPYING, distributed as part of this software.
//----------------------------------------------------------------------------
//============================================================================
// WidgetModel, WidgetView, and WidgetManager
//============================================================================
/**
* Base Widget classes
* @module IPython
* @namespace IPython
* @submodule widget
*/
Jonathan Frederic
jshint widget.js
r14457 (function () {
"use strict";
// Use require.js 'define' method so that require.js is intelligent enough to
// syncronously load everything within this file when it is being 'required'
// elsewhere.
Jonathan Frederic
Added require.js shims for underscore and backbone...
r14483 define(["underscore",
"backbone",
Jonathan Frederic
Fixed some spacing in widget.js
r14468 ], function (underscore, backbone) {
Jonathan Frederic
jshint widget.js
r14457
//--------------------------------------------------------------------
// WidgetManager class
//--------------------------------------------------------------------
Jonathan Frederic
Fixed some spacing in widget.js
r14468 var WidgetManager = function () {
Jonathan Frederic
jshint widget.js
r14457 this.comm_manager = null;
this.widget_model_types = {};
this.widget_view_types = {};
Jonathan Frederic
Removed comm dependency of widget model and view
r14469 this._model_instances = {};
Jonathan Frederic
jshint widget.js
r14457
Jonathan Frederic
Fixed some spacing in widget.js
r14468 Backbone.sync = function (method, model, options, error) {
Jonathan Frederic
jshint widget.js
r14457 var result = model._handle_sync(method, options);
if (options.success) {
options.success(result);
}
};
};
Jonathan Frederic
Remove init_widget_js, use require.js for everything...
r14342
Jonathan Frederic
jshint widget.js
r14457 WidgetManager.prototype.attach_comm_manager = function (comm_manager) {
this.comm_manager = comm_manager;
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 // Register already-registered widget model types with the comm manager.
Jonathan Frederic
jshint widget.js
r14457 for (var widget_model_name in this.widget_model_types) {
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 this.comm_manager.register_target(widget_model_name, $.proxy(this._handle_comm_open, this));
Jonathan Frederic
Remove init_widget_js, use require.js for everything...
r14342 }
Jonathan Frederic
jshint widget.js
r14457 };
Jonathan Frederic
Remove init_widget_js, use require.js for everything...
r14342
Jonathan Frederic
jshint widget.js
r14457 WidgetManager.prototype.register_widget_model = function (widget_model_name, widget_model_type) {
// Register the widget with the comm manager. Make sure to pass this object's context
// in so `this` works in the call back.
if (this.comm_manager !== null) {
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 this.comm_manager.register_target(widget_model_name, $.proxy(this._handle_comm_open, this));
Jonathan Frederic
jshint widget.js
r14457 }
this.widget_model_types[widget_model_name] = widget_model_type;
};
Jonathan Frederic
Remove init_widget_js, use require.js for everything...
r14342
Jonathan Frederic
Handle widget hide/show logic...
r14237
Jonathan Frederic
jshint widget.js
r14457 WidgetManager.prototype.register_widget_view = function (widget_view_name, widget_view_type) {
this.widget_view_types[widget_view_name] = widget_view_type;
};
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 WidgetManager.prototype.handle_msg = function(msg, model) {
var method = msg.content.data.method;
switch (method) {
case 'display':
var cell = this.get_msg_cell(msg.parent_header.msg_id);
if (cell === null) {
console.log("Could not determine where the display" +
" message was from. Widget will not be displayed");
} else {
var view = this.create_view(model,
msg.content.data.view_name, cell);
if (view !== undefined
&& cell.widget_subarea !== undefined
&& cell.widget_subarea !== null) {
cell.widget_area.show();
cell.widget_subarea.append(view.$el);
}
}
break;
case 'set_snapshot':
var cell = this.get_msg_cell(msg.parent_header.msg_id);
cell.metadata.snapshot = msg.content.data.snapshot;
break;
}
}
WidgetManager.prototype.create_view = function(model, view_name, cell) {
view_name = view_name || model.get('default_view_name');
var ViewType = this.widget_view_types[view_name];
if (ViewType !== undefined && ViewType !== null) {
var view = new ViewType({model: model, widget_manager: this, cell: cell});
view.render();
Jason Grout
Store views in the models and store child views in the views
r14493 model.views.push(view);
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 /*
// jng: Handle when the view element is remove from the page.
// observe the view destruction event and do this. We may need
// to override the view's remove method to trigger this event.
var that = this;
view.$el.on("remove", function () {
var index = that.views.indexOf(view);
if (index > -1) {
that.views.splice(index, 1);
}
view.remove(); // Clean-up view
// Close the comm if there are no views left.
if (that.views.length() === 0) {
//jng: trigger comm close event
}
if (that.comm !== undefined) {
that.comm.close();
delete that.comm.model; // Delete ref so GC will collect widget model.
delete that.comm;
}
delete that.widget_id; // Delete id from model so widget manager cleans up.
});
*/
return view;
}
},
Jonathan Frederic
Lots of updates to widget(s) js...
r14263
Jonathan Frederic
jshint widget.js
r14457 WidgetManager.prototype.get_msg_cell = function (msg_id) {
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 var cell = null;
// First, check to see if the msg was triggered by cell execution.
Jonathan Frederic
jshint widget.js
r14457 if (IPython.notebook !== undefined && IPython.notebook !== null) {
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 cell = IPython.notebook.get_msg_cell(msg_id);
}
if (cell !== null) {
return cell
}
// Second, check to see if a get_cell callback was defined
// for the message. get_cell callbacks are registered for
// widget messages, so this block is actually checking to see if the
// message was triggered by a widget.
var kernel = this.get_kernel();
if (kernel !== undefined && kernel !== null) {
var callbacks = kernel.get_callbacks_for_msg(msg_id);
if (callbacks !== undefined &&
callbacks.iopub !== undefined &&
callbacks.iopub.get_cell !== undefined) {
return callbacks.iopub.get_cell();
}
Jonathan Frederic
jshint widget.js
r14457 }
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486
// Not triggered by a cell or widget (no get_cell callback
// exists).
return null;
Jonathan Frederic
jshint widget.js
r14457 };
Jonathan Frederic
Removed comm dependency of widget model and view
r14469
WidgetManager.prototype.get_model = function (widget_id) {
var model = this._model_instances[widget_id];
Jonathan Frederic
Fixed nonregistered model bug in wiget manager
r14475 if (model !== undefined && model.id == widget_id) {
Jonathan Frederic
Removed comm dependency of widget model and view
r14469 return model;
}
return null;
};
WidgetManager.prototype.get_kernel = function () {
if (this.comm_manager === null) {
return null;
} else {
return this.comm_manager.kernel;
}
};
Jonathan Frederic
jshint widget.js
r14457 WidgetManager.prototype.on_create_widget = function (callback) {
this._create_widget_callback = callback;
};
Jonathan Frederic
Lots of updates to widget(s) js...
r14263
Jonathan Frederic
LOTS OF WIDGET CHANGES...
r14278
Jonathan Frederic
jshint widget.js
r14457 WidgetManager.prototype._handle_create_widget = function (widget_model) {
if (this._create_widget_callback) {
try {
this._create_widget_callback(widget_model);
} catch (e) {
console.log("Exception in WidgetManager callback", e, widget_model);
}
Jonathan Frederic
Added on_create_widget callback to WidgetManager
r14381 }
Jonathan Frederic
jshint widget.js
r14457 };
Jonathan Frederic
Use require.js where possible.
r14255
Jonathan Frederic
Added widjet.js...
r14224
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 WidgetManager.prototype._handle_comm_open = function (comm, msg) {
Jonathan Frederic
jshint widget.js
r14457 var widget_type_name = msg.content.target_name;
Jonathan Frederic
Removed comm dependency of widget model and view
r14469 var widget_model = new this.widget_model_types[widget_type_name](this, comm.comm_id, comm);
this._model_instances[comm.comm_id] = widget_model;
Jonathan Frederic
jshint widget.js
r14457 this._handle_create_widget(widget_model);
};
//--------------------------------------------------------------------
// Init code
//--------------------------------------------------------------------
IPython.WidgetManager = WidgetManager;
if (IPython.widget_manager === undefined || IPython.widget_manager === null) {
IPython.widget_manager = new WidgetManager();
}
Jonathan Frederic
Remove some empty space
r14390
Jonathan Frederic
jshint widget.js
r14457 return IPython.widget_manager;
});
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 }());