# HG changeset patch # User Sebastien Jodogne # Date 1621934993 -7200 # Node ID fdc6a8089eb9333b1ef7eaa441447a75e44c1ce1 # Parent b05d5f0d014ff1d508aeb0ddf1ea4ba200ba7c7a hovering of annotations in Stone Web viewer diff -r b05d5f0d014f -r fdc6a8089eb9 Applications/Platforms/WebAssembly/WebAssemblyViewport.cpp --- a/Applications/Platforms/WebAssembly/WebAssemblyViewport.cpp Thu May 20 19:11:44 2021 +0200 +++ b/Applications/Platforms/WebAssembly/WebAssemblyViewport.cpp Tue May 25 11:29:53 2021 +0200 @@ -174,8 +174,8 @@ ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); that->controller_->HandleMousePress(*that->interactor_, pointer, - that->compositor_->GetCanvasWidth(), - that->compositor_->GetCanvasHeight()); + that->compositor_->GetCanvasWidth(), + that->compositor_->GetCanvasHeight()); that->Invalidate(); } @@ -188,14 +188,25 @@ { WebAssemblyViewport* that = reinterpret_cast(userData); - if (that->compositor_.get() != NULL && - that->controller_->HasActiveTracker()) + if (that->compositor_.get() != NULL) { - PointerEvent pointer; - ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); - if (that->controller_->HandleMouseMove(pointer)) + if (that->controller_->HasActiveTracker()) { - that->Invalidate(); + PointerEvent pointer; + ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); + + if (that->controller_->HandleMouseMove(pointer)) + { + that->Invalidate(); + } + } + else if (that->interactor_.get() != NULL && + that->interactor_->HasMouseHover()) + { + // New in Stone Web viewer 2.0 + PointerEvent pointer; + ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); + that->interactor_->HandleMouseHover(*that, pointer); } } diff -r b05d5f0d014f -r fdc6a8089eb9 Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp --- a/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp Thu May 20 19:11:44 2021 +0200 +++ b/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp Tue May 25 11:29:53 2021 +0200 @@ -1190,6 +1190,7 @@ DisplayedFrameQuality quality, unsigned int instanceNumber) = 0; + // "click" is a 3D vector in world coordinates virtual void SignalCrosshair(const ViewerViewport& viewport, const OrthancStone::Vector& click) = 0; @@ -1577,8 +1578,13 @@ bool hasFocusOnInstance_; std::string focusSopInstanceUid_; size_t focusFrameNumber_; - + + // The coordinates of OsiriX annotations are expressed in 3D world coordinates boost::shared_ptr annotations_; + + // The coordinates of Stone annotations are expressed in 2D + // coordinates of the current texture, with (0,0) corresponding to + // the center of the top-left pixel boost::shared_ptr annotationsStone_; void ScheduleNextPrefetch() @@ -2645,6 +2651,23 @@ viewport, event, viewportWidth, viewportHeight); } } + + virtual bool HasMouseHover() const ORTHANC_OVERRIDE + { + return true; + } + + virtual void HandleMouseHover(OrthancStone::IViewport& viewport, + const OrthancStone::PointerEvent& event) ORTHANC_OVERRIDE + { + std::unique_ptr lock(viewport.Lock()); + + if (viewer_.annotationsStone_->SetMouseHover(event.GetMainPosition(), lock->GetController().GetScene())) + { + viewer_.annotationsStone_->Render(lock->GetController().GetScene()); + lock->Invalidate(); + } + } }; @@ -2875,6 +2898,11 @@ virtual void SignalCrosshair(const ViewerViewport& viewport, const OrthancStone::Vector& click) ORTHANC_OVERRIDE { + if (click.size() != 3u) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + for (Viewports::const_iterator it = allViewports_.begin(); it != allViewports_.end(); ++it) { // TODO - One could check the "Frame Of Reference UID" here diff -r b05d5f0d014f -r fdc6a8089eb9 OrthancStone/Sources/Viewport/DefaultViewportInteractor.cpp --- a/OrthancStone/Sources/Viewport/DefaultViewportInteractor.cpp Thu May 20 19:11:44 2021 +0200 +++ b/OrthancStone/Sources/Viewport/DefaultViewportInteractor.cpp Tue May 25 11:29:53 2021 +0200 @@ -89,4 +89,12 @@ return CreateTrackerInternal(viewport, action, event, viewportWidth, viewportHeight); } + + + void DefaultViewportInteractor::HandleMouseHover(IViewport& viewport, + const PointerEvent& event) + { + // "HasMouseOver()" returns "false" + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } } diff -r b05d5f0d014f -r fdc6a8089eb9 OrthancStone/Sources/Viewport/DefaultViewportInteractor.h --- a/OrthancStone/Sources/Viewport/DefaultViewportInteractor.h Thu May 20 19:11:44 2021 +0200 +++ b/OrthancStone/Sources/Viewport/DefaultViewportInteractor.h Tue May 25 11:29:53 2021 +0200 @@ -95,5 +95,13 @@ const PointerEvent& event, unsigned int viewportWidth, unsigned int viewportHeight) ORTHANC_OVERRIDE; + + virtual bool HasMouseHover() const ORTHANC_OVERRIDE + { + return false; + } + + virtual void HandleMouseHover(IViewport& viewport, + const PointerEvent& event) ORTHANC_OVERRIDE; }; } diff -r b05d5f0d014f -r fdc6a8089eb9 OrthancStone/Sources/Viewport/IViewportInteractor.h --- a/OrthancStone/Sources/Viewport/IViewportInteractor.h Thu May 20 19:11:44 2021 +0200 +++ b/OrthancStone/Sources/Viewport/IViewportInteractor.h Tue May 25 11:29:53 2021 +0200 @@ -37,5 +37,10 @@ const PointerEvent& event, unsigned int viewportWidth, unsigned int viewportHeight) = 0; + + virtual bool HasMouseHover() const = 0; + + virtual void HandleMouseHover(IViewport& viewport, + const PointerEvent& event) = 0; }; }