Implementing disabled handling for commands
This commit is contained in:
1 parent
1a0729336b
commit
8aac5dc47d
13 files changed
+85
-117
No files matched your search
@@ -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 {
|
||||
|
||||
@@ -12,7 +12,8 @@ Package.onUse(function(api) {
|
||||
'ecmascript',
|
||||
'reactive-var',
|
||||
'session',
|
||||
'iron:router'
|
||||
'iron:router',
|
||||
'u2622:persistent-session'
|
||||
]);
|
||||
|
||||
// OHIF dependencies
|
||||
|
||||
-16
@@ -1,16 +0,0 @@
|
||||
<template name="displaySetNavigation">
|
||||
<div id="{{this.id}}"
|
||||
class="toolbarSectionButton rp-x-1 {{this.classes}} {{#if isNext}}js-next{{else}}js-prev{{/if}} {{#if (disableButton isNext)}}disabled{{/if}}"
|
||||
title="{{this.title}}">
|
||||
<div class="svgContainer">
|
||||
{{#if isNext}}
|
||||
<i class="fa fa-toggle-down fa-fw"></i>
|
||||
{{else}}
|
||||
<i class="fa fa-toggle-up fa-fw"></i>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="buttonLabel">
|
||||
{{#if isNext}}Next{{else}}Previous{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
-32
@@ -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);
|
||||
}
|
||||
});
|
||||
@@ -1,16 +0,0 @@
|
||||
<template name="playClipButton">
|
||||
<div id="{{this.id}}"
|
||||
class="toolbarSectionButton rp-x-1 {{this.classes}} {{activeClass}} {{#if isPlaying}}active{{/if}} {{#if (disableButton)}}disabled{{/if}}"
|
||||
title="{{this.title}}">
|
||||
<div class="svgContainer">
|
||||
{{#if isPlaying}}
|
||||
<i class="fa fa-stop fa-fw"></i>
|
||||
{{else}}
|
||||
<i class="fa fa-play fa-fw"></i>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="buttonLabel">
|
||||
{{#if isPlaying}}Stop{{else}}Play{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
+9
-3
@@ -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;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in new issue
Block a user