diff --git a/LesionTracker/.meteor/versions b/LesionTracker/.meteor/versions index 5fbacd982..2b2ab7803 100644 --- a/LesionTracker/.meteor/versions +++ b/LesionTracker/.meteor/versions @@ -87,17 +87,19 @@ natestrauser:select2@4.0.3 npm-bcrypt@0.9.2 npm-mongo@2.2.11_2 observe-sequence@1.0.14 -ohif:polyfill@0.0.1 +ohif:commands@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:lesiontracker@0.0.1 ohif:log@0.0.1 ohif:measurements@0.0.1 ohif:metadata@0.0.1 +ohif:polyfill@0.0.1 ohif:select-tree@0.0.1 ohif:study-list@0.0.1 ohif:themes@0.0.1 diff --git a/LesionTracker/client/components/toolbarSection/toolbarSection.js b/LesionTracker/client/components/toolbarSection/toolbarSection.js index 56fe253fd..5ed1d8af0 100644 --- a/LesionTracker/client/components/toolbarSection/toolbarSection.js +++ b/LesionTracker/client/components/toolbarSection/toolbarSection.js @@ -141,8 +141,8 @@ Template.toolbarSection.helpers({ id: 'toggleCineDialog', title: 'CINE', classes: 'imageViewerCommand', - svgLink: '/packages/ohif_viewerbase/assets/icons.svg#icon-tools-cineplay-toggle', - disableFunction: Viewerbase.viewportUtils.hasMultipleFrames + iconClasses: 'fa fa-youtube-play', + active: () => $('#cineDialog').is(':visible') }); const buttonData = []; diff --git a/OHIFViewer/client/components/toolbarSection/toolbarSection.js b/OHIFViewer/client/components/toolbarSection/toolbarSection.js index 8eb8689d0..ff42524e0 100644 --- a/OHIFViewer/client/components/toolbarSection/toolbarSection.js +++ b/OHIFViewer/client/components/toolbarSection/toolbarSection.js @@ -159,24 +159,23 @@ Template.toolbarSection.helpers({ id: 'previousDisplaySet', title: 'Previous', classes: 'imageViewerCommand', - buttonTemplateName: 'displaySetNavigation', - isNext: false + iconClasses: 'fa fa-toggle-up fa-fw' }); buttonData.push({ id: 'nextDisplaySet', title: 'Next', classes: 'imageViewerCommand', - buttonTemplateName: 'displaySetNavigation', - isNext: true + iconClasses: 'fa fa-toggle-down fa-fw' }); + const { isPlaying } = OHIF.viewerbase.viewportUtils; buttonData.push({ id: 'toggleCinePlay', - title: 'Toggle CINE Play', + title: () => isPlaying() ? 'Stop' : 'Play', classes: 'imageViewerCommand', - buttonTemplateName: 'playClipButton', - active: OHIF.viewerbase.viewportUtils.isPlaying + iconClasses: () => ('fa fa-fw ' + (isPlaying() ? 'fa-stop' : 'fa-play')), + active: isPlaying }); buttonData.push({ @@ -184,7 +183,6 @@ Template.toolbarSection.helpers({ title: 'CINE', classes: 'imageViewerCommand', iconClasses: 'fa fa-youtube-play', - disableFunction: OHIF.viewerbase.viewportUtils.hasMultipleFrames, active: () => $('#cineDialog').is(':visible') }); } diff --git a/Packages/ohif-commands/client/classes/CommandsManager.js b/Packages/ohif-commands/client/classes/CommandsManager.js index c7c1d0699..884e1e3bc 100644 --- a/Packages/ohif-commands/client/classes/CommandsManager.js +++ b/Packages/ohif-commands/client/classes/CommandsManager.js @@ -57,21 +57,46 @@ export class CommandsManager { 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] = {}; } - run(command) { + getDefinition(command) { const context = this.getCurrentContext(); if (!context) return; - const definition = context[command]; + 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, disabled, params } = definition; - if ((_.isFunction(disabled) && disabled()) || (!_.isUndefined(disabled) && disabled)) return; + 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 { diff --git a/Packages/ohif-hotkeys/package.js b/Packages/ohif-hotkeys/package.js index 1650e3167..2f3f010b2 100644 --- a/Packages/ohif-hotkeys/package.js +++ b/Packages/ohif-hotkeys/package.js @@ -12,7 +12,8 @@ Package.onUse(function(api) { 'ecmascript', 'reactive-var', 'session', - 'iron:router' + 'iron:router', + 'u2622:persistent-session' ]); // OHIF dependencies diff --git a/Packages/ohif-viewerbase/client/components/viewer/displaySetNavigation/displaySetNavigation.html b/Packages/ohif-viewerbase/client/components/viewer/displaySetNavigation/displaySetNavigation.html deleted file mode 100644 index 0b8dacd56..000000000 --- a/Packages/ohif-viewerbase/client/components/viewer/displaySetNavigation/displaySetNavigation.html +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/Packages/ohif-viewerbase/client/components/viewer/displaySetNavigation/displaySetNavigation.js b/Packages/ohif-viewerbase/client/components/viewer/displaySetNavigation/displaySetNavigation.js deleted file mode 100644 index 6e26cd62a..000000000 --- a/Packages/ohif-viewerbase/client/components/viewer/displaySetNavigation/displaySetNavigation.js +++ /dev/null @@ -1,32 +0,0 @@ -import { OHIF } from 'meteor/ohif:core'; -import { Template } from 'meteor/templating'; - -Template.displaySetNavigation.events({ - 'click .js-next'(event, instance) { - if ($(event.currentTarget).hasClass('disabled')) { - return; - } - - OHIF.viewerbase.layoutManager.moveDisplaySets(true); - }, - - 'click .js-prev'(event, instance) { - if ($(event.currentTarget).hasClass('disabled')) { - return; - } - - OHIF.viewerbase.layoutManager.moveDisplaySets(false); - } -}); - -Template.displaySetNavigation.helpers({ - disableButton(isNext) { - Session.get('LayoutManagerUpdated'); - - if (!OHIF.viewerbase.layoutManager) { - return; - } - - return !OHIF.viewerbase.layoutManager.canMoveDisplaySets(isNext); - } -}); diff --git a/Packages/ohif-viewerbase/client/components/viewer/playClipButton/playClipButton.html b/Packages/ohif-viewerbase/client/components/viewer/playClipButton/playClipButton.html deleted file mode 100644 index 2cc9216a4..000000000 --- a/Packages/ohif-viewerbase/client/components/viewer/playClipButton/playClipButton.html +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/Packages/ohif-viewerbase/client/components/viewer/playClipButton/playClipButton.js b/Packages/ohif-viewerbase/client/components/viewer/playClipButton/playClipButton.js deleted file mode 100644 index a9196ec70..000000000 --- a/Packages/ohif-viewerbase/client/components/viewer/playClipButton/playClipButton.js +++ /dev/null @@ -1,11 +0,0 @@ -import { Template } from 'meteor/templating'; -import { viewportUtils } from '../../../lib/viewportUtils'; - -Template.playClipButton.helpers({ - isPlaying: function() { - return viewportUtils.isPlaying(); - }, - disableButton() { - return viewportUtils.hasMultipleFrames(); - } -}); diff --git a/Packages/ohif-viewerbase/client/components/viewer/toolbarSectionButton/toolbarSectionButton.js b/Packages/ohif-viewerbase/client/components/viewer/toolbarSectionButton/toolbarSectionButton.js index 09467215c..2fa120e68 100644 --- a/Packages/ohif-viewerbase/client/components/viewer/toolbarSectionButton/toolbarSectionButton.js +++ b/Packages/ohif-viewerbase/client/components/viewer/toolbarSectionButton/toolbarSectionButton.js @@ -79,18 +79,24 @@ Template.toolbarSectionButton.helpers({ svgLink() { const instance = Template.instance(); const activeToolId = Session.get('ToolManagerActiveTool'); - return instance.getActiveToolSubProperty('svgLink', activeToolId); + const svgLink = instance.getActiveToolSubProperty('svgLink', activeToolId); + return _.isFunction(svgLink) ? svgLink() : svgLink; }, iconClasses() { const instance = Template.instance(); const activeToolId = Session.get('ToolManagerActiveTool'); - return instance.getActiveToolSubProperty('iconClasses', activeToolId); + const iconClasses = instance.getActiveToolSubProperty('iconClasses', activeToolId); + return _.isFunction(iconClasses) ? iconClasses() : iconClasses; }, disableButton() { + Session.get('activeViewport'); + Session.get('LayoutManagerUpdated'); const instance = Template.instance(); - return instance.data.disableFunction && instance.data.disableFunction(); + const isCommandDisabled = OHIF.commands.isDisabled(instance.data.id); + const isFunctionDisabled = instance.data.disableFunction && instance.data.disableFunction(); + return isCommandDisabled || isFunctionDisabled; } }); diff --git a/Packages/ohif-viewerbase/client/lib/hotkeyUtils.js b/Packages/ohif-viewerbase/client/lib/hotkeyUtils.js index db6b7f5c3..1f3910fc1 100644 --- a/Packages/ohif-viewerbase/client/lib/hotkeyUtils.js +++ b/Packages/ohif-viewerbase/client/lib/hotkeyUtils.js @@ -1,4 +1,5 @@ import { Meteor } from 'meteor/meteor'; +import { Session } from 'meteor/session'; import { $ } from 'meteor/jquery'; import { _ } from 'meteor/underscore'; import { OHIF } from 'meteor/ohif:core'; @@ -55,6 +56,12 @@ Meteor.startup(function() { const contextName = 'viewer'; OHIF.commands.createContext(contextName); + // Create a function that returns true if the active viewport is empty + const isActiveViewportEmpty = () => { + const activeViewport = Session.get('activeViewport') || 0; + return $('.imageViewerViewport').eq(activeViewport).hasClass('empty'); + }; + // Functions to register the tool switching commands const registerToolCommands = map => _.each(map, (commandName, toolId) => { OHIF.commands.register(contextName, toolId, { @@ -85,7 +92,8 @@ Meteor.startup(function() { const registerViewportCommands = map => _.each(map, (commandName, commandId) => { OHIF.commands.register(contextName, commandId, { name: commandName, - action: viewportUtils[commandId] + action: viewportUtils[commandId], + disabled: isActiveViewportEmpty }); }); @@ -99,8 +107,6 @@ Meteor.startup(function() { flipV: 'Flip vertically', rotateR: 'Rotate right', rotateL: 'Rotate left', - toggleCinePlay: 'Play/Pause', - toggleCineDialog: 'CINE dialog', resetViewport: 'Reset', clearTools: 'Clear' }); @@ -124,7 +130,6 @@ Meteor.startup(function() { }); // Register scrolling commands - const isActiveViewportEmpty = () => $('.viewportContainer.active .imageViewerViewport').hasClass('empty'); OHIF.commands.set(contextName, { scrollDown: { name: 'Scroll down', @@ -147,19 +152,21 @@ Meteor.startup(function() { // Register viewport navigation commands OHIF.commands.set(contextName, { previousDisplaySet: { - name: 'Scroll down', - action: () => OHIF.viewerbase.layoutManager.moveDisplaySets(false) + name: 'Previous display set', + action: () => OHIF.viewerbase.layoutManager.moveDisplaySets(false), + disabled: () => !OHIF.viewerbase.layoutManager.canMoveDisplaySets(false) }, nextDisplaySet: { - name: 'Scroll up', - action: () => OHIF.viewerbase.layoutManager.moveDisplaySets(true) + name: 'Next display set', + action: () => OHIF.viewerbase.layoutManager.moveDisplaySets(true), + disabled: () => !OHIF.viewerbase.layoutManager.canMoveDisplaySets(true) }, nextPanel: { - name: 'Scroll to first image', + name: 'Next panel', action: () => panelNavigation.loadNextActivePanel() }, previousPanel: { - name: 'Scroll to last image', + name: 'Previous panel', action: () => panelNavigation.loadPreviousActivePanel() } }, true); @@ -176,6 +183,16 @@ Meteor.startup(function() { const $dicomTags = $('.imageViewerViewportOverlay .dicomTag'); $dicomTags.toggle($dicomTags.eq(0).css('display') === 'none'); } + }, + toggleCinePlay: { + name: 'Play/Pause', + action: viewportUtils.toggleCinePlay, + disabled: OHIF.viewerbase.viewportUtils.hasMultipleFrames + }, + toggleCineDialog: { + name: 'CINE dialog', + action: viewportUtils.toggleCineDialog, + disabled: OHIF.viewerbase.viewportUtils.hasMultipleFrames } }, true); diff --git a/Packages/ohif-viewerbase/package.js b/Packages/ohif-viewerbase/package.js index 05a82eb91..6135750d0 100644 --- a/Packages/ohif-viewerbase/package.js +++ b/Packages/ohif-viewerbase/package.js @@ -171,9 +171,6 @@ Package.onUse(function(api) { api.addFiles('client/components/viewer/toolbarSectionTools/toolbarSectionTools.js', 'client'); api.addFiles('client/components/viewer/toolbarSectionTools/toolbarSectionTools.styl', 'client'); - api.addFiles('client/components/viewer/playClipButton/playClipButton.html', 'client'); - api.addFiles('client/components/viewer/playClipButton/playClipButton.js', 'client'); - api.addFiles('client/components/viewer/confirmDeleteDialog/confirmDeleteDialog.html', 'client'); api.addFiles('client/components/viewer/confirmDeleteDialog/confirmDeleteDialog.js', 'client'); api.addFiles('client/components/viewer/confirmDeleteDialog/confirmDeleteDialog.styl', 'client'); @@ -182,9 +179,6 @@ Package.onUse(function(api) { api.addFiles('client/components/viewer/textMarkerDialogs/textMarkerDialogs.js', 'client'); api.addFiles('client/components/viewer/textMarkerDialogs/textMarkerDialogs.styl', 'client'); - api.addFiles('client/components/viewer/displaySetNavigation/displaySetNavigation.html', 'client'); - api.addFiles('client/components/viewer/displaySetNavigation/displaySetNavigation.js', 'client'); - api.addFiles('client/components/viewer/studySeriesQuickSwitch/studySeriesQuickSwitch.html', 'client'); api.addFiles('client/components/viewer/studySeriesQuickSwitch/studySeriesQuickSwitch.styl', 'client'); api.addFiles('client/components/viewer/studySeriesQuickSwitch/studySeriesQuickSwitch.js', 'client'); diff --git a/StandaloneViewer/StandaloneViewer/client/components/toolbarSection/toolbarSection.js b/StandaloneViewer/StandaloneViewer/client/components/toolbarSection/toolbarSection.js index 923d46e88..2238a6f74 100644 --- a/StandaloneViewer/StandaloneViewer/client/components/toolbarSection/toolbarSection.js +++ b/StandaloneViewer/StandaloneViewer/client/components/toolbarSection/toolbarSection.js @@ -143,23 +143,23 @@ Template.toolbarSection.helpers({ id: 'previousDisplaySet', title: 'Previous', classes: 'imageViewerCommand', - buttonTemplateName: 'displaySetNavigation', - isNext: false + iconClasses: 'fa fa-toggle-up fa-fw' }); buttonData.push({ id: 'nextDisplaySet', title: 'Next', classes: 'imageViewerCommand', - buttonTemplateName: 'displaySetNavigation', - isNext: true + iconClasses: 'fa fa-toggle-down fa-fw' }); + const { isPlaying } = OHIF.viewerbase.viewportUtils; buttonData.push({ id: 'toggleCinePlay', - title: 'Toggle CINE Play', + title: () => isPlaying() ? 'Stop' : 'Play', classes: 'imageViewerCommand', - buttonTemplateName: 'playClipButton' + iconClasses: () => ('fa fa-fw ' + (isPlaying() ? 'fa-stop' : 'fa-play')), + active: isPlaying }); buttonData.push({ @@ -167,7 +167,7 @@ Template.toolbarSection.helpers({ title: 'CINE', classes: 'imageViewerCommand', iconClasses: 'fa fa-youtube-play', - disableFunction: OHIF.viewerbase.viewportUtils.hasMultipleFrames + active: () => $('#cineDialog').is(':visible') }); }