Prioritize escape actions with a label hierarchy instead of an integer

This commit is contained in:
Maxime Quandalle 2015-05-27 02:48:15 +02:00
parent 40c2411f2a
commit 42f6dc686f
6 changed files with 34 additions and 16 deletions

View file

@ -35,15 +35,28 @@ Mousetrap.bind(['down', 'up'], function(evt, key) {
});
// Pressing `Escape` should close the last opened “element” and only the last
// one. Components can register themself using a priority number (smaller is
// closed first), a condition, and an action.This is used by Popup or
// inlinedForm for instance. When we press escape we execute the action which
// condition is valid with the highest priority.
// one. Components can register themselves using a label a condition, and an
// action. This is used by Popup or inlinedForm for instance. When we press
// escape we execute the action which have a condition is valid and his the the
// highest in the label hierarchy.
EscapeActions = {
_actions: [],
register: function(priority, condition, action) {
// Executed in order
hierarchy: [
'textcomplete',
'popup',
'inlinedForm',
'sidebarView',
'detailedPane'
],
register: function(label, condition, action) {
// XXX Rewrite this with ES6: .push({ priority, condition, action })
var priority = this.hierarchy.indexOf(label);
if (priority === -1) {
throw Error('You must define the label in the EscapeActions hierarchy');
}
this._actions.push({
priority: priority,
condition: condition,
@ -60,9 +73,13 @@ EscapeActions = {
return topActiveAction && topActiveAction.action();
},
executeLowerThan: function(maxPriority) {
maxPriority = maxPriority || Infinity;
var currentAction;
executeLowerThan: function(label) {
var maxPriority, currentAction;
if (! label)
maxPriority = Infinity;
else
maxPriority = this.hierarchy.indexOf(label);
for (var i = 0; i < this._actions.length; i++) {
currentAction = this._actions[i];
if (currentAction.priority > maxPriority)

View file

@ -204,4 +204,7 @@ $(document).on('click', function(evt) {
// Press escape to close the popup.
var bindPopup = function(f) { return _.bind(f, Popup); };
EscapeActions.register(20, bindPopup(Popup.isOpen), bindPopup(Popup.close));
EscapeActions.register('popup',
bindPopup(Popup.isOpen),
bindPopup(Popup.close)
);