Implementing disabled handling for commands

This commit is contained in:
Bruno Alves de Faria authored and Erik Ziegler committed 2017-06-14 09:19:49 +02:00
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 {
+2 -1
View File
@@ -12,7 +12,8 @@ Package.onUse(function(api) {
'ecmascript',
'reactive-var',
'session',
'iron:router'
'iron:router',
'u2622:persistent-session'
]);
// OHIF dependencies
@@ -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>
@@ -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();
}
});
@@ -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);
-6
View File
@@ -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');