mirror of
https://github.com/jupyter/notebook.git
synced 2025-01-12 11:45:38 +08:00
Added cell unfocus event canceller API
This commit is contained in:
parent
a6aaa8a886
commit
10d79a9102
@ -48,7 +48,7 @@ var IPython = (function (IPython) {
|
|||||||
this.cell_id = utils.uuid();
|
this.cell_id = utils.uuid();
|
||||||
this._options = options;
|
this._options = options;
|
||||||
|
|
||||||
// For JS VM engines optimisation, attributes should be all set (even
|
// For JS VM engines optimization, attributes should be all set (even
|
||||||
// to null) in the constructor, and if possible, if different subclass
|
// to null) in the constructor, and if possible, if different subclass
|
||||||
// have new attributes with same name, they should be created in the
|
// have new attributes with same name, they should be created in the
|
||||||
// same order. Easiest is to create and set to null in parent class.
|
// same order. Easiest is to create and set to null in parent class.
|
||||||
@ -57,6 +57,10 @@ var IPython = (function (IPython) {
|
|||||||
this.cell_type = this.cell_type || null;
|
this.cell_type = this.cell_type || null;
|
||||||
this.code_mirror = null;
|
this.code_mirror = null;
|
||||||
|
|
||||||
|
// This is a list of callbacks that are called when a cell's textual
|
||||||
|
// region is unfocused. If one of the callbacks returns True, the cell
|
||||||
|
// unfocus event will be ignored. Callbacks will be passed no arguments.
|
||||||
|
this.cancel_unfocus_callbacks = [];
|
||||||
|
|
||||||
this.create_element();
|
this.create_element();
|
||||||
if (this.element !== null) {
|
if (this.element !== null) {
|
||||||
@ -264,6 +268,17 @@ var IPython = (function (IPython) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this cell's unfocus event was legit.
|
||||||
|
*/
|
||||||
|
Cell.prototype.should_cancel_unfocus = function () {
|
||||||
|
// Try user registered callbacks.
|
||||||
|
for (var i=0; i<this.cancel_unfocus_callbacks.length; i++) {
|
||||||
|
if (this.cancel_unfocus_callbacks[i]()) { return true; }
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Focus the cell in the DOM sense
|
* Focus the cell in the DOM sense
|
||||||
* @method focus_cell
|
* @method focus_cell
|
||||||
|
@ -418,6 +418,17 @@ var IPython = (function (IPython) {
|
|||||||
return cont;
|
return cont;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this cell's unfocus event was legit.
|
||||||
|
*/
|
||||||
|
CodeCell.prototype.should_cancel_unfocus = function () {
|
||||||
|
// Call base
|
||||||
|
if (IPython.Cell.prototype.should_cancel_unfocus.apply(this)) { return true; }
|
||||||
|
|
||||||
|
// Cancel this unfocus event if the cell completer is open.
|
||||||
|
return (this.completer && this.completer.is_visible());
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Focus the editor area so a user can type
|
* Focus the editor area so a user can type
|
||||||
* @method focus_editor
|
* @method focus_editor
|
||||||
|
@ -55,6 +55,12 @@ var IPython = (function (IPython) {
|
|||||||
this.notebook_name_blacklist_re = /[\/\\:]/;
|
this.notebook_name_blacklist_re = /[\/\\:]/;
|
||||||
this.nbformat = 3; // Increment this when changing the nbformat
|
this.nbformat = 3; // Increment this when changing the nbformat
|
||||||
this.nbformat_minor = 0; // Increment this when changing the nbformat
|
this.nbformat_minor = 0; // Increment this when changing the nbformat
|
||||||
|
|
||||||
|
// This is a list of callbacks that are called when a cell's textual
|
||||||
|
// region is unfocused. If one of the callbacks returns True, the cell
|
||||||
|
// unfocus event will be ignored. Callbacks will be passed one argument,
|
||||||
|
// the cell instance.
|
||||||
|
this.cancel_unfocus_callbacks = [];
|
||||||
this.style();
|
this.style();
|
||||||
this.create_elements();
|
this.create_elements();
|
||||||
this.bind_events();
|
this.bind_events();
|
||||||
@ -581,11 +587,8 @@ var IPython = (function (IPython) {
|
|||||||
var cell = this.get_cell(index);
|
var cell = this.get_cell(index);
|
||||||
if (!cell) {return;}
|
if (!cell) {return;}
|
||||||
|
|
||||||
// Only respect the blur event if the tooltip and autocompleter are
|
// Check if this unfocus event is legit.
|
||||||
// not visible.
|
if (!this.should_cancel_unfocus(cell)) {
|
||||||
var tooltip_visible = IPython.tooltip && IPython.tooltip.is_visible();
|
|
||||||
var completer_visible = cell.completer && cell.completer.is_visible();
|
|
||||||
if (!tooltip_visible && !completer_visible) {
|
|
||||||
// In Firefox the focus event is called before the blur event. In
|
// In Firefox the focus event is called before the blur event. In
|
||||||
// other words, two cells elements may be focused at any given time.
|
// other words, two cells elements may be focused at any given time.
|
||||||
// This has been witnessed on Win7 x64 w/ FF 25. Here we only put the
|
// This has been witnessed on Win7 x64 w/ FF 25. Here we only put the
|
||||||
@ -603,6 +606,26 @@ var IPython = (function (IPython) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Notebook.prototype.should_cancel_unfocus = function (cell) {
|
||||||
|
// Determine whether or not the unfocus event should be aknowledged.
|
||||||
|
|
||||||
|
// If the tooltip is visible, ignore the unfocus.
|
||||||
|
var tooltip_visible = IPython.tooltip && IPython.tooltip.is_visible();
|
||||||
|
if (tooltip_visible) { return true; }
|
||||||
|
|
||||||
|
// Try user registered callbacks.
|
||||||
|
for (var i=0; i<this.cancel_unfocus_callbacks.length; i++) {
|
||||||
|
if (this.cancel_unfocus_callbacks[i](cell)) { return true; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the cell's should_cancel_unfocus method.
|
||||||
|
if (cell.should_cancel_unfocus !== undefined && cell.should_cancel_unfocus()) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Cell movement
|
// Cell movement
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user