diff Framework/SmartLoader.cpp @ 330:7a364e44fbb4 am-2

renamed SetDefaultView in FitContent
author am@osimis.io
date Wed, 17 Oct 2018 12:45:52 +0200
parents a902a07769d4
children c34784e5f299
line wrap: on
line diff
--- a/Framework/SmartLoader.cpp	Wed Oct 17 12:30:32 2018 +0200
+++ b/Framework/SmartLoader.cpp	Wed Oct 17 12:45:52 2018 +0200
@@ -26,6 +26,7 @@
 #include "Framework/Widgets/LayerWidget.h"
 #include "Framework/StoneException.h"
 #include "Framework/Layers/FrameRenderer.h"
+#include "Core/Logging.h"
 
 namespace OrthancStone
 {
@@ -50,6 +51,7 @@
     CachedSlice(MessageBroker& broker)
       : LayerSourceBase(broker)
     {}
+    virtual ~CachedSlice() {}
 
     virtual bool GetExtent(std::vector<Vector>& points,
                            const CoordinateSystem3D& viewportSlice)
@@ -63,12 +65,21 @@
     {
       // TODO: viewportSlice is not used !!!!
 
-      // it has already been loaded -> trigger the "layer ready" message immediately
-      bool isFull = (effectiveQuality_ == SliceImageQuality_FullPng || effectiveQuality_ == SliceImageQuality_FullPam);
-      std::auto_ptr<Orthanc::ImageAccessor> accessor(new Orthanc::ImageAccessor());
-      image_->GetReadOnlyAccessor(*accessor);
-      LayerSourceBase::NotifyLayerReady(FrameRenderer::CreateRenderer(accessor.release(), *slice_, isFull),
-                                        slice_->GetGeometry(), false);
+      // it has already been loaded -> trigger the "layer ready" message immediately otherwise, do nothing now.  The LayerReady will be triggered
+      // once the LayerSource is ready
+      if (status_ == CachedSliceStatus_ImageLoaded)
+      {
+        LOG(WARNING) << "ScheduleLayerCreation for CachedSlice (image is loaded): " << slice_->GetOrthancInstanceId();
+        bool isFull = (effectiveQuality_ == SliceImageQuality_FullPng || effectiveQuality_ == SliceImageQuality_FullPam);
+        std::auto_ptr<Orthanc::ImageAccessor> accessor(new Orthanc::ImageAccessor());
+        image_->GetReadOnlyAccessor(*accessor);
+        LayerSourceBase::NotifyLayerReady(FrameRenderer::CreateRenderer(accessor.release(), *slice_, isFull),
+                                          slice_->GetGeometry(), false);
+      }
+      else
+      {
+        LOG(WARNING) << "ScheduleLayerCreation for CachedSlice (image is not loaded yet): " << slice_->GetOrthancInstanceId();
+      }
     }
 
     CachedSlice* Clone() const
@@ -105,10 +116,12 @@
 
     std::auto_ptr<ILayerSource> layerSource;
     std::string sliceKeyId = instanceId + ":" + std::to_string(frame);
+    SmartLoader::CachedSlice* cachedSlice = NULL;
 
     if (cachedSlices_.find(sliceKeyId) != cachedSlices_.end()) // && cachedSlices_[sliceKeyId]->status_ == CachedSliceStatus_Loaded)
     {
       layerSource.reset(cachedSlices_[sliceKeyId]->Clone());
+      cachedSlice = dynamic_cast<SmartLoader::CachedSlice*>(layerSource.get());
     }
     else
     {
@@ -134,7 +147,6 @@
       throw StoneException(ErrorCode_CanOnlyAddOneLayerAtATime);
     }
 
-    SmartLoader::CachedSlice* cachedSlice = dynamic_cast<SmartLoader::CachedSlice*>(layerSource.get());
     if (cachedSlice != NULL)
     {
       cachedSlice->NotifyGeometryReady();
@@ -144,14 +156,20 @@
 
   void SmartLoader::PreloadSlice(const std::string instanceId, unsigned int frame)
   {
+    // TODO: reactivate -> need to be able to ScheduleLayerLoading in ILayerSource without calling ScheduleLayerCreation
+    return;
     // TODO: check if it is already in the cache
 
+
+
     // create the slice in the cache with "empty" data
     boost::shared_ptr<CachedSlice> cachedSlice(new CachedSlice(IObserver::broker_));
     cachedSlice->slice_.reset(new Slice(instanceId, frame));
     cachedSlice->status_ = CachedSliceStatus_ScheduledToLoad;
     std::string sliceKeyId = instanceId + ":" + std::to_string(frame);
 
+    LOG(WARNING) << "Will preload: " << sliceKeyId;
+
     cachedSlices_[sliceKeyId] = boost::shared_ptr<CachedSlice>(cachedSlice);
 
     std::auto_ptr<ILayerSource> layerSource(new OrthancFrameLayerSource(IObserver::broker_, orthancApiClient_));
@@ -186,6 +204,8 @@
     const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount()
     std::string sliceKeyId = slice.GetOrthancInstanceId() + ":" + std::to_string(slice.GetFrame());
 
+    LOG(WARNING) << "Geometry ready: " << sliceKeyId;
+
     boost::shared_ptr<CachedSlice> cachedSlice(new CachedSlice(IObserver::broker_));
     cachedSlice->slice_.reset(slice.Clone());
     cachedSlice->effectiveQuality_ = source.GetImageQuality();
@@ -205,6 +225,8 @@
     const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount() ?
     std::string sliceKeyId = slice.GetOrthancInstanceId() + ":" + std::to_string(slice.GetFrame());
 
+    LOG(WARNING) << "Image ready: " << sliceKeyId;
+
     boost::shared_ptr<CachedSlice> cachedSlice(new CachedSlice(IObserver::broker_));
     cachedSlice->image_ = message.image_;
     cachedSlice->effectiveQuality_ = message.imageQuality_;
@@ -223,6 +245,8 @@
     const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount() ?
     std::string sliceKeyId = slice.GetOrthancInstanceId() + ":" + std::to_string(slice.GetFrame());
 
+    LOG(WARNING) << "Layer ready: " << sliceKeyId;
+
     // remove the slice from the preloading slices now that it has been fully loaded and it is referenced in the cache
     if (preloadingInstances_.find(sliceKeyId) != preloadingInstances_.end())
     {