114 lines
3.2 KiB
JavaScript
114 lines
3.2 KiB
JavaScript
import { ReactiveVar } from 'meteor/reactive-var';
|
|
import { _ } from 'meteor/underscore';
|
|
import { OHIF } from 'meteor/ohif:core';
|
|
|
|
export class CommandsManager {
|
|
constructor() {
|
|
this.contexts = {};
|
|
|
|
// Enable reactivity by storing the last executed command
|
|
this.last = new ReactiveVar('');
|
|
}
|
|
|
|
getContext(contextName) {
|
|
const context = this.contexts[contextName];
|
|
if (!context) {
|
|
return OHIF.log.warn(`No context found with name "${contextName}"`);
|
|
}
|
|
|
|
return context;
|
|
}
|
|
|
|
getCurrentContext() {
|
|
const contextName = OHIF.context.get();
|
|
if (!contextName) {
|
|
return OHIF.log.warn('There is no selected context');
|
|
}
|
|
|
|
return this.getContext(contextName);
|
|
}
|
|
|
|
createContext(contextName) {
|
|
if (!contextName) return;
|
|
if (this.contexts[contextName]) {
|
|
return this.clear(contextName);
|
|
}
|
|
|
|
this.contexts[contextName] = {};
|
|
}
|
|
|
|
set(contextName, definitions, extend=false) {
|
|
if (typeof definitions !== 'object') return;
|
|
const context = this.getContext(contextName);
|
|
if (!context) return;
|
|
|
|
if (!extend) {
|
|
this.clear(contextName);
|
|
}
|
|
|
|
Object.keys(definitions).forEach(command => (context[command] = definitions[command]));
|
|
}
|
|
|
|
register(contextName, command, definition) {
|
|
if (typeof definition !== 'object') return;
|
|
const context = this.getContext(contextName);
|
|
if (!context) return;
|
|
|
|
context[command] = definition;
|
|
}
|
|
|
|
setDisabledFunction(contextName, command, func) {
|
|
if (!command || typeof func !== 'function') return;
|
|
const context = this.getContext(contextName);
|
|
if (!context) return;
|
|
const definition = context[command];
|
|
if (!definition) {
|
|
return OHIF.log.warn(`Trying to set a disabled function to a command "${command}" that was not yet defined`);
|
|
}
|
|
|
|
definition.disabled = func;
|
|
}
|
|
|
|
clear(contextName) {
|
|
if (!contextName) return;
|
|
this.contexts[contextName] = {};
|
|
}
|
|
|
|
getDefinition(command) {
|
|
const context = this.getCurrentContext();
|
|
if (!context) return;
|
|
return context[command];
|
|
}
|
|
|
|
isDisabled(command) {
|
|
const definition = this.getDefinition(command);
|
|
if (!definition) return false;
|
|
const { disabled } = definition;
|
|
if (_.isFunction(disabled) && disabled()) return true;
|
|
if (!_.isFunction(disabled) && disabled) return true;
|
|
return false;
|
|
}
|
|
|
|
run(command) {
|
|
const definition = this.getDefinition(command);
|
|
if (!definition) {
|
|
return OHIF.log.warn(`Command "${command}" not found in current context`);
|
|
}
|
|
|
|
const { action, params } = definition;
|
|
if (this.isDisabled(command)) return;
|
|
if (typeof action !== 'function') {
|
|
return OHIF.log.warn(`No action was defined for command "${command}"`);
|
|
} else {
|
|
const result = action(params);
|
|
if (this.last.get() === command) {
|
|
this.last.dep.changed();
|
|
} else {
|
|
this.last.set(command);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|