diff --git a/modes/longitudinal/src/toolbarButtons.js b/modes/longitudinal/src/toolbarButtons.js index c2e5cd5e4..b0a271638 100644 --- a/modes/longitudinal/src/toolbarButtons.js +++ b/modes/longitudinal/src/toolbarButtons.js @@ -1,8 +1,11 @@ // TODO: torn, can either bake this here; or have to create a whole new button type // Only ways that you can pass in a custom React component for render :l -import { ExpandableToolbarButton, ListMenu } from '@ohif/ui'; import React from 'react'; import classnames from 'classnames'; +import { ExpandableToolbarButton, ListMenu } from '@ohif/ui'; +import { defaults } from '@ohif/core'; + +const { windowLevelPresets } = defaults; export default [ // Divider @@ -39,36 +42,36 @@ export default [ commandName: 'setToolActive', commandOptions: { toolName: 'Wwwc' }, commands: { - 'windowLevelPreset1': { - commandName: 'windowLevelPreset1', - commandOptions: {}, + 1: { + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[1], }, - 'windowLevelPreset2': { - commandName: 'windowLevelPreset2', - commandOptions: {}, + 2: { + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[2], }, - 'windowLevelPreset3': { - commandName: 'windowLevelPreset3', - commandOptions: {}, + 3: { + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[3], }, - 'windowLevelPreset4': { - commandName: 'windowLevelPreset4', - commandOptions: {}, + 4: { + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[4], }, - 'windowLevelPreset5': { - commandName: 'windowLevelPreset5', - commandOptions: {}, + 5: { + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[5], } }, type: 'primary', content: ListMenu, contentProps: { options: [ - { value: 'windowLevelPreset1', title: 'Soft tissue', subtitle: '400 / 40' }, - { value: 'windowLevelPreset2', title: 'Lung', subtitle: '1500 / -600' }, - { value: 'windowLevelPreset3', title: 'Liver', subtitle: '150 / 90' }, - { value: 'windowLevelPreset4', title: 'Bone', subtitle: '80 / 40' }, - { value: 'windowLevelPreset5', title: 'Brain', subtitle: '2500 / 480' }, + { value: 1, title: 'Soft tissue', subtitle: '400 / 40' }, + { value: 2, title: 'Lung', subtitle: '1500 / -600' }, + { value: 3, title: 'Liver', subtitle: '150 / 90' }, + { value: 4, title: 'Bone', subtitle: '80 / 40' }, + { value: 5, title: 'Brain', subtitle: '2500 / 480' }, ], renderer: ({ title, subtitle, isActive, index }) => ( <> diff --git a/platform/core/src/classes/HotkeysManager.js b/platform/core/src/classes/HotkeysManager.js index eb4c3ea2a..0848e0437 100644 --- a/platform/core/src/classes/HotkeysManager.js +++ b/platform/core/src/classes/HotkeysManager.js @@ -1,3 +1,4 @@ +import objectHash from 'object-hash'; import hotkeys from './../utils/hotkeys'; import log from './../log.js'; @@ -6,6 +7,7 @@ import log from './../log.js'; * * @typedef {Object} HotkeyDefinition * @property {String} commandName - Command to call + * @property {Object} commandOptions - Command options * @property {String} label - Display name for hotkey * @property {String[]} keys - Keys to bind; Follows Mousetrap.js binding syntax */ @@ -141,28 +143,30 @@ export class HotkeysManager { * When a hotkey combination is triggered, the command name and active contexts * are used to locate the correct command to call. * - * @param {HotkeyDefinition} commandName + * @param {HotkeyDefinition} command * @param {String} extension * @returns {undefined} */ - registerHotkeys({ commandName, keys, label } = {}, extension) { + registerHotkeys({ commandName, commandOptions = {}, keys, label } = {}, extension) { if (!commandName) { log.warn(`[hotkeys] No command was defined for hotkey "${keys}"`); return; } - const previouslyRegisteredDefinition = this.hotkeyDefinitions[commandName]; + const commandHash = objectHash({ commandName, commandOptions }); + const options = Object.keys(commandOptions).length ? JSON.stringify(commandOptions) : 'no'; + const previouslyRegisteredDefinition = this.hotkeyDefinitions[commandHash]; if (previouslyRegisteredDefinition) { const previouslyRegisteredKeys = previouslyRegisteredDefinition.keys; this._unbindHotkeys(commandName, previouslyRegisteredKeys); - log.info(`[hotkeys] Unbinding ${commandName} from ${previouslyRegisteredKeys}`); + log.info(`[hotkeys] Unbinding ${commandName} with ${options} options from ${previouslyRegisteredKeys}`); } // Set definition & bind - this.hotkeyDefinitions[commandName] = { keys, label }; - this._bindHotkeys(commandName, keys); - log.info(`[hotkeys] Binding ${commandName} to ${keys}`); + this.hotkeyDefinitions[commandHash] = { keys, label }; + this._bindHotkeys(commandName, commandOptions, keys); + log.info(`[hotkeys] Binding ${commandName} with ${options} options to ${keys}`); } /** @@ -191,7 +195,7 @@ export class HotkeysManager { * @param {string[]} keys - One or more key combinations that should trigger command * @returns {undefined} */ - _bindHotkeys(commandName, keys) { + _bindHotkeys(commandName, commandOptions = {}, keys) { const isKeyDefined = keys === '' || keys === undefined; if (isKeyDefined) { return; @@ -203,7 +207,7 @@ export class HotkeysManager { hotkeys.bind(combinedKeys, evt => { evt.preventDefault(); evt.stopPropagation(); - this._commandsManager.runCommand(commandName, { evt }); + this._commandsManager.runCommand(commandName, { evt, ...commandOptions }); }); } diff --git a/platform/core/src/defaults/hotkeyBindings.js b/platform/core/src/defaults/hotkeyBindings.js index 817f28717..cbce9728b 100644 --- a/platform/core/src/defaults/hotkeyBindings.js +++ b/platform/core/src/defaults/hotkeyBindings.js @@ -1,3 +1,5 @@ +import windowLevelPresets from "./windowLevelPresets"; + /* * Supported Keys: https://craig.is/killing/mice */ @@ -45,56 +47,56 @@ export default [ }, /** Window level presets */ { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 1 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[1], label: 'W/L Preset 1', keys: ['1'], }, { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 2 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[2], label: 'W/L Preset 2', keys: ['2'], }, { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 3 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[3], label: 'W/L Preset 3', keys: ['3'], }, { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 4 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[4], label: 'W/L Preset 4', keys: ['4'], }, { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 5 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[5], label: 'W/L Preset 5', keys: ['5'], }, { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 6 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[6], label: 'W/L Preset 6', keys: ['6'], }, { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 7 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[7], label: 'W/L Preset 7', keys: ['7'], }, { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 8 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[8], label: 'W/L Preset 8', keys: ['8'], }, { - commandName: 'setWindowLevelPreset', - commandOptions: { preset: 9 }, + commandName: 'setWindowLevel', + commandOptions: windowLevelPresets[9], label: 'W/L Preset 9', keys: ['9'], }, diff --git a/platform/core/src/defaults/index.js b/platform/core/src/defaults/index.js index 7c87bc150..f8c065d7b 100644 --- a/platform/core/src/defaults/index.js +++ b/platform/core/src/defaults/index.js @@ -1,2 +1,4 @@ import hotkeyBindings from './hotkeyBindings'; -export { hotkeyBindings }; +import windowLevelPresets from './windowLevelPresets'; +export { hotkeyBindings, windowLevelPresets }; +export default { hotkeyBindings, windowLevelPresets }; diff --git a/platform/core/src/defaults/windowLevelPresets.js b/platform/core/src/defaults/windowLevelPresets.js new file mode 100644 index 000000000..83a7321ba --- /dev/null +++ b/platform/core/src/defaults/windowLevelPresets.js @@ -0,0 +1,12 @@ +export default { + 1: { description: 'Soft tissue', window: '400', level: '40' }, + 2: { description: 'Lung', window: '1500', level: '-600' }, + 3: { description: 'Liver', window: '150', level: '90' }, + 4: { description: 'Bone', window: '2500', level: '480' }, + 5: { description: 'Brain', window: '80', level: '40' }, + 6: { description: 'Trest', window: '1', level: '1' }, + 7: { description: '', window: '', level: '' }, + 8: { description: '', window: '', level: '' }, + 9: { description: '', window: '', level: '' }, + 10: { description: '', window: '', level: '' }, +}; diff --git a/platform/core/src/index.js b/platform/core/src/index.js index d355da5cc..a16604cc0 100644 --- a/platform/core/src/index.js +++ b/platform/core/src/index.js @@ -21,7 +21,7 @@ import ui from './ui'; import user from './user.js'; import { ViewModelProvider, useViewModel } from './ViewModelContext'; import utils from './utils/'; -import { hotkeyBindings } from './defaults'; +import defaults from './defaults'; import { UIDialogService, @@ -40,7 +40,7 @@ import IWebApiDataSource from './DataSources/IWebApiDataSource'; const hotkeys = { ...utils.hotkeys, - defaults: { hotkeyBindings } + defaults: { hotkeyBindings: defaults.hotkeyBindings } }; const OHIF = { @@ -51,6 +51,7 @@ const OHIF = { HotkeysManager, ServicesManager, // + defaults, utils, hotkeys, studies, @@ -94,6 +95,7 @@ export { HotkeysManager, ServicesManager, // + defaults, utils, hotkeys, studies, diff --git a/platform/core/src/index.test.js b/platform/core/src/index.test.js index 47ee09488..d7aef6f69 100644 --- a/platform/core/src/index.test.js +++ b/platform/core/src/index.test.js @@ -15,6 +15,7 @@ describe('Top level exports', () => { 'UIDialogService', 'MeasurementService', // + 'defaults', 'utils', 'hotkeys', 'studies', diff --git a/platform/core/src/redux/reducers/preferences.js b/platform/core/src/redux/reducers/preferences.js index 2ec01c917..a9eca66e3 100644 --- a/platform/core/src/redux/reducers/preferences.js +++ b/platform/core/src/redux/reducers/preferences.js @@ -1,16 +1,7 @@ +import { windowLevelPresets } from '../../defaults'; + const defaultState = { - windowLevelData: { - 1: { description: 'Soft tissue', window: '550', level: '40' }, - 2: { description: 'Lung', window: '150', level: '-600' }, - 3: { description: 'Liver', window: '150', level: '90' }, - 4: { description: 'Bone', window: '2500', level: '480' }, - 5: { description: 'Brain', window: '80', level: '40' }, - 6: { description: 'Trest', window: '1', level: '1' }, - 7: { description: '', window: '', level: '' }, - 8: { description: '', window: '', level: '' }, - 9: { description: '', window: '', level: '' }, - 10: { description: '', window: '', level: '' }, - }, + windowLevelData: windowLevelPresets, generalPreferences: { // language: 'en-US' },