]> Creatis software - creaVtk.git/blobdiff - lib/creaVtk/MeshManagerModel.h
#3507 Undo and Redo Meshes
[creaVtk.git] / lib / creaVtk / MeshManagerModel.h
index b679255a55e1686afbf39b4ad59a030752c4aedf..d8e6a780a52814ed6cd5a22087b093262f364f7c 100644 (file)
 # ------------------------------------------------------------------------
 */
 #include <vtkPolyData.h>
+#include <deque>
+#include <memory>
+
+template<class StateType>
+class HistoryHandler{
+public:
+       HistoryHandler(int maxElements);
+       ~HistoryHandler();
+       void            CleanHistory();
+       StateType*      Undo();
+       StateType*      Redo();
+       void            Save(StateType* State);
+       int             UndoSize();
+       int             RedoSize();
+       
+private:
+       std::deque<StateType*>  undoStack;
+       std::deque<StateType*>  redoStack;
+       int                                     maxElements;
+};
 
 class MeshModel{
 
 public:
        MeshModel(int id);
        MeshModel(vtkPolyData* mesh, int id);
+       MeshModel(MeshModel* meshModel);
        ~MeshModel();
        
        void                    SetMeshBase(vtkPolyData* mesh);
@@ -43,13 +64,14 @@ public:
     int                        GetId();
     std::string        GetName();
     
+
 protected:
 
 private:
-       vtkPolyData                             *_meshBase;
-    vtkPolyData                                *_meshTemp;
-    int                                                        _meshId;
-    std::string                                        _name;
+       vtkPolyData     *_meshBase;
+    vtkPolyData        *_meshTemp;
+    int                                _meshId;
+    std::string                _name;
 };
 
 #ifndef _MESHMANAGERMODEL_H_
@@ -68,8 +90,13 @@ class MeshManagerModel
 //---------------------------------------------
 public :
   MeshManagerModel();
+  MeshManagerModel(std::vector<vtkPolyData*> meshList);
   ~MeshManagerModel();
 
+       void ResetHistory();
+       void ResetAll();
+       
+       void UpdateMeshReference(vtkPolyData* mesh);
     void SetMeshBase(vtkPolyData* mesh);
     void SetMeshMemoryMode(vtkPolyData* mesh);
     void CopySetMeshBase(vtkPolyData* mesh);
@@ -80,7 +107,7 @@ public :
     
     virtual void RefreshOutputs(bool signalBox);
     
-    MeshModel* GetMeshModel();
+    std::shared_ptr<MeshModel> GetMeshModel();
     int GetNumberOfMeshes();
     
     void AddMesh_(vtkPolyData* mesh);
@@ -95,14 +122,28 @@ public :
     void InsertMeshesAtCurrent_(std::vector<vtkPolyData*> meshList);
     void InsertMeshesAtCurrent(std::vector<vtkPolyData*> meshList);
     
+    void InsertMeshModels_(std::vector<MeshModel*> meshModelList);
+       void InsertMeshModels(std::vector<MeshModel*> meshModelList);
+    
     void SelectMesh(int i);
     void SelectMeshByName(std::string meshName);
+    
+    void DeleteMesh_(int position);
     void DeleteMesh(int position);
     void DeleteMeshByName(std::string meshName);
     void DeleteCurrentMesh();
+    
+    void DeleteAll_();
     void DeleteAll();
+    
+    void ReplaceMesh(std::vector<vtkPolyData*> meshList);
+    
     void NextMesh();
     void PreviousMesh();
+    
+    void Undo();
+    void Redo();
+    
     std::vector<std::string> GetMeshNames();
 
 //--Method template----------------------------
@@ -119,9 +160,29 @@ protected:
 //---------------------------------------------
 private:
     
-    std::vector<MeshModel*>    _meshes;
-    int                                                currentMesh;
-    int                                                        meshId;
+    std::vector<std::shared_ptr<MeshModel>> _meshes;
+    int                                                                        currentMesh;
+    int                                                                                meshId;
+    
+    class ManagerState{
+       public:
+               ManagerState(std::vector<std::shared_ptr<MeshModel>> meshesToSave, int meshId, int currentMesh);
+               ~ManagerState();
+               std::vector<std::shared_ptr<MeshModel>>& GetMeshes();
+               int GetMeshId();
+               int GetCurrentMesh();
+       private:
+               std::vector<std::shared_ptr<MeshModel>> savedMeshes;
+               int savedCurrentMesh;
+               int savedId;
+    };
+    
+    void                                                       Save();
+    void                                                       RestoreState(ManagerState* state);
+    
+    HistoryHandler<ManagerState>       *history;
+    
+    
 };
 
 //-end of _MESHMANAGERMODEL_H_------------------------------------------------------