OHIF-129: Enabling CinePlay button only when active viewport has more than 1 image in its stack; Fixed some errors when CinePlay Dialog is open and stopped and layout changes.

This commit is contained in:
Eloízio Salgado 2016-11-07 12:01:03 -02:00
parent 12862aec51
commit a7ba6b49fe
11 changed files with 65 additions and 13 deletions

View File

@ -121,9 +121,9 @@ Template.toolbarSection.helpers({
id: 'toggleCineDialog',
title: 'CINE',
classes: 'imageViewerCommand',
iconClasses: 'fa fa-youtube-play'
iconClasses: 'fa fa-youtube-play',
disableFunction: hasMultipleFrames
});
}
buttonData.push({

View File

@ -13,23 +13,23 @@
</div>
<div class="cine-controls">
<div class="btn-group">
{{#button action='cineFirst' title='Skip to first image'}}
{{#button action='cineFirst' title='Skip to first image' disabled=(buttonDisabled)}}
<i class="fa fa-fast-backward"></i>
{{/button}}
{{#button action='cinePrevious' title='Previous image'}}
{{#button action='cinePrevious' title='Previous image' disabled=(buttonDisabled)}}
<i class="fa fa-step-backward"></i>
{{/button}}
{{#button action='cineToggle' title='Play / Stop' class=(valueIf isPlaying 'active' '')}}
{{#button action='cineToggle' title='Play / Stop' class=(valueIf isPlaying 'active' '') disabled=(buttonDisabled)}}
{{#if isPlaying}}
<i class="fa fa-fw fa-stop"></i>
{{else}}
<i class="fa fa-fw fa-play"></i>
{{/if}}
{{/button}}
{{#button action='cineNext' title='Next image'}}
{{#button action='cineNext' title='Next image' disabled=(buttonDisabled)}}
<i class="fa fa-step-forward"></i>
{{/button}}
{{#button action='cineLast' title='Skip to last image'}}
{{#button action='cineLast' title='Skip to last image' disabled=(buttonDisabled)}}
<i class="fa fa-fast-forward"></i>
{{/button}}
</div>

View File

@ -251,6 +251,10 @@ Template.cineDialog.helpers({
return !OHIF.viewer.canMoveDisplaySets(isNext) ? 'disabled' : '';
},
buttonDisabled() {
return hasMultipleFrames();
},
getClassNames(baseCls) {
return baseCls + ' ' + (OHIF.uiSettings.displayEchoUltrasoundWorkflow ? 'single' : 'double') + '-row-style'
}

View File

@ -27,6 +27,10 @@
&:active, &.active
theme('color', '$activeColor')
&[disabled]
&:hover
color: inherit
.cine-navigation, .cine-controls, .cine-options
cursor: default

View File

@ -216,12 +216,12 @@ function loadDisplaySetIntoViewport(data, templateData) {
var multiframeMetadata = instance.multiframeMetadata;
var cineToolData = {
loop: OHIF.viewer.cine.loop,
framesPerSecond: multiframeMetadata.averageFrameRate || OHIF.viewer.cine.framesPerSecond
framesPerSecond: multiframeMetadata ? multiframeMetadata.averageFrameRate : OHIF.viewer.cine.framesPerSecond
};
cornerstoneTools.addToolState(element, 'playClip', cineToolData);
// Autoplay datasets that have framerates set
if (multiframeMetadata.isMultiframeImage && multiframeMetadata.averageFrameRate > 0) {
if (multiframeMetadata && multiframeMetadata.isMultiframeImage && multiframeMetadata.averageFrameRate > 0) {
cornerstoneTools.playClip(element);
}

View File

@ -1,6 +1,6 @@
<template name="playClipButton">
<div id="{{this.id}}"
class="toolbarSectionButton rp-x-1 {{this.classes}} {{activeClass}} {{#if isPlaying}}active{{/if}}"
class="toolbarSectionButton rp-x-1 {{this.classes}} {{activeClass}} {{#if isPlaying}}active{{/if}} {{#if (disableButton)}}disabled{{/if}}"
title="{{this.title}}">
<div class="svgContainer">
{{#if isPlaying}}

View File

@ -1,5 +1,8 @@
Template.playClipButton.helpers({
isPlaying: function() {
return isPlaying();
},
disableButton() {
return hasMultipleFrames();
}
});

View File

@ -3,7 +3,7 @@
{{>UI.dynamic template=this.buttonTemplateName data=this}}
{{else}}
<div id="{{this.id}}"
class="toolbarSectionButton rp-x-1 {{this.classes}} {{activeClass}} {{#if this.disabled}}disabled{{/if}}"
class="toolbarSectionButton rp-x-1 {{this.classes}} {{activeClass}} {{#if this.disabled}}disabled{{/if}} {{#if this.disableFunction}}{{#if (disableButton)}}disabled{{/if}}{{/if}}"
title="{{this.title}}">
<div class="svgContainer">
{{#if this.svgLink}}

View File

@ -10,6 +10,9 @@ Template.toolbarSectionButton.helpers({
// Return the active class
return 'active';
}
},
disableButton() {
return this.disableFunction();
}
});

View File

@ -159,9 +159,46 @@ isPlaying = () => {
// Get the clip state
const clipState = toolState.data[0];
if(clipState) {
// Return true if the clip is playing
return !_.isUndefined(clipState.intervalId);
}
// Return true if the clip is playing
return !_.isUndefined(clipState.intervalId);
return false;
};
// Check if a study has multiple frames
hasMultipleFrames = () => {
// Its called everytime active viewport and/or layout change
Session.get('activeViewport');
Session.get('LayoutManagerUpdated');
const activeViewport = getActiveViewportElement();
// No active viewport yet: disable button
if(!activeViewport) {
return true;
}
// Get images in the stack
const stackToolData = cornerstoneTools.getToolState(activeViewport, 'stack');
// No images in the stack, so disable button
if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {
return true;
}
// Get number of images in the stack
const stackData = stackToolData.data[0];
const nImages = stackData.imageIds && stackData.imageIds.length ? stackData.imageIds.length : 1;
// Stack has just one image, so disable button
if(nImages === 1) {
return true;
}
return false;
};
// Create an event listener to update playing state when a clip stops playing

View File

@ -179,6 +179,7 @@ Package.onUse(function(api) {
api.export('isImage', 'client');
api.export('sopClassDictionary', 'client');
api.export('addMetaData', 'client');
api.export('hasMultipleFrames', 'client');
// Viewer management objects
api.export('toolManager', 'client');