Mercurial > hg > orthanc-stone
comparison Framework/dev.h @ 104:eccd64f8e297 wasm
VolumeImageInteractor
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 01 Jun 2017 10:33:49 +0200 |
parents | fcec0ab44054 |
children | 53025eecbc95 |
comparison
equal
deleted
inserted
replaced
103:474d85e76499 | 104:eccd64f8e297 |
---|---|
22 #pragma once | 22 #pragma once |
23 | 23 |
24 #include "Layers/FrameRenderer.h" | 24 #include "Layers/FrameRenderer.h" |
25 #include "Layers/LayerSourceBase.h" | 25 #include "Layers/LayerSourceBase.h" |
26 #include "Layers/SliceOutlineRenderer.h" | 26 #include "Layers/SliceOutlineRenderer.h" |
27 #include "Widgets/LayerWidget.h" | |
27 #include "Toolbox/DownloadStack.h" | 28 #include "Toolbox/DownloadStack.h" |
28 #include "Toolbox/OrthancSlicesLoader.h" | 29 #include "Toolbox/OrthancSlicesLoader.h" |
29 #include "Volumes/ImageBuffer3D.h" | 30 #include "Volumes/ImageBuffer3D.h" |
30 #include "Volumes/SlicedVolumeBase.h" | 31 #include "Volumes/SlicedVolumeBase.h" |
31 | 32 |
600 // Error | 601 // Error |
601 Slice slice; | 602 Slice slice; |
602 LayerSourceBase::NotifyLayerReady(NULL, slice, true); | 603 LayerSourceBase::NotifyLayerReady(NULL, slice, true); |
603 } | 604 } |
604 }; | 605 }; |
606 | |
607 | |
608 class VolumeImageInteractor : | |
609 public IWorldSceneInteractor, | |
610 private ISlicedVolume::IObserver | |
611 { | |
612 private: | |
613 LayerWidget& widget_; | |
614 VolumeProjection projection_; | |
615 std::auto_ptr<VolumeImageGeometry> slices_; | |
616 size_t slice_; | |
617 | |
618 virtual void NotifyGeometryReady(const ISlicedVolume& volume) | |
619 { | |
620 if (slices_.get() == NULL) | |
621 { | |
622 const OrthancVolumeImage& image = dynamic_cast<const OrthancVolumeImage&>(volume); | |
623 | |
624 slices_.reset(new VolumeImageGeometry(image, projection_)); | |
625 SetSlice(slices_->GetSliceCount() / 2); | |
626 | |
627 widget_.SetDefaultView(); | |
628 } | |
629 } | |
630 | |
631 virtual void NotifyGeometryError(const ISlicedVolume& volume) | |
632 { | |
633 } | |
634 | |
635 virtual void NotifyContentChange(const ISlicedVolume& volume) | |
636 { | |
637 } | |
638 | |
639 virtual void NotifySliceChange(const ISlicedVolume& volume, | |
640 const size_t& sliceIndex, | |
641 const Slice& slice) | |
642 { | |
643 } | |
644 | |
645 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, | |
646 const ViewportGeometry& view, | |
647 MouseButton button, | |
648 double x, | |
649 double y, | |
650 IStatusBar* statusBar) | |
651 { | |
652 return NULL; | |
653 } | |
654 | |
655 virtual void MouseOver(CairoContext& context, | |
656 WorldSceneWidget& widget, | |
657 const ViewportGeometry& view, | |
658 double x, | |
659 double y, | |
660 IStatusBar* statusBar) | |
661 { | |
662 } | |
663 | |
664 virtual void MouseWheel(WorldSceneWidget& widget, | |
665 MouseWheelDirection direction, | |
666 KeyboardModifiers modifiers, | |
667 IStatusBar* statusBar) | |
668 { | |
669 int scale = (modifiers & KeyboardModifiers_Control ? 10 : 1); | |
670 | |
671 switch (direction) | |
672 { | |
673 case MouseWheelDirection_Up: | |
674 OffsetSlice(-scale); | |
675 break; | |
676 | |
677 case MouseWheelDirection_Down: | |
678 OffsetSlice(scale); | |
679 break; | |
680 | |
681 default: | |
682 break; | |
683 } | |
684 } | |
685 | |
686 virtual void KeyPressed(WorldSceneWidget& widget, | |
687 char key, | |
688 KeyboardModifiers modifiers, | |
689 IStatusBar* statusBar) | |
690 { | |
691 switch (key) | |
692 { | |
693 case 's': | |
694 widget.SetDefaultView(); | |
695 break; | |
696 | |
697 default: | |
698 break; | |
699 } | |
700 } | |
701 | |
702 public: | |
703 VolumeImageInteractor(OrthancVolumeImage& volume, | |
704 LayerWidget& widget, | |
705 VolumeProjection projection) : | |
706 widget_(widget), | |
707 projection_(projection) | |
708 { | |
709 volume.Register(*this); | |
710 widget.SetInteractor(*this); | |
711 } | |
712 | |
713 bool IsGeometryReady() const | |
714 { | |
715 return slices_.get() != NULL; | |
716 } | |
717 | |
718 size_t GetSliceCount() const | |
719 { | |
720 if (slices_.get() == NULL) | |
721 { | |
722 return 0; | |
723 } | |
724 else | |
725 { | |
726 return slices_->GetSliceCount(); | |
727 } | |
728 } | |
729 | |
730 void OffsetSlice(int offset) | |
731 { | |
732 if (slices_.get() != NULL) | |
733 { | |
734 int slice = static_cast<int>(slice_) + offset; | |
735 | |
736 if (slice < 0) | |
737 { | |
738 slice = 0; | |
739 } | |
740 | |
741 if (slice >= static_cast<int>(slices_->GetSliceCount())) | |
742 { | |
743 slice = slices_->GetSliceCount() - 1; | |
744 } | |
745 | |
746 if (slice != static_cast<int>(slice_)) | |
747 { | |
748 SetSlice(slice); | |
749 } | |
750 } | |
751 } | |
752 | |
753 void SetSlice(size_t slice) | |
754 { | |
755 if (slices_.get() != NULL) | |
756 { | |
757 slice_ = slice; | |
758 widget_.SetSlice(slices_->GetSlice(slice_).GetGeometry()); | |
759 } | |
760 } | |
761 }; | |
605 } | 762 } |