diff --git a/LesionTracker/client/components/toolbarSection/toolbarSection.js b/LesionTracker/client/components/toolbarSection/toolbarSection.js
index d6a5a05b5..56edee0f0 100644
--- a/LesionTracker/client/components/toolbarSection/toolbarSection.js
+++ b/LesionTracker/client/components/toolbarSection/toolbarSection.js
@@ -129,7 +129,7 @@ Template.toolbarSection.helpers({
title: 'Download',
classes: 'imageViewerCommand',
iconClasses: 'fa fa-camera',
- active: () => $('#downloadDialog').is(':visible')
+ active: () => $('#imageDownloadDialog').is(':visible')
});
extraTools.push({
diff --git a/LesionTracker/client/components/viewer/viewer.html b/LesionTracker/client/components/viewer/viewer.html
index b058d11c3..6c66556ef 100644
--- a/LesionTracker/client/components/viewer/viewer.html
+++ b/LesionTracker/client/components/viewer/viewer.html
@@ -3,7 +3,6 @@
{{#if and Template.subscriptionsReady dataSourcesReady}}
{{>confirmDeleteDialog}}
{{>measurementTableHUD (clone this)}}
- {{>downloadDialog}}
{{>cineDialog}}
{{/if}}
diff --git a/OHIFViewer/client/components/viewer/viewer.html b/OHIFViewer/client/components/viewer/viewer.html
index 014a4632b..38c84ba1b 100644
--- a/OHIFViewer/client/components/viewer/viewer.html
+++ b/OHIFViewer/client/components/viewer/viewer.html
@@ -2,7 +2,6 @@
{{#if and Template.subscriptionsReady}}
{{>cineDialog}}
- {{>downloadDialog}}
{{>layoutChooser}}
{{>annotationDialogs}}
diff --git a/Packages/ohif-core/client/components/bootstrap/dialog/form.html b/Packages/ohif-core/client/components/bootstrap/dialog/form.html
index cfcade9f5..40b039fd6 100644
--- a/Packages/ohif-core/client/components/bootstrap/dialog/form.html
+++ b/Packages/ohif-core/client/components/bootstrap/dialog/form.html
@@ -1,7 +1,7 @@
- {{#form class='modal-content' hideValidationBox=true
+ {{#form class=(concat 'modal-content ' this.formClass) hideValidationBox=true
api=(extend instance.api instance.data.api) schema=this.schema
}}
{{>dialogHeader this}}
diff --git a/Packages/ohif-design/styles/common/global.styl b/Packages/ohif-design/styles/common/global.styl
index aaa4fece8..ae8a24f77 100644
--- a/Packages/ohif-design/styles/common/global.styl
+++ b/Packages/ohif-design/styles/common/global.styl
@@ -128,6 +128,11 @@ body .select2-container--default .select2-results>.select2-results__options
&:hover
theme('color', '$textPrimaryColor')
+ .card-round
+ theme('background-color', '$uiGrayDark')
+ border-radius(5px)
+ padding: 10px
+
.full-width
width: 100%
diff --git a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.html b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.html
index 404c8bda1..2b627ec92 100644
--- a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.html
+++ b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.html
@@ -1,4 +1,57 @@
-
+
+ {{#dialogForm (extend this
+ title='Download High Quality Image'
+ class='themed'
+ dialogClass='modal-lg'
+ formClass='form-themed'
+ confirmLabel='Download'
+ cancelLabel='Cancel'
+ id='imageDownloadDialog'
+ schema=instance.schema
+ )}}
+ Please specify the dimensions, filename, and desired type for the output image.
+
+
+
+
+
+
+ | Width |
+ {{>inputText key='width'}} |
+
+
+ |
+
+
+ | Height |
+ {{>inputText key='height'}} |
+
+
+
+
+
+
+
+
+ | File name |
+ {{>inputText key='name'}} |
+
+
+ | File type |
+ {{>inputSelect key='type'}} |
+
+
+
+
+
{{>inputCheckbox key='showAnnotations'}}
+
+
+
+
+ {{/dialogForm}}
+
+
diff --git a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.js b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.js
index f0e45e021..0a32928b7 100644
--- a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.js
+++ b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.js
@@ -1,110 +1,232 @@
import { Template } from 'meteor/templating';
+import { ReactiveVar } from 'meteor/reactive-var';
import { Session } from 'meteor/session';
+import { $ } from 'meteor/jquery';
+import { SimpleSchema } from 'meteor/aldeed:simple-schema';
import { OHIF } from 'meteor/ohif:core';
-import { viewportUtils } from '../../../lib/viewportUtils';
+import { cornerstone } from 'meteor/ohif:cornerstone';
-function setElementSize(element, canvas, size, value) {
- $(element)[size](value);
- canvas[size] = value;
- canvas.style[size] = `${value}px`;
-}
-
-Template.downloadDialog.onCreated(() => {
+Template.imageDownloadDialog.onCreated(() => {
const instance = Template.instance();
+ instance.schema = new SimpleSchema({
+ width: { type: Number },
+ height: { type: Number },
+ name: {
+ type: String,
+ defaultValue: 'image'
+ },
+ type: {
+ type: String,
+ allowedValues: ['jpeg', 'png'],
+ valuesLabels: ['JPEG', 'PNG'],
+ defaultValue: 'jpeg'
+ },
+ showAnnotations: {
+ type: Boolean,
+ label: 'Show Annotations',
+ defaultValue: false
+ }
+ });
+
+ instance.keepAspect = new ReactiveVar(true);
+ instance.showAnnotations = new ReactiveVar(false);
+});
+
+Template.imageDownloadDialog.onRendered(() => {
+ const instance = Template.instance();
+ const { viewportUtils } = OHIF.viewerbase;
+
+ instance.quality = 1;
+ instance.$viewportElement = instance.$('.viewport-element');
+ instance.viewportElement = instance.$viewportElement[0];
+ instance.$viewportPreview = instance.$('.viewport-preview');
+ instance.viewportPreview = instance.$viewportPreview[0];
+
+ cornerstone.enable(instance.viewportElement);
+ instance.downloadCanvas = $(instance.viewportElement).find('canvas')[0];
+
+ instance.form = instance.$('form').data('component');
+
+ instance.setElementSize = (element, canvas, size, value) => {
+ $(element)[size](value);
+ canvas[size] = value;
+ canvas.style[size] = `${value}px`;
+
+ instance.form.item(size).value(value);
+ };
+
+ instance.updateViewportPreview = () => {
+ instance.$viewportElement.one('CornerstoneImageRendered', (event, enabledElement) => {
+ const image = instance.viewportPreview;
+ const type = 'image/' + instance.form.item('type').value();
+ const dataUrl = instance.downloadCanvas.toDataURL(type, instance.quality);
+ image.src = dataUrl;
+
+ const $element = $(enabledElement.element);
+ let width = $element.width();
+ let height = $element.height();
+ if (width > 512 || height > 512) {
+ const multiplier = 512 / Math.max(width, height);
+ height *= multiplier;
+ width *= multiplier;
+ }
+
+ image.width = width;
+ image.height = height;
+ });
+ };
+
instance.autorun(() => {
Session.get('UpdateDownloadViewport');
const activeViewport = viewportUtils.getActiveViewportElement();
if (activeViewport) {
- const enabledElement = cornerstone.getEnabledElement(activeViewport);
+ const enabledElement = cornerstone.getEnabledElement(activeViewport);
+ const { width, height } = enabledElement.image;
- cornerstone.loadImage(enabledElement.image.imageId).then(function (image) {
- cornerstone.displayImage(instance.$previewElement, image);
- cornerstone.displayImage(instance.$downloadElement, image);
- cornerstone.resize(instance.$previewElement, true);
+ const viewport = Object.assign({}, enabledElement.viewport);
+ delete viewport.scale;
+ viewport.translation = {
+ x: 0,
+ y: 0
+ };
- setElementSize(instance.$downloadElement, instance.$downloadCanvas, 'width', 300);
- setElementSize(instance.$downloadElement, instance.$downloadCanvas, 'height', 200);
+ cornerstone.loadImage(enabledElement.image.imageId).then(image => {
+ cornerstone.displayImage(instance.viewportElement, image);
+ cornerstone.setViewport(instance.viewportElement, viewport);
+ cornerstone.resize(instance.viewportElement, true);
- cornerstone.fitToWindow(instance.$downloadElement);
- });
+ instance.setElementSize(instance.viewportElement, instance.downloadCanvas, 'width', width);
+ instance.setElementSize(instance.viewportElement, instance.downloadCanvas, 'height', height);
+
+ cornerstone.fitToWindow(instance.viewportElement);
+ instance.updateViewportPreview();
+ });
}
- })
+ });
});
-Template.downloadDialog.onRendered(() => {
- const instance = Template.instance();
- const $dialog = instance.$('#downloadDialog');
-
- instance.$previewElement = $('#previewElement')[0];
- instance.$downloadElement = document.createElement('div');
- instance.availableTools = ['length', 'probe', 'simpleAngle', 'arrowAnnotate', 'ellipticalRoi', 'rectangleRoi'];
- instance.showAnnotations = false;
-
- cornerstone.enable(instance.$previewElement);
- cornerstone.enable(instance.$downloadElement);
- instance.$downloadCanvas = $(instance.$downloadElement).find('canvas')[0];
-
- // Make the dialog bounded and draggable
- $dialog.draggable({ defaultElementCursor: 'move' });
-
- // Polyfill for older browsers
- dialogPolyfill.registerDialog($dialog.get(0));
-
- // // Prevent dialog from being dragged when user clicks any button
- const $controls = $dialog.find('.form-group, .instructions');
- $controls.on('mousedown touchstart', event => event.stopPropagation());
-});
-
-Template.downloadDialog.events({
- 'change .form-group input[name=width]'(event, instance){
- const width = $(event.currentTarget).val();
-
- setElementSize(instance.$downloadElement, instance.$downloadCanvas, 'width', width);
- cornerstone.fitToWindow(instance.$downloadElement);
- },
-
- 'change .form-group input[name=height]'(event, instance){
- const height = $(event.currentTarget).val();
-
- setElementSize(instance.$downloadElement, instance.$downloadCanvas, 'height', height);
- cornerstone.fitToWindow(instance.$downloadElement);
- },
-
- 'change #downloadDialog .form-group .form-check input[type=checkbox]'(event, instance) {
- const $previewElement = instance.$previewElement;
- const $downloadElement = instance.$downloadElement;
-
- instance.showAnnotations = !instance.showAnnotations;
-
- const action = (instance.showAnnotations) ? 'enable' : 'disable';
-
- instance.availableTools.forEach(tool => {
- cornerstoneTools[tool][action]($previewElement);
- cornerstoneTools[tool][action]($downloadElement);
- });
- },
-
- 'click .dropdown-menu .dropdown-item'(event, instance) {
- const extension = $(event.currentTarget).text();
- const $extensionButton = $('.btn.extension');
-
- $extensionButton.text(extension);
- },
-
- 'click button.download'(event, instance) {
- const fileName = $('.fileName').val();
- const extension = $('.btn.extension').text().trim();
-
- if (!fileName || !extension) {
- return;
- }
-
- cornerstoneTools.saveAs(instance.$downloadElement, `${fileName}.${extension}`, `image/${extension}`);
- },
-
- 'click button.cancel'(event, instance) {
- viewportUtils.toggleDownloadDialog();
+Template.imageDownloadDialog.helpers({
+ keepAspect() {
+ return Template.instance().keepAspect.get();
}
-});
\ No newline at end of file
+});
+
+Template.imageDownloadDialog.events({
+ 'click .js-keep-aspect'(event, instance) {
+ const currentState = instance.keepAspect.get();
+ instance.keepAspect.set(!currentState);
+ }
+});
+
+// import { Template } from 'meteor/templating';
+// import { Session } from 'meteor/session';
+// import { OHIF } from 'meteor/ohif:core';
+// import { cornerstone, cornerstoneTools } from 'meteor/ohif:cornerstone';
+//
+// function setElementSize(element, canvas, size, value) {
+// $(element)[size](value);
+// canvas[size] = value;
+// canvas.style[size] = `${value}px`;
+// }
+//
+// Template.imageDownloadDialog.onCreated(() => {
+// const instance = Template.instance();
+// const { viewportUtils } = OHIF.viewerbase;
+//
+// instance.autorun(() => {
+// Session.get('UpdateDownloadViewport');
+// const activeViewport = viewportUtils.getActiveViewportElement();
+//
+// if (activeViewport) {
+// const enabledElement = cornerstone.getEnabledElement(activeViewport);
+//
+// cornerstone.loadImage(enabledElement.image.imageId).then(function(image) {
+// cornerstone.displayImage(instance.$previewElement, image);
+// cornerstone.displayImage(instance.$downloadElement, image);
+// cornerstone.resize(instance.$previewElement, true);
+//
+// setElementSize(instance.$downloadElement, instance.$downloadCanvas, 'width', 300);
+// setElementSize(instance.$downloadElement, instance.$downloadCanvas, 'height', 200);
+//
+// cornerstone.fitToWindow(instance.$downloadElement);
+// });
+// }
+// });
+// });
+//
+// Template.imageDownloadDialog.onRendered(() => {
+// const instance = Template.instance();
+// const $dialog = instance.$('#imageDownloadDialog');
+//
+// instance.$previewElement = $('#previewElement')[0];
+// instance.$downloadElement = document.createElement('div');
+// instance.availableTools = ['length', 'probe', 'simpleAngle', 'arrowAnnotate', 'ellipticalRoi', 'rectangleRoi'];
+// instance.showAnnotations = false;
+//
+// cornerstone.enable(instance.$previewElement);
+// cornerstone.enable(instance.$downloadElement);
+// instance.$downloadCanvas = $(instance.$downloadElement).find('canvas')[0];
+//
+// // Make the dialog bounded and draggable
+// $dialog.draggable({ defaultElementCursor: 'move' });
+//
+// // Polyfill for older browsers
+// dialogPolyfill.registerDialog($dialog.get(0));
+//
+// // // Prevent dialog from being dragged when user clicks any button
+// const $controls = $dialog.find('.form-group, .instructions');
+// $controls.on('mousedown touchstart', event => event.stopPropagation());
+// });
+//
+// Template.imageDownloadDialog.events({
+// 'change .form-group input[name=width]'(event, instance){
+// const width = $(event.currentTarget).val();
+//
+// setElementSize(instance.$downloadElement, instance.$downloadCanvas, 'width', width);
+// cornerstone.fitToWindow(instance.$downloadElement);
+// },
+//
+// 'change .form-group input[name=height]'(event, instance){
+// const height = $(event.currentTarget).val();
+//
+// setElementSize(instance.$downloadElement, instance.$downloadCanvas, 'height', height);
+// cornerstone.fitToWindow(instance.$downloadElement);
+// },
+//
+// 'change #imageDownloadDialog .form-group .form-check input[type=checkbox]'(event, instance) {
+// const $previewElement = instance.$previewElement;
+// const $downloadElement = instance.$downloadElement;
+//
+// instance.showAnnotations = !instance.showAnnotations;
+//
+// const action = (instance.showAnnotations) ? 'enable' : 'disable';
+//
+// instance.availableTools.forEach(tool => {
+// cornerstoneTools[tool][action]($previewElement);
+// cornerstoneTools[tool][action]($downloadElement);
+// });
+// },
+//
+// 'click .dropdown-menu .dropdown-item'(event, instance) {
+// const extension = $(event.currentTarget).text();
+// const $extensionButton = $('.btn.extension');
+//
+// $extensionButton.text(extension);
+// },
+//
+// 'click button.download'(event, instance) {
+// const fileName = $('.fileName').val();
+// const extension = $('.btn.extension').text().trim();
+//
+// if (!fileName || !extension) return;
+//
+// cornerstoneTools.saveAs(instance.$downloadElement, `${fileName}.${extension}`, `image/${extension}`);
+// },
+//
+// 'click button.cancel'(event, instance) {
+// const { viewportUtils } = OHIF.viewerbase;
+// viewportUtils.toggleDownloadDialog();
+// }
+// });
diff --git a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.styl b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.styl
index 7d0f1ec2a..6b9c235ec 100644
--- a/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.styl
+++ b/Packages/ohif-viewerbase/client/components/viewer/downloadDialog/downloadDialog.styl
@@ -1,11 +1,12 @@
@import "{ohif:design}/app"
-#downloadDialog
- theme('border', '2px solid $uiBorderColor', 0.95)
- theme('background', '$uiGrayDarkest', 0.95)
- theme('color', '$textSecondaryColor')
- width: 626px
- z-index: 1000
+#imageDownloadDialog
+
+ .viewport-preview
+ max-width: 512px
+ max-height: 512px
+
+
.instructions
margin-bottom: 20px
@@ -39,4 +40,4 @@
display: none
.button-holder
- margin-top: 15px
\ No newline at end of file
+ margin-top: 15px
diff --git a/Packages/ohif-viewerbase/client/lib/viewportUtils.js b/Packages/ohif-viewerbase/client/lib/viewportUtils.js
index 6e1b8563d..97a66113c 100644
--- a/Packages/ohif-viewerbase/client/lib/viewportUtils.js
+++ b/Packages/ohif-viewerbase/client/lib/viewportUtils.js
@@ -228,12 +228,8 @@ const toggleCineDialog = () => {
};
const toggleDownloadDialog = () => {
- const dialog = document.getElementById('downloadDialog');
-
stopActiveClip();
- toggleDialog(dialog);
-
- Session.set('UpdateDownloadViewport', Random.id());
+ OHIF.ui.showDialog('imageDownloadDialog');
};
const isDownloadEnabled = () => {