diff Framework/dev.h @ 405:3942123602ba

removing ObserversRegistry
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sun, 11 Nov 2018 17:50:11 +0100
parents 72355b637945
children 5d359b115b29
line wrap: on
line diff
--- a/Framework/dev.h	Sun Nov 11 13:02:38 2018 +0100
+++ b/Framework/dev.h	Sun Nov 11 17:50:11 2018 +0100
@@ -28,11 +28,12 @@
 #include "Toolbox/GeometryToolbox.h"
 #include "Toolbox/OrthancSlicesLoader.h"
 #include "Volumes/ImageBuffer3D.h"
-#include "Volumes/SlicedVolumeBase.h"
+#include "Volumes/ISlicedVolume.h"
 #include "Widgets/SliceViewerWidget.h"
 
 #include <Core/Logging.h>
 #include <Core/Images/ImageProcessing.h>
+#include <Core/OrthancException.h>
 
 #include <boost/math/special_functions/round.hpp>
 
@@ -41,8 +42,8 @@
 {
   // TODO: Handle errors while loading
   class OrthancVolumeImage :
-    public SlicedVolumeBase,
-    public OrthancStone::IObserver
+    public ISlicedVolume,
+    public IObserver
   {
   private:
     OrthancSlicesLoader           loader_;
@@ -110,7 +111,7 @@
       if (loader.GetSliceCount() == 0)
       {
         LOG(ERROR) << "Empty volume image";
-        SlicedVolumeBase::NotifyGeometryError();
+        EmitMessage(ISlicedVolume::GeometryErrorMessage(*this));
         return;
       }
 
@@ -118,7 +119,7 @@
       {
         if (!IsCompatible(loader.GetSlice(0), loader.GetSlice(i)))
         {
-          SlicedVolumeBase::NotifyGeometryError();
+          EmitMessage(ISlicedVolume::GeometryErrorMessage(*this));
           return;
         }
       }
@@ -142,7 +143,7 @@
                                    0.001 /* this is expressed in mm */))
         {
           LOG(ERROR) << "The distance between successive slices is not constant in a volume image";
-          SlicedVolumeBase::NotifyGeometryError();
+          EmitMessage(ISlicedVolume::GeometryErrorMessage(*this));
           return;
         }
       }
@@ -169,25 +170,25 @@
 
       // TODO Check the DicomFrameConverter are constant
 
-      SlicedVolumeBase::NotifyGeometryReady();
+      EmitMessage(ISlicedVolume::GeometryReadyMessage(*this));
     }
 
-    virtual void OnSliceImageReady(const OrthancSlicesLoader& loader,
-                                   unsigned int sliceIndex,
-                                   const Slice& slice,
-                                   const Orthanc::ImageAccessor& image,
-                                   SliceImageQuality quality)
+    void OnSliceImageReady(const OrthancSlicesLoader& loader,
+                           unsigned int sliceIndex,
+                           const Slice& slice,
+                           const Orthanc::ImageAccessor& image,
+                           SliceImageQuality quality)
     {
       {
         ImageBuffer3D::SliceWriter writer(*image_, VolumeProjection_Axial, sliceIndex);
         Orthanc::ImageProcessing::Copy(writer.GetAccessor(), image);
       }
 
-      SlicedVolumeBase::NotifySliceContentChange(sliceIndex, slice);
+      EmitMessage(ISlicedVolume::SliceContentChangedMessage(*this, sliceIndex, slice));
 
       if (pendingSlices_ == 1)
       {
-        SlicedVolumeBase::NotifyVolumeReady();
+        EmitMessage(ISlicedVolume::VolumeReadyMessage(*this));
         pendingSlices_ = 0;
       }
       else if (pendingSlices_ > 1)
@@ -208,7 +209,7 @@
         
         case MessageType_SliceLoader_GeometryError:
           LOG(ERROR) << "Unable to download a volume image";
-          SlicedVolumeBase::NotifyGeometryError();
+          EmitMessage(ISlicedVolume::GeometryErrorMessage(*this));
           break;
         
         case MessageType_SliceLoader_ImageReady:
@@ -241,7 +242,8 @@
     OrthancVolumeImage(MessageBroker& broker,
                        OrthancApiClient& orthanc,
                        bool computeRange) :
-      OrthancStone::IObserver(broker),
+      ISlicedVolume(broker),
+      IObserver(broker),
       loader_(broker, orthanc),
       computeRange_(computeRange),
       pendingSlices_(0)
@@ -495,7 +497,7 @@
 
   class VolumeImageMPRSlicer :
     public IVolumeSlicer,
-    private ISlicedVolume::IObserver
+    public IObserver
   {
   private:
     class RendererFactory : public LayerReadyMessage::IRendererFactory
@@ -532,10 +534,11 @@
     {
       return axialGeometry_.get() != NULL;
     }
-
     
-    virtual void NotifyGeometryReady(const ISlicedVolume& volume) ORTHANC_OVERRIDE
+    void OnGeometryReady(const ISlicedVolume::GeometryReadyMessage& message)
     {
+      assert(&message.GetOrigin() == &volume_);
+      
       // These 3 values are only used to speed up the IVolumeSlicer
       axialGeometry_.reset(new VolumeImageGeometry(volume_, VolumeProjection_Axial));
       coronalGeometry_.reset(new VolumeImageGeometry(volume_, VolumeProjection_Coronal));
@@ -544,30 +547,30 @@
       EmitMessage(IVolumeSlicer::GeometryReadyMessage(*this));
     }
 
-    virtual void NotifyGeometryError(const ISlicedVolume& volume) ORTHANC_OVERRIDE
+    void OnGeometryError(const ISlicedVolume::GeometryErrorMessage& message)
     {
+      assert(&message.GetOrigin() == &volume_);
+      
       EmitMessage(IVolumeSlicer::GeometryErrorMessage(*this));
     }
 
-    virtual void NotifyContentChange(const ISlicedVolume& volume) ORTHANC_OVERRIDE
+    void OnContentChanged(const ISlicedVolume::ContentChangedMessage& message)
     {
+      assert(&message.GetOrigin() == &volume_);
+      
       EmitMessage(IVolumeSlicer::ContentChangedMessage(*this));
     }
 
-    virtual void NotifySliceContentChange(const ISlicedVolume& volume,
-                                          const size_t& sliceIndex,
-                                          const Slice& slice) ORTHANC_OVERRIDE
+    void OnSliceContentChanged(const ISlicedVolume::SliceContentChangedMessage& message)
     {
-      //IVolumeSlicer::NotifySliceContentChange(slice);
+      assert(&message.GetOrigin() == &volume_);
+
+      //IVolumeSlicer::OnSliceContentChange(slice);
 
       // TODO Improve this?
       EmitMessage(IVolumeSlicer::ContentChangedMessage(*this));
     }
 
-    virtual void NotifyVolumeReady(const ISlicedVolume& volume) ORTHANC_OVERRIDE
-    {
-    }
-
     const VolumeImageGeometry& GetProjectionGeometry(VolumeProjection projection)
     {
       if (!IsGeometryReady())
@@ -629,13 +632,24 @@
     VolumeImageMPRSlicer(MessageBroker& broker, 
                          OrthancVolumeImage&  volume) :
       IVolumeSlicer(broker),
+      IObserver(broker),
       volume_(volume)
     {
-      volume_.Register(*this);
-    }
+      volume_.RegisterObserverCallback(
+        new Callable<VolumeImageMPRSlicer, ISlicedVolume::GeometryReadyMessage>
+        (*this, &VolumeImageMPRSlicer::OnGeometryReady));
+
+      volume_.RegisterObserverCallback(
+        new Callable<VolumeImageMPRSlicer, ISlicedVolume::GeometryErrorMessage>
+        (*this, &VolumeImageMPRSlicer::OnGeometryError));
 
-    virtual ~VolumeImageMPRSlicer()
-    {
+      volume_.RegisterObserverCallback(
+        new Callable<VolumeImageMPRSlicer, ISlicedVolume::ContentChangedMessage>
+        (*this, &VolumeImageMPRSlicer::OnContentChanged));
+
+      volume_.RegisterObserverCallback(
+        new Callable<VolumeImageMPRSlicer, ISlicedVolume::SliceContentChangedMessage>
+        (*this, &VolumeImageMPRSlicer::OnSliceContentChanged));
     }
 
     virtual bool GetExtent(std::vector<Vector>& points,
@@ -702,20 +716,21 @@
 
   class VolumeImageInteractor :
     public IWorldSceneInteractor,
-    protected ISlicedVolume::IObserver
+    public IObserver
   {
   private:
-    SliceViewerWidget&                        widget_;
+    SliceViewerWidget&                  widget_;
     VolumeProjection                    projection_;
     std::auto_ptr<VolumeImageGeometry>  slices_;
     size_t                              slice_;
 
   protected:
-    virtual void NotifyGeometryReady(const ISlicedVolume& volume)
+    void OnGeometryReady(const ISlicedVolume::GeometryReadyMessage& message)
     {
       if (slices_.get() == NULL)
       {
-        const OrthancVolumeImage& image = dynamic_cast<const OrthancVolumeImage&>(volume);
+        const OrthancVolumeImage& image =
+          dynamic_cast<const OrthancVolumeImage&>(message.GetOrigin());
 
         slices_.reset(new VolumeImageGeometry(image, projection_));
         SetSlice(slices_->GetSliceCount() / 2);
@@ -724,24 +739,6 @@
       }
     }
 
-    virtual void NotifyGeometryError(const ISlicedVolume& volume)
-    {
-    }
-
-    virtual void NotifyContentChange(const ISlicedVolume& volume)
-    {
-    }
-
-    virtual void NotifySliceContentChange(const ISlicedVolume& volume,
-                                          const size_t& sliceIndex,
-                                          const Slice& slice)
-    {
-    }
-
-    virtual void NotifyVolumeReady(const ISlicedVolume& volume)
-    {
-    }
-
     virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget,
                                                         const ViewportGeometry& view,
                                                         MouseButton button,
@@ -801,14 +798,19 @@
     }
 
   public:
-    VolumeImageInteractor(OrthancVolumeImage& volume,
+    VolumeImageInteractor(MessageBroker& broker,
+                          OrthancVolumeImage& volume,
                           SliceViewerWidget& widget,
                           VolumeProjection projection) :
+      IObserver(broker),
       widget_(widget),
       projection_(projection)
     {
-      volume.Register(*this);
       widget.SetInteractor(*this);
+
+      volume.RegisterObserverCallback(
+        new Callable<VolumeImageInteractor, ISlicedVolume::GeometryReadyMessage>
+        (*this, &VolumeImageInteractor::OnGeometryReady));
     }
 
     bool IsGeometryReady() const