Mercurial > hg > orthanc-stone
diff Framework/Scene2DViewport/LayerHolder.cpp @ 1203:f3bb9a6dd949 broker
locking abstraction in IViewport
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 29 Nov 2019 21:22:21 +0100 |
parents | 32eaf4929b08 |
children | 86a8266b8888 |
line wrap: on
line diff
--- a/Framework/Scene2DViewport/LayerHolder.cpp Fri Nov 29 11:03:41 2019 +0100 +++ b/Framework/Scene2DViewport/LayerHolder.cpp Fri Nov 29 21:22:21 2019 +0100 @@ -43,24 +43,30 @@ void LayerHolder::CreateLayers() { - assert(baseLayerIndex_ == -1); + boost::shared_ptr<ViewportController> controller = controllerW_.lock(); - baseLayerIndex_ = GetScene().GetMaxDepth() + 100; + if (controller) + { + std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock()); + + assert(baseLayerIndex_ == -1); + + baseLayerIndex_ = lock->GetScene().GetMaxDepth() + 100; - for (int i = 0; i < polylineLayerCount_; ++i) - { - std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer()); - GetScene().SetLayer(baseLayerIndex_ + i, layer.release()); + for (int i = 0; i < polylineLayerCount_; ++i) + { + std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer()); + lock->GetScene().SetLayer(baseLayerIndex_ + i, layer.release()); + } + + for (int i = 0; i < textLayerCount_; ++i) + { + std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer()); + lock->GetScene().SetLayer( + baseLayerIndex_ + polylineLayerCount_ + i, + layer.release()); + } } - - for (int i = 0; i < textLayerCount_; ++i) - { - std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer()); - GetScene().SetLayer( - baseLayerIndex_ + polylineLayerCount_ + i, - layer.release()); - } - } void LayerHolder::CreateLayersIfNeeded() @@ -74,13 +80,6 @@ return (baseLayerIndex_ != -1); } - Scene2D& LayerHolder::GetScene() - { - boost::shared_ptr<ViewportController> controller = controllerW_.lock(); - ORTHANC_ASSERT(controller.get() != 0, "Zombie attack!"); - return controller->GetScene(); - } - void LayerHolder::DeleteLayersIfNeeded() { if (baseLayerIndex_ != -1) @@ -89,42 +88,71 @@ void LayerHolder::DeleteLayers() { - for (int i = 0; i < textLayerCount_ + polylineLayerCount_; ++i) + boost::shared_ptr<ViewportController> controller = controllerW_.lock(); + + if (controller) { - ORTHANC_ASSERT(GetScene().HasLayer(baseLayerIndex_ + i), "No layer"); - GetScene().DeleteLayer(baseLayerIndex_ + i); + std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock()); + + for (int i = 0; i < textLayerCount_ + polylineLayerCount_; ++i) + { + ORTHANC_ASSERT(lock->GetScene().HasLayer(baseLayerIndex_ + i), "No layer"); + lock->GetScene().DeleteLayer(baseLayerIndex_ + i); + } + baseLayerIndex_ = -1; } - baseLayerIndex_ = -1; } - + PolylineSceneLayer* LayerHolder::GetPolylineLayer(int index /*= 0*/) { - using namespace Orthanc; - ORTHANC_ASSERT(baseLayerIndex_ != -1); - ORTHANC_ASSERT(GetScene().HasLayer(GetPolylineLayerIndex(index))); - ISceneLayer* layer = - &(GetScene().GetLayer(GetPolylineLayerIndex(index))); + boost::shared_ptr<ViewportController> controller = controllerW_.lock(); + + if (controller) + { + std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock()); - PolylineSceneLayer* concreteLayer = - dynamic_cast<PolylineSceneLayer*>(layer); - - ORTHANC_ASSERT(concreteLayer != NULL); - return concreteLayer; + using namespace Orthanc; + ORTHANC_ASSERT(baseLayerIndex_ != -1); + ORTHANC_ASSERT(lock->GetScene().HasLayer(GetPolylineLayerIndex(index))); + ISceneLayer* layer = + &(lock->GetScene().GetLayer(GetPolylineLayerIndex(index))); + + PolylineSceneLayer* concreteLayer = + dynamic_cast<PolylineSceneLayer*>(layer); + + ORTHANC_ASSERT(concreteLayer != NULL); + return concreteLayer; + } + else + { + return NULL; // TODO + } } TextSceneLayer* LayerHolder::GetTextLayer(int index /*= 0*/) { - using namespace Orthanc; - ORTHANC_ASSERT(baseLayerIndex_ != -1); - ORTHANC_ASSERT(GetScene().HasLayer(GetTextLayerIndex(index))); - ISceneLayer* layer = - &(GetScene().GetLayer(GetTextLayerIndex(index))); + boost::shared_ptr<ViewportController> controller = controllerW_.lock(); + + if (controller) + { + std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock()); - TextSceneLayer* concreteLayer = - dynamic_cast<TextSceneLayer*>(layer); - - ORTHANC_ASSERT(concreteLayer != NULL); - return concreteLayer; + using namespace Orthanc; + ORTHANC_ASSERT(baseLayerIndex_ != -1); + ORTHANC_ASSERT(lock->GetScene().HasLayer(GetTextLayerIndex(index))); + ISceneLayer* layer = + &(lock->GetScene().GetLayer(GetTextLayerIndex(index))); + + TextSceneLayer* concreteLayer = + dynamic_cast<TextSceneLayer*>(layer); + + ORTHANC_ASSERT(concreteLayer != NULL); + return concreteLayer; + } + else + { + return NULL; // TODO + } } int LayerHolder::GetPolylineLayerIndex(int index /*= 0*/)