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 }