From ce0092c6761128faeb5955f9ecf67f322a9f007e Mon Sep 17 00:00:00 2001 From: ivmartel Date: Thu, 29 Jun 2023 19:13:14 +0200 Subject: [PATCH] Allow to override label text, fixes #1429 --- src/app/defaults.js | 2 ++ src/index.js | 2 ++ src/tools/arrow.js | 24 +++++++++++++----------- src/tools/circle.js | 22 ++++++++++++---------- src/tools/draw.js | 6 ++++++ src/tools/ellipse.js | 25 ++++++++++++++----------- src/tools/freeHand.js | 25 ++++++++++++++----------- src/tools/protractor.js | 24 ++++++++++++++---------- src/tools/rectangle.js | 21 ++++++++++++--------- src/tools/roi.js | 23 +++++++++++++---------- src/tools/ruler.js | 19 +++++++++++-------- tests/pacs/viewer.js | 6 ++++++ 12 files changed, 119 insertions(+), 80 deletions(-) create mode 100644 src/app/defaults.js diff --git a/src/app/defaults.js b/src/app/defaults.js new file mode 100644 index 0000000000..0430f5dff2 --- /dev/null +++ b/src/app/defaults.js @@ -0,0 +1,2 @@ +// Overridable default object. +export const defaults = {}; diff --git a/src/index.js b/src/index.js index e2e062d885..d4639f2dcf 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,6 @@ // app import {App} from './app/application'; +import {defaults} from './app/defaults'; import {ViewController} from './app/viewController'; // dicom import { @@ -86,6 +87,7 @@ export { Point3D, Vector3D, Matrix33, + defaults, logger, decoderScripts, customUI, diff --git a/src/tools/arrow.js b/src/tools/arrow.js index b0f19841fe..5c8f8578e7 100644 --- a/src/tools/arrow.js +++ b/src/tools/arrow.js @@ -1,14 +1,16 @@ import {Point2D} from '../math/point'; import {Line, getPerpendicularLine, getAngle} from '../math/line'; +import {defaults} from '../app/defaults'; import {getDefaultAnchor} from './editor'; - // external import Konva from 'konva'; /** - * Default draw label text. + * Default label text for arrow. */ -const defaultArrowLabelText = ''; +defaults.labelText.arrow = { + '*': '' +}; /** * Arrow factory. @@ -56,10 +58,10 @@ export class ArrowFactory { * * @param {Array} points The points from which to extract the line. * @param {object} style The drawing style. - * @param {object} _viewController The associated view controller. + * @param {object} viewController The associated view controller. * @returns {object} The Konva object. */ - create(points, style, _viewController) { + create(points, style, viewController) { // physical shape const line = new Line(points[0], points[1]); // draw shape @@ -117,12 +119,12 @@ export class ArrowFactory { name: 'text' }); let textExpr = ''; - // TODO: allow override? - // if (typeof arrowLabelText !== 'undefined') { - // textExpr = arrowLabelText; - // } else { - textExpr = defaultArrowLabelText; - // } + const modality = viewController.getModality(); + if (typeof defaults.labelText.arrow[modality] !== 'undefined') { + textExpr = defaults.labelText.arrow[modality]; + } else { + textExpr = defaults.labelText.arrow['*']; + } ktext.setText(textExpr); // augment text with meta data // @ts-ignore diff --git a/src/tools/circle.js b/src/tools/circle.js index 3979e3f775..0e39b33f2f 100644 --- a/src/tools/circle.js +++ b/src/tools/circle.js @@ -2,15 +2,18 @@ import {Circle} from '../math/circle'; import {Point2D} from '../math/point'; import {getFlags, replaceFlags} from '../utils/string'; import {logger} from '../utils/logger'; +import {defaults} from '../app/defaults'; import {getDefaultAnchor} from './editor'; import {DRAW_DEBUG} from './draw'; // external import Konva from 'konva'; /** - * Default draw label text. + * Default label text for circle. */ -const defaultCircleLabelText = '{surface}'; +defaults.labelText.circle = { + '*': '{surface}' +}; /** * Circle factory. @@ -61,8 +64,7 @@ export class CircleFactory { * @param {object} viewController The associated view controller. * @returns {object} The Konva group. */ - create( - points, style, viewController) { + create(points, style, viewController) { // calculate radius const a = Math.abs(points[0].getX() - points[1].getX()); const b = Math.abs(points[0].getY() - points[1].getY()); @@ -90,12 +92,12 @@ export class CircleFactory { name: 'text' }); let textExpr = ''; - // TODO: allow override? - // if (typeof circleLabelText !== 'undefined') { - // textExpr = circleLabelText; - // } else { - textExpr = defaultCircleLabelText; - // } + const modality = viewController.getModality(); + if (typeof defaults.labelText.circle[modality] !== 'undefined') { + textExpr = defaults.labelText.circle[modality]; + } else { + textExpr = defaults.labelText.circle['*']; + } const quant = circle.quantify( viewController, getFlags(textExpr)); diff --git a/src/tools/draw.js b/src/tools/draw.js index 111784b6f8..b835966aaa 100644 --- a/src/tools/draw.js +++ b/src/tools/draw.js @@ -19,6 +19,7 @@ import { } from '../app/drawController'; import {ScrollWheel} from './scrollWheel'; import {ShapeEditor} from './editor'; +import {defaults} from '../app/defaults'; // external import Konva from 'konva'; @@ -29,6 +30,11 @@ import {Style} from '../gui/style'; import {LayerGroup} from '../gui/layerGroup'; /* eslint-enable no-unused-vars */ +/** + * Default label text object. + */ +defaults.labelText = {}; + /** * Draw Debug flag. */ diff --git a/src/tools/ellipse.js b/src/tools/ellipse.js index c99cdc8cbb..cda673666b 100644 --- a/src/tools/ellipse.js +++ b/src/tools/ellipse.js @@ -1,16 +1,19 @@ -import {DRAW_DEBUG} from './draw'; -import {getDefaultAnchor} from './editor'; import {Ellipse} from '../math/ellipse'; import {Point2D} from '../math/point'; -import {logger} from '../utils/logger'; import {getFlags, replaceFlags} from '../utils/string'; +import {logger} from '../utils/logger'; +import {defaults} from '../app/defaults'; +import {getDefaultAnchor} from './editor'; +import {DRAW_DEBUG} from './draw'; // external import Konva from 'konva'; /** - * Default draw label text. + * Default label text for ellipse. */ -const defaultEllipseLabelText = '{surface}'; +defaults.labelText.ellipse = { + '*': '{surface}' +}; /** * Ellipse factory. @@ -92,12 +95,12 @@ export class EllipseFactory { name: 'text' }); let textExpr = ''; - // TODO: allow override? - // if (typeof ellipseLabelText !== 'undefined') { - // textExpr = ellipseLabelText; - // } else { - textExpr = defaultEllipseLabelText; - // } + const modality = viewController.getModality(); + if (typeof defaults.labelText.ellipse[modality] !== 'undefined') { + textExpr = defaults.labelText.ellipse[modality]; + } else { + textExpr = defaults.labelText.ellipse['*']; + } const quant = ellipse.quantify( viewController, getFlags(textExpr)); diff --git a/src/tools/freeHand.js b/src/tools/freeHand.js index 50a46e1285..86de901ace 100644 --- a/src/tools/freeHand.js +++ b/src/tools/freeHand.js @@ -1,11 +1,15 @@ +import {defaults} from '../app/defaults'; import {getDefaultAnchor} from './editor'; // external import Konva from 'konva'; /** - * Default draw label text. + * Default label text for freeHand. + * (not modality dependent, only one value) */ -const defaultFreeHandLabelText = ''; +defaults.labelText.freeHand = { + '*': '' +}; /** * FreeHand factory. @@ -54,11 +58,10 @@ export class FreeHandFactory { * * @param {Array} points The points from which to extract the line. * @param {object} style The drawing style. - * @param {object} _viewController The associated view controller. + * @param {object} viewController The associated view controller. * @returns {object} The Konva group. */ - create( - points, style, _viewController) { + create(points, style, viewController) { // points stored the Konvajs way const arr = []; for (let i = 0; i < points.length; ++i) { @@ -83,12 +86,12 @@ export class FreeHandFactory { name: 'text' }); let textExpr = ''; - // TODO: allow override? - // if (typeof freeHandLabelText !== 'undefined') { - // textExpr = freeHandLabelText; - // } else { - textExpr = defaultFreeHandLabelText; - // } + const modality = viewController.getModality(); + if (typeof defaults.labelText.freeHand[modality] !== 'undefined') { + textExpr = defaults.labelText.freeHand[modality]; + } else { + textExpr = defaults.labelText.freeHand['*']; + } ktext.setText(textExpr); // augment text with meta // @ts-ignore diff --git a/src/tools/protractor.js b/src/tools/protractor.js index a56afc7c73..06f7efea6a 100644 --- a/src/tools/protractor.js +++ b/src/tools/protractor.js @@ -1,15 +1,19 @@ import {Line, getAngle} from '../math/line'; import {Point2D} from '../math/point'; import {replaceFlags} from '../utils/string'; +import {defaults} from '../app/defaults'; import {i18n} from '../utils/i18n'; import {getDefaultAnchor} from './editor'; // external import Konva from 'konva'; /** - * Default draw label text. + * Default label text for protractor. + * (not modality dependent, only one value) */ -const defaultProtractorLabelText = '{angle}'; +defaults.labelText.protractor = { + '*': '{angle}' +}; /** * Protractor factory. @@ -57,10 +61,10 @@ export class ProtractorFactory { * * @param {Array} points The points from which to extract the protractor. * @param {object} style The drawing style. - * @param {object} _viewController The associated view controller. + * @param {object} viewController The associated view controller. * @returns {object} The Konva group. */ - create(points, style, _viewController) { + create(points, style, viewController) { // physical shape const line0 = new Line(points[0], points[1]); // points stored the Konvajs way @@ -110,12 +114,12 @@ export class ProtractorFactory { name: 'text' }); let textExpr = ''; - // TODO: allow override? - // if (typeof protractorLabelText !== 'undefined') { - // textExpr = protractorLabelText; - // } else { - textExpr = defaultProtractorLabelText; - // } + const modality = viewController.getModality(); + if (typeof defaults.labelText.protractor[modality] !== 'undefined') { + textExpr = defaults.labelText.protractor[modality]; + } else { + textExpr = defaults.labelText.protractor['*']; + } const quant = { angle: { value: angle, diff --git a/src/tools/rectangle.js b/src/tools/rectangle.js index 55136322a5..49218f93a2 100644 --- a/src/tools/rectangle.js +++ b/src/tools/rectangle.js @@ -2,15 +2,18 @@ import {Rectangle} from '../math/rectangle'; import {Point2D} from '../math/point'; import {getFlags, replaceFlags} from '../utils/string'; import {logger} from '../utils/logger'; -import {DRAW_DEBUG} from './draw'; +import {defaults} from '../app/defaults'; import {getDefaultAnchor} from './editor'; +import {DRAW_DEBUG} from './draw'; // external import Konva from 'konva'; /** - * Default draw label text. + * Default label text for rectangle. */ -const defaultRectangleLabelText = '{surface}'; +defaults.labelText.rectangle = { + '*': '{surface}' +}; /** * Rectangle factory. @@ -86,12 +89,12 @@ export class RectangleFactory { name: 'text' }); let textExpr = ''; - // TODO: allow override? - // if (typeof rectangleLabelText !== 'undefined') { - // textExpr = rectangleLabelText; - // } else { - textExpr = defaultRectangleLabelText; - // } + const modality = viewController.getModality(); + if (typeof defaults.labelText.rectangle[modality] !== 'undefined') { + textExpr = defaults.labelText.rectangle[modality]; + } else { + textExpr = defaults.labelText.rectangle['*']; + } const quant = rectangle.quantify( viewController, getFlags(textExpr)); diff --git a/src/tools/roi.js b/src/tools/roi.js index 21739d39bb..a7ff678d1e 100644 --- a/src/tools/roi.js +++ b/src/tools/roi.js @@ -1,12 +1,15 @@ import {ROI} from '../math/roi'; +import {defaults} from '../app/defaults'; import {getDefaultAnchor} from './editor'; // external import Konva from 'konva'; /** - * Default draw label text. + * Default label text for roi. */ -const defaultRoiLabelText = ''; +defaults.labelText.roi = { + '*': '' +}; /** * ROI factory. @@ -55,10 +58,10 @@ export class RoiFactory { * * @param {Array} points The points from which to extract the line. * @param {object} style The drawing style. - * @param {object} _viewController The associated view controller. + * @param {object} viewController The associated view controller. * @returns {object} The Konva group. */ - create(points, style, _viewController) { + create(points, style, viewController) { // physical shape const roi = new ROI(); // add input points to the ROI @@ -87,12 +90,12 @@ export class RoiFactory { name: 'text' }); let textExpr = ''; - // todo: allow overrride? - // if (typeof roiLabelText !== 'undefined') { - // textExpr = roiLabelText; - // } else { - textExpr = defaultRoiLabelText; - // } + const modality = viewController.getModality(); + if (typeof defaults.labelText.roi[modality] !== 'undefined') { + textExpr = defaults.labelText.roi[modality]; + } else { + textExpr = defaults.labelText.roi['*']; + } ktext.setText(textExpr); // augment text with meta // @ts-ignore diff --git a/src/tools/ruler.js b/src/tools/ruler.js index a669cad777..adf6079ac8 100644 --- a/src/tools/ruler.js +++ b/src/tools/ruler.js @@ -1,14 +1,17 @@ import {Line, getPerpendicularLine} from '../math/line'; import {Point2D} from '../math/point'; import {replaceFlags} from '../utils/string'; +import {defaults} from '../app/defaults'; import {getDefaultAnchor} from './editor'; // external import Konva from 'konva'; /** - * Default draw label text. + * Default label text for ruler. */ -const defaultRulerLabelText = '{length}'; +defaults.labelText.ruler = { + '*': '{length}' +}; /** * Ruler factory. @@ -124,12 +127,12 @@ export class RulerFactory { name: 'text' }); let textExpr = ''; - // TODO: allow override? - // if (typeof rulerLabelText !== 'undefined') { - // textExpr = rulerLabelText; - // } else { - textExpr = defaultRulerLabelText; - // } + const modality = viewController.getModality(); + if (typeof defaults.labelText.ruler[modality] !== 'undefined') { + textExpr = defaults.labelText.ruler[modality]; + } else { + textExpr = defaults.labelText.ruler['*']; + } const quant = line.quantify(viewController); ktext.setText(replaceFlags(textExpr, quant)); // augment text with meta diff --git a/tests/pacs/viewer.js b/tests/pacs/viewer.js index c6416bc57a..ddf601206e 100644 --- a/tests/pacs/viewer.js +++ b/tests/pacs/viewer.js @@ -47,6 +47,12 @@ function viewerSetup() { // return value; // }; + // // example labelText override + // dwv.defaults.labelText.rectangle = { + // '*': '{surface}!', + // MR: '{surface}!!' + // }; + // stage options let dataViewConfigs; let viewOnFirstLoadItem = true;