changeset 571:c4f3e08e0c44 annotations

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 01 Sep 2026 21:33:29 +0200
parents 90d017623910
children 3efdbcfe34ab
files ViewerPlugin/Annotations/AnnotationsRestApi.cpp ViewerPlugin/Annotations/ILayer.h ViewerPlugin/Annotations/ISerializable.h ViewerPlugin/Annotations/LayersCollection.cpp ViewerPlugin/Annotations/LayersCollection.h ViewerPlugin/CMakeLists.txt
diffstat 6 files changed, 286 insertions(+), 157 deletions(-) [+]
line wrap: on
line diff
--- a/ViewerPlugin/Annotations/AnnotationsRestApi.cpp	Tue Sep 01 21:24:14 2026 +0200
+++ b/ViewerPlugin/Annotations/AnnotationsRestApi.cpp	Tue Sep 01 21:33:29 2026 +0200
@@ -29,7 +29,9 @@
 #include "../ViewerToolbox.h"
 #include "AnnotationsWorkspaceId.h"
 #include "IAuthenticatedUser.h"
+#include "ILayer.h"
 #include "ISerializable.h"
+#include "LayersCollection.h"
 
 #include <Cache/SharedObjectCache.h>
 #include <Compression/GzipCompressor.h>
@@ -56,163 +58,6 @@
   static const char* const KEY_TYPE = "type";
   static const char* const KEY_VERSION = "version";
   static const char* const KEY_VISIBLE = "visible";
-
-
-  class ILayer : public ISerializable
-  {
-  public:
-    virtual std::string GetId() const = 0;
-  };
-
-
-  class LayersCollection : public ISerializable
-  {
-  private:
-    typedef std::list<ILayer*>                        Content;
-    typedef std::map<std::string, Content::iterator>  Index;
-
-    Content  content_;
-    Index    index_;
-
-  public:
-    ~LayersCollection()
-    {
-      for (Content::iterator it = content_.begin(); it != content_.end(); ++it)
-      {
-        assert(*it != NULL);
-        delete *it;
-      }
-    }
-
-    size_t GetSize() const
-    {
-      assert(content_.size() == index_.size());
-      return content_.size();
-    }
-
-    void AddLayer(ILayer* layer /* takes ownership */)
-    {
-      std::unique_ptr<ILayer> protection(layer);
-
-      if (layer == NULL)
-      {
-        throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
-      }
-
-      const std::string id = protection->GetId();
-
-      if (index_.find(id) != index_.end())
-      {
-        throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Duplicate layer ID");
-      }
-      else
-      {
-        content_.push_back(protection.release());
-
-        Content::iterator it = content_.end();
-        --it;  // Points to the element we just inserted
-        index_[id] = it;
-      }
-    }
-
-    bool HasLayer(const std::string& id) const
-    {
-      return (index_.find(id) != index_.end());
-    }
-
-    ILayer& GetLayer(const std::string& id) const
-    {
-      Index::const_iterator found = index_.find(id);
-
-      if (found == index_.end())
-      {
-        throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
-      }
-      else
-      {
-        assert(*(found->second) != NULL);
-        return **(found->second);
-      }
-    }
-
-    void DeleteLayer(const std::string& id)
-    {
-      Index::iterator found = index_.find(id);
-
-      if (found == index_.end())
-      {
-        throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
-      }
-      else
-      {
-        assert(*(found->second) != NULL);
-        delete *(found->second);
-        content_.erase(found->second);
-        index_.erase(found);
-      }
-    }
-
-    virtual void Serialize(Json::Value& serialized) const ORTHANC_OVERRIDE
-    {
-      serialized = Json::arrayValue;
-
-      for (Content::const_iterator it = content_.begin(); it != content_.end(); ++it)
-      {
-        assert(*it != NULL);
-
-        Json::Value item;
-        (*it)->Serialize(item);
-        serialized.append(item);
-      }
-    }
-
-    class Iterator : public boost::noncopyable
-    {
-    private:
-      Content::const_iterator  it_;
-      Content::const_iterator  end_;
-
-    public:
-      Iterator(const LayersCollection& that) :
-        it_(that.content_.begin()),
-        end_(that.content_.end())
-      {
-      }
-
-      bool IsDone() const
-      {
-        return it_ == end_;
-      }
-
-      const ILayer& GetLayer() const
-      {
-        if (IsDone())
-        {
-          throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
-        }
-        else
-        {
-          assert(*it_ != NULL);
-          return **it_;
-        }
-      }
-
-      void Next()
-      {
-        if (IsDone())
-        {
-          throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
-        }
-        else
-        {
-          it_++;
-        }
-      }
-    };
-  };
-
-
-
   static const char* const KEY_ACTIVE_USERS = "active-users";
   static const char* const KEY_PROJECT_NAME = "project-name";
   static const char* const KEY_PROJECT_DESCRIPTION = "project-description";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ViewerPlugin/Annotations/ILayer.h	Tue Sep 01 21:33:29 2026 +0200
@@ -0,0 +1,36 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2023 Osimis S.A., Belgium
+ * Copyright (C) 2024-2026 Orthanc Team SRL, Belgium
+ * Copyright (C) 2021-2026 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero 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
+ * Affero General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "ISerializable.h"
+
+
+namespace OrthancWSI
+{
+  class ILayer : public ISerializable
+  {
+  public:
+    virtual std::string GetId() const = 0;
+  };
+}
--- a/ViewerPlugin/Annotations/ISerializable.h	Tue Sep 01 21:24:14 2026 +0200
+++ b/ViewerPlugin/Annotations/ISerializable.h	Tue Sep 01 21:33:29 2026 +0200
@@ -25,6 +25,7 @@
 
 #include <boost/noncopyable.hpp>
 #include <json/value.h>
+#include <string>
 
 
 namespace OrthancWSI
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ViewerPlugin/Annotations/LayersCollection.cpp	Tue Sep 01 21:33:29 2026 +0200
@@ -0,0 +1,170 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2023 Osimis S.A., Belgium
+ * Copyright (C) 2024-2026 Orthanc Team SRL, Belgium
+ * Copyright (C) 2021-2026 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero 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
+ * Affero General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#include "../../Framework/PrecompiledHeadersWSI.h"
+#include "LayersCollection.h"
+
+#include <OrthancException.h>
+
+#include <cassert>
+
+
+namespace OrthancWSI
+{
+  LayersCollection::~LayersCollection()
+  {
+    for (Content::iterator it = content_.begin(); it != content_.end(); ++it)
+    {
+      assert(*it != NULL);
+      delete *it;
+    }
+  }
+
+
+  size_t LayersCollection::GetSize() const
+  {
+    assert(content_.size() == index_.size());
+    return content_.size();
+  }
+
+
+  void LayersCollection::AddLayer(ILayer* layer)
+  {
+    std::unique_ptr<ILayer> protection(layer);
+
+    if (layer == NULL)
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
+    }
+
+    const std::string id = protection->GetId();
+
+    if (index_.find(id) != index_.end())
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Duplicate layer ID");
+    }
+    else
+    {
+      content_.push_back(protection.release());
+
+      Content::iterator it = content_.end();
+      --it;  // Points to the element we just inserted
+      index_[id] = it;
+    }
+  }
+
+
+  bool LayersCollection::HasLayer(const std::string& id) const
+  {
+    return (index_.find(id) != index_.end());
+  }
+
+
+  ILayer& LayersCollection::GetLayer(const std::string& id) const
+  {
+    Index::const_iterator found = index_.find(id);
+
+    if (found == index_.end())
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
+    }
+    else
+    {
+      assert(*(found->second) != NULL);
+      return **(found->second);
+    }
+  }
+
+
+  void LayersCollection::DeleteLayer(const std::string& id)
+  {
+    Index::iterator found = index_.find(id);
+
+    if (found == index_.end())
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
+    }
+    else
+    {
+      assert(*(found->second) != NULL);
+      delete *(found->second);
+      content_.erase(found->second);
+      index_.erase(found);
+    }
+  }
+
+
+  void LayersCollection::Serialize(Json::Value& serialized) const
+  {
+    serialized = Json::arrayValue;
+
+    for (Content::const_iterator it = content_.begin(); it != content_.end(); ++it)
+    {
+      assert(*it != NULL);
+
+      Json::Value item;
+      (*it)->Serialize(item);
+      serialized.append(item);
+    }
+  }
+
+
+  LayersCollection::Iterator::Iterator(const LayersCollection& that) :
+    it_(that.content_.begin()),
+    end_(that.content_.end())
+  {
+  }
+
+
+  bool LayersCollection::Iterator::IsDone() const
+  {
+    return it_ == end_;
+  }
+
+
+  const ILayer& LayersCollection::Iterator::GetLayer() const
+  {
+    if (IsDone())
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
+    }
+    else
+    {
+      assert(*it_ != NULL);
+      return **it_;
+    }
+  }
+
+
+  void LayersCollection::Iterator::Next()
+  {
+    if (IsDone())
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
+    }
+    else
+    {
+      it_++;
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ViewerPlugin/Annotations/LayersCollection.h	Tue Sep 01 21:33:29 2026 +0200
@@ -0,0 +1,76 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2023 Osimis S.A., Belgium
+ * Copyright (C) 2024-2026 Orthanc Team SRL, Belgium
+ * Copyright (C) 2021-2026 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero 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
+ * Affero General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "ILayer.h"
+
+#include <Compatibility.h>
+
+#include <list>
+#include <map>
+
+
+namespace OrthancWSI
+{
+  class LayersCollection : public ISerializable
+  {
+  private:
+    typedef std::list<ILayer*>                        Content;
+    typedef std::map<std::string, Content::iterator>  Index;
+
+    Content  content_;
+    Index    index_;
+
+  public:
+    ~LayersCollection();
+
+    size_t GetSize() const;
+
+    void AddLayer(ILayer* layer /* takes ownership */);
+
+    bool HasLayer(const std::string& id) const;
+
+    ILayer& GetLayer(const std::string& id) const;
+
+    void DeleteLayer(const std::string& id);
+
+    virtual void Serialize(Json::Value& serialized) const ORTHANC_OVERRIDE;
+
+    class Iterator : public boost::noncopyable
+    {
+    private:
+      Content::const_iterator  it_;
+      Content::const_iterator  end_;
+
+    public:
+      Iterator(const LayersCollection& that);
+
+      bool IsDone() const;
+
+      const ILayer& GetLayer() const;
+
+      void Next();
+    };
+  };
+}
--- a/ViewerPlugin/CMakeLists.txt	Tue Sep 01 21:24:14 2026 +0200
+++ b/ViewerPlugin/CMakeLists.txt	Tue Sep 01 21:33:29 2026 +0200
@@ -189,6 +189,7 @@
   Annotations/AnnotationsWorkspaceId.cpp
   Annotations/IAuthenticatedUser.cpp
   Annotations/ISerializable.cpp
+  Annotations/LayersCollection.cpp
   Annotations/UserId.cpp
   DicomPyramidCache.cpp
   IIIF.cpp