diff OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.h @ 1804:5a872e69c74f

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 20 May 2021 14:48:51 +0200
parents
children 0840a25c6d41
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.h	Thu May 20 14:48:51 2021 +0200
@@ -0,0 +1,116 @@
+/**
+ * Stone of Orthanc
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ **/
+
+
+#include "../Messages/IObservable.h"
+#include "Scene2D.h"
+#include "../Scene2DViewport/IFlexiblePointerTracker.h"
+
+namespace OrthancStone
+{
+  class AnnotationsSceneLayer : public IObservable
+  {
+  public:
+    ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, AnnotationAddedMessage, AnnotationsSceneLayer);
+    ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, AnnotationRemovedMessage, AnnotationsSceneLayer);
+
+    enum Tool
+    {
+      Tool_Edit,
+      Tool_None,
+      Tool_Segment,
+      Tool_Angle,
+      Tool_Circle,
+      Tool_Erase
+    };
+    
+  private:
+    class GeometricPrimitive;    
+    class Handle;    
+    class Segment;
+    class Circle;    
+    class Arc;
+    class Text;
+
+    class Annotation;
+    class SegmentAnnotation;
+    class AngleAnnotation;
+    class CircleAnnotation;
+    
+    class EditPrimitiveTracker;
+    class CreateSegmentOrCircleTracker;
+    class CreateAngleTracker;
+    class EraseTracker;
+
+    typedef std::set<GeometricPrimitive*>  GeometricPrimitives;
+    typedef std::set<Annotation*>          Annotations;
+    typedef std::set<size_t>               SubLayers;
+
+    Tool                 activeTool_;
+    size_t               macroLayerIndex_;
+    size_t               polylineSubLayer_;
+    GeometricPrimitives  primitives_;
+    Annotations          annotations_;
+    SubLayers            subLayersToRemove_;
+
+    void AddAnnotation(Annotation* annotation);
+    
+    void DeleteAnnotation(Annotation* annotation);
+
+    void DeletePrimitive(GeometricPrimitive* primitive);
+    
+    void TagSubLayerToRemove(size_t subLayerIndex);
+    
+  public:
+    AnnotationsSceneLayer(size_t macroLayerIndex);
+    
+    ~AnnotationsSceneLayer()
+    {
+      Clear();
+    }
+
+    void Clear();
+
+    void SetActiveTool(Tool tool)
+    {
+      activeTool_ = tool;
+    }
+
+    Tool GetActiveTool() const
+    {
+      return activeTool_;
+    }
+
+    void Render(Scene2D& scene);
+    
+    bool ClearHover();
+
+    bool SetMouseHover(const ScenePoint2D& p /* expressed in canvas coordinates */,
+                       const Scene2D& scene);
+
+    IFlexiblePointerTracker* CreateTracker(const ScenePoint2D& p /* expressed in canvas coordinates */,
+                                           const Scene2D& scene);
+    
+    void Serialize(Json::Value& target) const;
+    
+    void Unserialize(const Json::Value& serialized);
+  };
+}