diff Framework/Widgets/LayerWidget.cpp @ 300:b4abaeb783b1 am-callable-and-promise

messaging refactoring almost complete: works fine in native
author am@osimis.io
date Tue, 18 Sep 2018 15:23:21 +0200
parents 3897f9f28cfa
children 14ef1227120f
line wrap: on
line diff
--- a/Framework/Widgets/LayerWidget.cpp	Fri Sep 14 16:44:01 2018 +0200
+++ b/Framework/Widgets/LayerWidget.cpp	Tue Sep 18 15:23:21 2018 +0200
@@ -386,6 +386,15 @@
     }
   }
   
+  void LayerWidget::ObserveLayer(ILayerSource& layer)
+  {
+    layer.RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::GeometryReadyMessage>(*this, &LayerWidget::OnGeometryReady));
+    // currently ignore errors layer->RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::GeometryErrorMessage>(*this, &LayerWidget::...));
+    layer.RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::SliceChangedMessage>(*this, &LayerWidget::OnSliceChanged));
+    layer.RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::ContentChangedMessage>(*this, &LayerWidget::OnContentChanged));
+    layer.RegisterObserverCallback(new Callable<LayerWidget, ILayerSource::LayerReadyMessage>(*this, &LayerWidget::OnLayerReady));
+  }
+
 
   size_t LayerWidget::AddLayer(ILayerSource* layer)  // Takes ownership
   {
@@ -400,7 +409,8 @@
     layersIndex_[layer] = index;
 
     ResetPendingScene();
-//    layer->RegisterObserver(*this);
+
+    ObserveLayer(*layer);
 
     ResetChangedLayers();
 
@@ -424,7 +434,8 @@
     layersIndex_[layer] = index;
 
     ResetPendingScene();
-//    layer->RegisterObserver(*this);
+
+    ObserveLayer(*layer);
 
     InvalidateLayer(index);
   }
@@ -491,38 +502,10 @@
     }
   }
 
-  void LayerWidget::HandleMessage(IObservable& from, const IMessage& message)
-  {
-    switch (message.GetType()) {
-    case MessageType_LayerSource_GeometryReady:
-      OnGeometryReady(dynamic_cast<const ILayerSource&>(from));
-      break;
-    case MessageType_LayerSource_GeometryError:
-      LOG(ERROR) << "Cannot get geometry";
-      break;
-    case MessageType_LayerSource_ContentChanged:
-      OnContentChanged(dynamic_cast<const ILayerSource&>(from));
-      break;
-    case MessageType_LayerSource_SliceChanged:
-      OnSliceChanged(dynamic_cast<const ILayerSource&>(from), dynamic_cast<const ILayerSource::SliceChangedMessage&>(message).slice_);
-      break;
-    case MessageType_LayerSource_LayerReady:
-    {
-      const ILayerSource::LayerReadyMessage& layerReadyMessage = dynamic_cast<const ILayerSource::LayerReadyMessage&>(message);
-      OnLayerReady(layerReadyMessage.layer_,
-                   dynamic_cast<const ILayerSource&>(from),
-                   layerReadyMessage.slice_,
-                   layerReadyMessage.isError_);
-    }; break;
-    default:
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
-    }
-  }
-
-  void LayerWidget::OnGeometryReady(const ILayerSource& source)
+  void LayerWidget::OnGeometryReady(const ILayerSource::GeometryReadyMessage& message)
   {
     size_t i;
-    if (LookupLayer(i, source))
+    if (LookupLayer(i, message.origin_))
     {
       LOG(INFO) << ": Geometry ready for layer " << i << " in " << GetName();
 
@@ -558,23 +541,22 @@
   }
 
 
-  void LayerWidget::OnContentChanged(const ILayerSource& source)
+  void LayerWidget::OnContentChanged(const ILayerSource::ContentChangedMessage& message)
   {
     size_t index;
-    if (LookupLayer(index, source))
+    if (LookupLayer(index, message.origin_))
     {
       InvalidateLayer(index);
     }
   }
   
 
-  void LayerWidget::OnSliceChanged(const ILayerSource& source,
-                                   const Slice& slice)
+  void LayerWidget::OnSliceChanged(const ILayerSource::SliceChangedMessage& message)
   {
-    if (slice.ContainsPlane(slice_))
+    if (message.slice_.ContainsPlane(slice_))
     {
       size_t index;
-      if (LookupLayer(index, source))
+      if (LookupLayer(index, message.origin_))
       {
         InvalidateLayer(index);
       }
@@ -582,15 +564,12 @@
   }
   
   
-  void LayerWidget::OnLayerReady(std::auto_ptr<ILayerRenderer>& renderer,
-                                 const ILayerSource& source,
-                                 const CoordinateSystem3D& slice,
-                                 bool isError)
+  void LayerWidget::OnLayerReady(const ILayerSource::LayerReadyMessage& message)
   {
     size_t index;
-    if (LookupLayer(index, source))
+    if (LookupLayer(index, message.origin_))
     {
-      if (isError)
+      if (message.isError_)
       {
         LOG(ERROR) << "Using error renderer on layer " << index;
       }
@@ -599,11 +578,11 @@
         LOG(INFO) << "Renderer ready for layer " << index;
       }
       
-      if (renderer.get() != NULL)
+      if (message.renderer_.get() != NULL)
       {
-        UpdateLayer(index, renderer.release(), slice);
+        UpdateLayer(index, message.renderer_.release(), message.slice_);
       }
-      else if (isError)
+      else if (message.isError_)
       {
         // TODO
         //UpdateLayer(index, new SliceOutlineRenderer(slice), slice);