X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcreaVtk%2FMeshManagerModel.cpp;h=ddf25583551f299a25eeff842c0151f02dacce49;hb=0105528a5e3a8a9bb4f1e7b313e6a4e437ddb5e6;hp=41b97706d227b76b8a5c27aec1e8f406befcdcd4;hpb=12de8dce0b5d0634285ec91788eb5173bfc57337;p=creaVtk.git diff --git a/lib/creaVtk/MeshManagerModel.cpp b/lib/creaVtk/MeshManagerModel.cpp index 41b9770..ddf2558 100644 --- a/lib/creaVtk/MeshManagerModel.cpp +++ b/lib/creaVtk/MeshManagerModel.cpp @@ -48,21 +48,27 @@ void HistoryHandler::CleanHistory() { delete element; } + redoStack.clear(); for (T* element : undoStack) { delete element; } + undoStack.clear(); } template T* HistoryHandler::Undo(T* state) { + if(state == NULL) + { + return NULL; + } if(!undoStack.empty()) { auto lastElem = undoStack.back(); undoStack.pop_back(); redoStack.push_back(state); - return lastElem;//undoStack.back(); + return lastElem; }else{ delete state; } @@ -72,6 +78,10 @@ T* HistoryHandler::Undo(T* state) template T* HistoryHandler::Redo(T* state) { + if(state == NULL) + { + return NULL; + } if(!redoStack.empty()) { auto lastElem = redoStack.back(); @@ -80,8 +90,46 @@ T* HistoryHandler::Redo(T* state) return lastElem; }else{ delete state; + return NULL; + } +} + +/** +* To be used with RedoKeepCurrent +* Will always maintain the current state in the undo stack as the first element +* Useful when states are saved after actions and the initial state is saved. +*/ +template +T* HistoryHandler::UndoKeepCurrent() +{ + if(undoStack.size() > 1) + { + auto lastElem = undoStack.back(); + undoStack.pop_back(); + redoStack.push_back(lastElem); + return undoStack.back(); + }else{ + return NULL; + } +} + +/** +* To be used with UndoKeepCurrent +* Will always maintain the current state in the undo stack as the first element +* Useful when states are saved after actions and the initial state is saved. +*/ +template +T* HistoryHandler::RedoKeepCurrent() +{ + if(!redoStack.empty()) + { + auto lastElem = redoStack.back(); + redoStack.pop_back(); + undoStack.push_back(lastElem); + return undoStack.back(); + }else{ + return NULL; } - return NULL; } template @@ -90,8 +138,9 @@ void HistoryHandler::Save(T* state) undoStack.push_back(state); if(undoStack.size() > maxElements) { - delete undoStack.front(); + T* frontDel = undoStack.front(); undoStack.pop_front(); + delete frontDel; } if(!redoStack.empty()) { @@ -279,21 +328,32 @@ MeshManagerModel::MeshManagerModel() meshId = 0; history = new HistoryHandler(15); lastModified = 0; + memoryMode = false; } MeshManagerModel::~MeshManagerModel() { DeleteAll(); + history->CleanHistory(); + delete history; } void MeshManagerModel::RefreshOutputs(bool signalBox) // virtual { } +void MeshManagerModel::SetHistory(int maxCapacity) +{ + if(history != NULL){ + ResetHistory(); + delete history; + } + history = new HistoryHandler(maxCapacity); +} + void MeshManagerModel::ResetHistory() { history->CleanHistory(); - //Save(); } int MeshManagerModel::GetNumberOfMeshes() @@ -550,6 +610,16 @@ void MeshManagerModel::SetMeshBase(vtkPolyData* mesh) } } +void MeshManagerModel::MeshMemoryModeOn() +{ + memoryMode = true; +} + +void MeshManagerModel::MeshMemoryModeOff() +{ + memoryMode = false; +} + void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh) { if(_meshes.size() > 1) @@ -561,6 +631,8 @@ void MeshManagerModel::SetMeshMemoryMode(vtkPolyData* mesh) AddEmptyMesh_(); } _meshes.at(currentMesh)->SetMeshMemoryMode(mesh); + ResetHistory(); + SaveMemoryMode(); RefreshOutputs(true); } @@ -616,25 +688,47 @@ int MeshManagerModel::GetCurrentMesh() void MeshManagerModel::Undo() { if(history->UndoSize() > 0) - { - RestoreState(history->Undo(new ManagerState(_meshes, meshId, lastModified))); - RefreshOutputs(true); + { + if(memoryMode == false){ + RestoreState(history->Undo(new ManagerState(_meshes, meshId, lastModified))); + RefreshOutputs(true); + } + else if(history->UndoSize() > 1){ + RestoreStateMemoryMode(history->UndoKeepCurrent()); + } } } void MeshManagerModel::Redo() { if(history->RedoSize() > 0) - { - RestoreState(history->Redo(new ManagerState(_meshes, meshId, lastModified))); - RefreshOutputs(true); + { + if(memoryMode == false){ + RestoreState(history->Redo(new ManagerState(_meshes, meshId, lastModified))); + RefreshOutputs(true); + } + else{ + RestoreStateMemoryMode(history->RedoKeepCurrent()); + } } } void MeshManagerModel::Save() { history->Save(new ManagerState(_meshes, meshId, currentMesh)); - //lastModified = currentMesh; +} + +void MeshManagerModel::SaveMemoryMode() +{ + if(_meshes.size() == 1 && memoryMode) + { + std::vector> savedMesh; + savedMesh.push_back(std::make_shared(_meshes.at(0).get())); + history->Save(new ManagerState(savedMesh, meshId, 0)); + } + else{ + printf("PG MeshManagerModel::SaveMemoryMode WARNING Mesh vector has invalid size or memoryMode is not set \n"); + } } void MeshManagerModel::RestoreState(ManagerState* state) @@ -645,6 +739,23 @@ void MeshManagerModel::RestoreState(ManagerState* state) meshId = state->GetMeshId(); currentMesh = state->GetModifiedPos(); lastModified = state->GetModifiedPos(); + delete state; + } + else{ + printf("PG MeshManagerModel::RestoreState WARNING State is NULL \n"); + } +} + +void MeshManagerModel::RestoreStateMemoryMode(ManagerState* state){ + if(_meshes.size() == 1 && state != NULL) + { + vtkPoints* statePoints = vtkPoints::New(); + statePoints->DeepCopy(state->GetMeshes().at(0)->GetMeshBase()->GetPoints()); + _meshes.at(0)->GetMeshBase()->SetPoints(statePoints); + _meshes.at(0)->GetMeshBase()->GetPoints()->Modified(); + _meshes.at(0)->GetMeshBase()->Modified(); + }else{ + printf("PG MeshManagerModel::RestoreStateMemoryMode WARNING Mesh vector has invalid size or state is NULL\n"); } }