Implementing disabled handling for commands

This commit is contained in:
Bruno Alves de Faria 2017-04-26 15:34:33 -03:00 committed by Erik Ziegler
parent 1a0729336b
commit 8aac5dc47d
13 changed files with 85 additions and 117 deletions

View File

@ -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

View File

@ -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 = [];

View File

@ -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')
});
}

View File

@ -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 {

View File

@ -12,7 +12,8 @@ Package.onUse(function(api) {
'ecmascript',
'reactive-var',
'session',
'iron:router'
'iron:router',
'u2622:persistent-session'
]);
// OHIF dependencies

View File

@ -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>

View File

@ -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);
}
});

View File

@ -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>

View File

@ -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();
}
});

View File

@ -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;
}
});

View File

@ -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);

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');

View File

@ -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')
});
}