Mercurial > hg > orthanc-stone
diff Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 1815:b81775f1b196
New tools for annotations: segment length, circle, angle and eraser
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 25 May 2021 18:07:52 +0200 |
parents | 53f3411bf94b |
children | dccdc7e59929 |
line wrap: on
line diff
--- a/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp Tue May 25 15:52:38 2021 +0200 +++ b/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp Tue May 25 18:07:52 2021 +0200 @@ -130,7 +130,9 @@ enum STONE_WEB_VIEWER_EXPORT WebViewerAction { - WebViewerAction_Windowing, + WebViewerAction_None, + + WebViewerAction_Windowing, WebViewerAction_Zoom, WebViewerAction_Pan, WebViewerAction_Rotate, @@ -139,7 +141,7 @@ WebViewerAction_CreateAngle, WebViewerAction_CreateCircle, WebViewerAction_CreateSegment, - WebViewerAction_DeleteMeasure + WebViewerAction_RemoveMeasure }; @@ -160,11 +162,12 @@ case WebViewerAction_Rotate: return OrthancStone::MouseAction_Rotate; + case WebViewerAction_None: case WebViewerAction_Crosshair: case WebViewerAction_CreateAngle: case WebViewerAction_CreateCircle: case WebViewerAction_CreateSegment: - case WebViewerAction_DeleteMeasure: + case WebViewerAction_RemoveMeasure: return OrthancStone::MouseAction_None; default: @@ -1323,6 +1326,10 @@ virtual void SignalStoneAnnotationsChanged(const ViewerViewport& viewport, const std::string& sopInstanceUid, size_t frame) = 0; + + virtual void SignalStoneAnnotationAdded(const ViewerViewport& viewport) = 0; + + virtual void SignalStoneAnnotationRemoved(const ViewerViewport& viewport) = 0; }; private: @@ -2287,11 +2294,21 @@ void Handle(const OrthancStone::AnnotationsSceneLayer::AnnotationAddedMessage& message) { RefreshAnnotations(true /* save */); + + if (observer_.get() != NULL) + { + observer_->SignalStoneAnnotationAdded(*this); + } } void Handle(const OrthancStone::AnnotationsSceneLayer::AnnotationRemovedMessage& message) { RefreshAnnotations(true /* save */); + + if (observer_.get() != NULL) + { + observer_->SignalStoneAnnotationRemoved(*this); + } } public: @@ -2771,15 +2788,42 @@ } else { + // Only the left mouse button can be used to edit/create/remove annotations + if (event.GetMouseButton() == OrthancStone::MouseButton_Left) { - std::unique_ptr<OrthancStone::IViewport::ILock> lock2(lock1->Lock()); - - std::unique_ptr<OrthancStone::IFlexiblePointerTracker> t; - t.reset(viewer_.stoneAnnotations_->CreateTracker(event.GetMainPosition(), lock2->GetController().GetScene())); - - if (t.get() != NULL) + switch (leftAction_) { - return t.release(); + case WebViewerAction_CreateAngle: + viewer_.stoneAnnotations_->SetActiveTool(OrthancStone::AnnotationsSceneLayer::Tool_Angle); + break; + + case WebViewerAction_CreateCircle: + viewer_.stoneAnnotations_->SetActiveTool(OrthancStone::AnnotationsSceneLayer::Tool_Circle); + break; + + case WebViewerAction_CreateSegment: + viewer_.stoneAnnotations_->SetActiveTool(OrthancStone::AnnotationsSceneLayer::Tool_Segment); + break; + + case WebViewerAction_RemoveMeasure: + viewer_.stoneAnnotations_->SetActiveTool(OrthancStone::AnnotationsSceneLayer::Tool_Remove); + break; + + default: + viewer_.stoneAnnotations_->SetActiveTool(OrthancStone::AnnotationsSceneLayer::Tool_Edit); + break; + } + + { + std::unique_ptr<OrthancStone::IViewport::ILock> lock2(lock1->Lock()); + + std::unique_ptr<OrthancStone::IFlexiblePointerTracker> t; + t.reset(viewer_.stoneAnnotations_->CreateTracker(event.GetMainPosition(), lock2->GetController().GetScene())); + + if (t.get() != NULL) + { + return t.release(); + } } } @@ -3166,6 +3210,28 @@ } } } + + virtual void SignalStoneAnnotationAdded(const ViewerViewport& viewport) ORTHANC_OVERRIDE + { + EM_ASM({ + const customEvent = document.createEvent("CustomEvent"); + customEvent.initCustomEvent("StoneAnnotationAdded", false, false, + { "canvasId" : UTF8ToString($0) }); + window.dispatchEvent(customEvent); + }, + viewport.GetCanvasId().c_str()); + } + + virtual void SignalStoneAnnotationRemoved(const ViewerViewport& viewport) ORTHANC_OVERRIDE + { + EM_ASM({ + const customEvent = document.createEvent("CustomEvent"); + customEvent.initCustomEvent("StoneAnnotationRemoved", false, false, + { "canvasId" : UTF8ToString($0) }); + window.dispatchEvent(customEvent); + }, + viewport.GetCanvasId().c_str()); + } }; @@ -3699,6 +3765,27 @@ EMSCRIPTEN_KEEPALIVE + int GetLeftMouseButtonAction() + { + return static_cast<int>(leftButtonAction_); + } + + + EMSCRIPTEN_KEEPALIVE + int GetMiddleMouseButtonAction() + { + return static_cast<int>(middleButtonAction_); + } + + + EMSCRIPTEN_KEEPALIVE + int GetRightMouseButtonAction() + { + return static_cast<int>(rightButtonAction_); + } + + + EMSCRIPTEN_KEEPALIVE void FitForPrint() { try