+#include "image3DDequeUR.h"
+
+Image3DDequeUR::Image3DDequeUR() {
+ this->m_GlobalPath = "/tmp/";
+ this->m_CurrentUndoPos = -1;
+ this->m_CurrentRedoPos = -1;
+}
+//virtual
+Image3DDequeUR::~Image3DDequeUR() {
+
+}
+//virtual
+void Image3DDequeUR::AddImageToUndoContainer(ImageType* img,
+ const RegionS& region) {
+ //managing memory
+ if (this->m_ImgUndoDeque.size() > 0) {
+ this->m_ImgUndoDeque.back().RemoveImageFromMemory(this->m_GlobalPath);
+ } //fi
+ //Adding image
+ ImageInfoUR imageInfo;
+ imageInfo.SetImageName(this->GetImageName());
+ imageInfo.SetImage(img);
+ imageInfo.SetRegion(region);
+ imageInfo.SaveImageAsMHD(this->m_GlobalPath);
+ //cleaning deque from current position
+ this->CleanUndoContainerFromIndex(this->m_CurrentUndoPos);
+ this->CleanRedoContainerFromIndex(0);
+ this->m_ImgRedoDeque.clear();
+ //Adding to deque
+ this->m_ImgUndoDeque.push_back(imageInfo);
+ this->m_CurrentUndoPos = this->m_ImgUndoDeque.size() - 1;
+}
+//virtual
+void Image3DDequeUR::AddImageToRedoContainer(ImageType* img,
+ const RegionS& region) {
+ //managing memory
+ if (this->m_ImgRedoDeque.size() > 0) {
+ this->m_ImgRedoDeque.back().RemoveImageFromMemory(this->m_GlobalPath);
+ } //fi
+ //adding image
+ ImageInfoUR imageInfo;
+ imageInfo.SetImageName(this->GetImageName());
+ imageInfo.SetImage(img);
+ imageInfo.SetRegion(region);
+ imageInfo.SaveImageAsMHD(this->m_GlobalPath);
+ //Adding to deque
+ this->m_ImgRedoDeque.push_back(imageInfo);
+ this->m_CurrentUndoPos = this->m_ImgRedoDeque.size() - 1;
+}
+//virtual
+void Image3DDequeUR::CleanUndoContainerFromIndex(const unsigned int& index) {
+ for (int i = this->m_ImgUndoDeque.size() - 1; i > this->m_CurrentUndoPos;
+ i--) {
+ this->m_ImgUndoDeque[i].RemoveImageFromMemory(this->m_GlobalPath);
+ this->m_ImgUndoDeque[i].RemoveImageFromDisk(this->m_GlobalPath);
+ this->m_ImgUndoDeque.pop_back();
+ }
+}
+//virtual
+void Image3DDequeUR::CleanRedoContainerFromIndex(const unsigned int& index) {
+ for (int i = this->m_ImgRedoDeque.size() - 1; i > this->m_CurrentRedoPos;
+ i--) {
+ this->m_ImgRedoDeque[i].RemoveImageFromMemory(this->m_GlobalPath);
+ this->m_ImgRedoDeque[i].RemoveImageFromDisk(this->m_GlobalPath);
+ this->m_ImgRedoDeque.pop_back();
+ }
+}
+
+//virtual
+ImageInfoUR Image3DDequeUR::Undo() {
+ ImageInfoUR imgRet;
+ if ((this->m_ImgUndoDeque.size() > 0) && (this->m_CurrentUndoPos != -1)) {
+ //removing from memory
+ if ((this->m_CurrentUndoPos + 1) < this->m_ImgUndoDeque.size()) {
+ this->m_ImgUndoDeque[(m_CurrentUndoPos + 1)].RemoveImageFromMemory(
+ this->m_GlobalPath);
+ } //fi
+ ImageInfoUR imgRet = this->m_ImgUndoDeque[m_CurrentUndoPos];
+ this->m_CurrentUndoPos--;
+ //adding to memory
+ if (this->m_CurrentUndoPos != -1) {
+ //Loading image
+ std::string fullPath = this->m_GlobalPath
+ + this->m_ImgUndoDeque[m_CurrentUndoPos].GetImageName();
+ this->m_ImgUndoDeque[m_CurrentUndoPos].LoadImageMHDToMemory(
+ this->m_GlobalPath);
+ } //fi
+ } //fi
+ return (imgRet);
+}
+//virtual
+ImageInfoUR Image3DDequeUR::Redo() {
+
+ ImageInfoUR imgRet;
+ //managing undo deque
+ if (this->m_ImgUndoDeque.size() > 0) {
+ if ((m_CurrentUndoPos - 1) != -1) {
+ this->m_ImgUndoDeque[m_CurrentUndoPos - 1].RemoveImageFromMemory(
+ this->m_GlobalPath);
+ } //fi
+ this->m_CurrentUndoPos++; //ready to do undo
+ if (this->m_CurrentUndoPos < ((int) this->m_ImgUndoDeque.size())) {
+ this->m_ImgUndoDeque[m_CurrentUndoPos].LoadImageMHDToMemory(
+ this->m_GlobalPath);
+ } //fi
+ //end of undo management
+ } //fi
+ //managing redo
+ if ((this->m_ImgRedoDeque.size() > 0) && (this->m_CurrentRedoPos != -1)) {
+ if ((this->m_CurrentRedoPos + 1) < this->m_ImgRedoDeque.size()) {
+ this->m_ImgRedoDeque[(m_CurrentRedoPos + 1)].RemoveImageFromMemory(
+ this->m_GlobalPath);
+ } //fi
+ imgRet = this->m_ImgRedoDeque[this->m_CurrentRedoPos];
+ this->m_CurrentRedoPos--;
+ if (this->m_CurrentRedoPos != -1) {
+ this->m_ImgRedoDeque[m_CurrentRedoPos].LoadImageMHDToMemory(
+ this->m_GlobalPath);
+ } //fi
+ //end of redo management
+ }
+ return (imgRet);
+}
+//virtual
+void Image3DDequeUR::CleanContainers() {
+ for (unsigned int i = 0; i < this->m_ImgUndoDeque.size(); i++) {
+ this->m_ImgUndoDeque[i].RemoveImageFromMemory(this->m_GlobalPath);
+ this->m_ImgUndoDeque[i].RemoveImageFromDisk(this->m_GlobalPath);
+ } //rof
+ for (unsigned int i = 0; i < this->m_ImgRedoDeque.size(); i++) {
+ this->m_ImgRedoDeque[i].RemoveImageFromMemory(this->m_GlobalPath);
+ this->m_ImgRedoDeque[i].RemoveImageFromDisk(this->m_GlobalPath);
+ } //rof
+ this->m_ImgRedoDeque.clear();
+ this->m_ImgUndoDeque.clear();
+}
+
+void Image3DDequeUR::SetGlobalPath(const std::string& globalPath) {
+ this->m_GlobalPath = globalPath;
+}
+
+std::string Image3DDequeUR::GetGlobalPath() {
+ return (this->m_GlobalPath);
+}
+
+std::string Image3DDequeUR::GetImageName() {
+//Giving a name to an image using the date and time
+ time_t rawtime;
+ struct tm * timeinfo;
+ char buffer[80];
+ time(&rawtime);
+ timeinfo = localtime(&rawtime);
+ strftime(buffer, 80, "%a_%d_%b_%y_%H_%M_S", timeinfo);
+ std::string date(buffer);
+ std::string aux(buffer);
+ std::string imageName = "img_" + aux;
+ return (imageName);
+}