From 5e7edd91ee06f7138a063e6a150152084fe458b7 Mon Sep 17 00:00:00 2001 From: Bruno Alves de Faria Date: Fri, 21 Apr 2017 20:30:29 -0300 Subject: [PATCH] Creating ohif:hotkeys package --- OHIFViewer/.meteor/packages | 1 + OHIFViewer/.meteor/versions | 3 +- .../ohif-hotkeys/client/HotkeysContext.js | 45 ++++++++++++++ .../ohif-hotkeys/client/HotkeysManager.js | 59 +++++++++++++++++++ Packages/ohif-hotkeys/main.js | 18 ++++++ Packages/ohif-hotkeys/package.js | 16 +++++ Packages/ohif-viewerbase/package.js | 28 +++++---- 7 files changed, 157 insertions(+), 13 deletions(-) create mode 100644 Packages/ohif-hotkeys/client/HotkeysContext.js create mode 100644 Packages/ohif-hotkeys/client/HotkeysManager.js create mode 100644 Packages/ohif-hotkeys/main.js create mode 100644 Packages/ohif-hotkeys/package.js diff --git a/OHIFViewer/.meteor/packages b/OHIFViewer/.meteor/packages index 934e6ff11..8d550978f 100644 --- a/OHIFViewer/.meteor/packages +++ b/OHIFViewer/.meteor/packages @@ -8,6 +8,7 @@ ohif:polyfill ohif:design ohif:core +ohif:hotkeys ohif:header ohif:cornerstone ohif:viewerbase diff --git a/OHIFViewer/.meteor/versions b/OHIFViewer/.meteor/versions index a69628fd3..2910e856b 100644 --- a/OHIFViewer/.meteor/versions +++ b/OHIFViewer/.meteor/versions @@ -72,15 +72,16 @@ mongo-id@1.0.6 natestrauser:select2@4.0.3 npm-mongo@2.2.11_2 observe-sequence@1.0.14 -ohif:polyfill@0.0.1 ohif:core@0.0.1 ohif:cornerstone@0.0.1 ohif:design@0.0.1 ohif:dicom-services@0.0.1 ohif:hanging-protocols@0.0.1 ohif:header@0.0.1 +ohif:hotkeys@0.0.1 ohif:log@0.0.1 ohif:metadata@0.0.1 +ohif:polyfill@0.0.1 ohif:study-list@0.0.1 ohif:themes@0.0.1 ohif:themes-common@0.0.1 diff --git a/Packages/ohif-hotkeys/client/HotkeysContext.js b/Packages/ohif-hotkeys/client/HotkeysContext.js new file mode 100644 index 000000000..0ea5aebdc --- /dev/null +++ b/Packages/ohif-hotkeys/client/HotkeysContext.js @@ -0,0 +1,45 @@ +import { OHIF } from 'meteor/ohif:core'; + +export class HotkeysContext { + constructor(name, definitions, enabled) { + this.name = name; + this.definitions = definitions; + this.enabled = enabled; + } + + extend(definitions={}) { + if (typeof definitions !== 'object') return; + this.destroy(); + Object.assign(this.definitions, definitions); + this.initialize(); + } + + initialize() { + Object.keys(this.definitions).forEach(definitionKey => { + const { hotkey, action, disabled } = this.definitions[definitionKey]; + let message; + if (!hotkey) { + message = `No hotkey was defined for "${definitionKey}"`; + } else if (!action) { + message = `No action was defined for "${definitionKey}" using "${hotkey}" hotkey`; + } + + if (message) { + return OHIF.log.warn(message); + } + + $(document).bind(`keydown.hotkey.${this.name}`, hotkey, event => { + if (!this.enabled.get()) return; + if (typeof disabled !== undefined) { + if ((typeof disabled === 'function' && disabled()) || disabled) return; + } + + action(event); + }); + }); + } + + destroy() { + $(document).unbind(`keydown.hotkey.${this.name}`); + } +} diff --git a/Packages/ohif-hotkeys/client/HotkeysManager.js b/Packages/ohif-hotkeys/client/HotkeysManager.js new file mode 100644 index 000000000..14d653044 --- /dev/null +++ b/Packages/ohif-hotkeys/client/HotkeysManager.js @@ -0,0 +1,59 @@ +import { ReactiveVar } from 'meteor/reactive-var'; +import { HotkeysContext } from 'meteor/ohif:hotkeys/client/HotkeysContext'; + +export class HotkeysManager { + constructor() { + this.contexts = {}; + this.currentContextName = null; + this.enabled = new ReactiveVar(true); + } + + disable() { + this.enabled.set(false); + } + + enable() { + this.enabled.set(true); + } + + getContext(contextName) { + return this.contexts[contextName]; + } + + getCurrentContext() { + return this.getContext(this.currentContextName); + } + + setContext(contextName, contextDefinitions) { + const enabled = this.enabled; + const context = new HotkeysContext(contextName, contextDefinitions, enabled); + const currentContext = this.getCurrentContext(); + if (currentContext && currentContext.name === contextName) { + currentContext.destroy(); + context.initialize(); + } + + this.contexts[contextName] = context; + } + + unsetContext(contextName) { + if (contextName === this.currentContextName) { + this.getCurrentContext().destroy(); + } + + delete this.contexts[contextName]; + } + + switchToContext(contextName) { + const currentContext = this.getCurrentContext(); + if (currentContext) { + currentContext.destroy(); + } + + const newContext = this.contexts[contextName]; + if (!newContext) return; + + this.currentContextName = contextName; + newContext.initialize(); + } +} diff --git a/Packages/ohif-hotkeys/main.js b/Packages/ohif-hotkeys/main.js new file mode 100644 index 000000000..3a4fa72a1 --- /dev/null +++ b/Packages/ohif-hotkeys/main.js @@ -0,0 +1,18 @@ +import { OHIF } from 'meteor/ohif:core'; +import { HotkeysManager } from 'meteor/ohif:hotkeys/client/HotkeysManager'; + +/** + * Create hotkeys namespace using a HotkeysManager class instance + */ +const hotkeys = new HotkeysManager(); + +/** + * Append hotkeys namespace to OHIF namespace + */ + +OHIF.hotkeys = hotkeys; + +/** + * Export relevant objects + */ +export { hotkeys }; diff --git a/Packages/ohif-hotkeys/package.js b/Packages/ohif-hotkeys/package.js new file mode 100644 index 000000000..2115b1c23 --- /dev/null +++ b/Packages/ohif-hotkeys/package.js @@ -0,0 +1,16 @@ +Package.describe({ + name: 'ohif:hotkeys', + summary: 'OHIF hotkeys management', + version: '0.0.1' +}); + +Package.onUse(function(api) { + api.versionsFrom('1.4'); + + // Meteor packages + api.use('ecmascript'); + api.use('reactive-dict'); + + // Main module definition + api.mainModule('main.js', 'client'); +}); diff --git a/Packages/ohif-viewerbase/package.js b/Packages/ohif-viewerbase/package.js index 2e5bb940c..36dc00a6a 100644 --- a/Packages/ohif-viewerbase/package.js +++ b/Packages/ohif-viewerbase/package.js @@ -7,19 +7,23 @@ Package.describe({ Package.onUse(function(api) { api.versionsFrom('1.4'); - api.use('ecmascript'); - api.use('standard-app-packages'); - api.use('http'); - api.use('jquery'); - api.use('stylus'); - api.use('momentjs:moment'); - api.use('validatejs'); - api.use('u2622:persistent-session'); + api.use(['ecmascript', + 'standard-app-packages', + 'http', + 'jquery', + 'stylus', + 'momentjs:moment', + 'validatejs', + 'u2622:persistent-session' + ]); - // Our custom packages - api.use('ohif:design'); - api.use('ohif:core'); - api.use('ohif:log'); + // OHIF dependencies + api.use([ + 'ohif:design', + 'ohif:core', + 'ohif:hotkeys', + 'ohif:log' + ]); const assets = [ 'assets/icons.svg',