]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/image3DDequeUR.cxx
DFCH: UndoRedo + ManualPaint - Code update. Undo beta1 working :) :) :)
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / imageUndoRedo / image3DDequeUR.cxx
1 #include "image3DDequeUR.h"
2 #include <iostream>
3 #include <sstream>
4
5 Image3DDequeUR::Image3DDequeUR() {
6         this->m_GlobalPath = "/home/caceres/temporal/";
7         this->m_CurrentUndoPos = -1;
8         this->m_CurrentRedoPos = -1;
9 }
10 //virtual
11 Image3DDequeUR::~Image3DDequeUR() {
12
13 }
14 //virtual
15 void Image3DDequeUR::AddImageToUndoContainer(VTKImageDataPointerType img,
16                 const RegionS& region) {
17         //managing memory
18         if (this->m_ImgUndoDeque.size() > 0) {
19          this->m_ImgUndoDeque.back()->RemoveImageFromMemory(this->m_GlobalPath);
20          } //fi
21         //Adding image
22         ImageInfoUR* imageInfo = new ImageInfoUR();
23         imageInfo->SetImageName(
24                         this->GetImageName(this->m_ImgUndoDeque.size(), true));
25         imageInfo->SetImage(img);
26         imageInfo->SetRegion(region);
27         imageInfo->SaveImageAsMHD(this->m_GlobalPath);
28         //cleaning deque from current position
29         this->CleanUndoContainerFromIndex(this->m_CurrentUndoPos + 1);
30         this->CleanRedoContainerFromIndex(0);
31         this->m_ImgRedoDeque.clear();
32         //Adding to deque
33         this->m_ImgUndoDeque.push_back(imageInfo);
34         this->m_CurrentUndoPos = this->m_ImgUndoDeque.size() - 1;
35 }
36 //virtual
37 void Image3DDequeUR::AddImageToRedoContainer(VTKImageDataPointerType img,
38                 const RegionS& region) {
39         //managing memory
40         /*if (this->m_ImgRedoDeque.size() > 0) {
41                 this->m_ImgRedoDeque.back()->RemoveImageFromMemory(this->m_GlobalPath);
42         } //fi
43           //adding image
44         ImageInfoUR* imageInfo = new ImageInfoUR();
45         imageInfo->SetImageName(
46                         this->GetImageName(this->m_ImgRedoDeque.size(), false));
47         imageInfo->SetImage(img);
48         imageInfo->SetRegion(region);
49         imageInfo->SaveImageAsMHD(this->m_GlobalPath);
50         //Adding to deque
51         this->m_ImgRedoDeque.push_back(imageInfo);
52         this->m_CurrentUndoPos = this->m_ImgRedoDeque.size() - 1;*/
53 }
54 //virtual
55 void Image3DDequeUR::CleanUndoContainerFromIndex(const int& index) {
56         for (int i = index; i < this->m_ImgUndoDeque.size(); i++) {
57                 this->m_ImgUndoDeque[i]->RemoveImageFromMemory(this->m_GlobalPath);
58                 this->m_ImgUndoDeque[i]->RemoveImageFromDisk(this->m_GlobalPath);
59                 this->m_ImgUndoDeque.pop_back();
60         }
61 }
62 //virtual
63 void Image3DDequeUR::CleanRedoContainerFromIndex(const int& index) {
64         for (int i = index; i < this->m_ImgRedoDeque.size(); i++) {
65                 this->m_ImgRedoDeque[i]->RemoveImageFromMemory(this->m_GlobalPath);
66                 this->m_ImgRedoDeque[i]->RemoveImageFromDisk(this->m_GlobalPath);
67                 this->m_ImgRedoDeque.pop_back();
68         }
69 }
70
71 //virtual
72 ImageInfoUR* Image3DDequeUR::Undo() {
73         ImageInfoUR* imgRet = NULL;
74         if ((this->m_ImgUndoDeque.size() > 0) && (this->m_CurrentUndoPos != -1)) {
75                 std::cout<<"Controooool"<<std::endl;
76                 //removing from memory
77                 if ((this->m_CurrentUndoPos + 1) < this->m_ImgUndoDeque.size()) {
78                  this->m_ImgUndoDeque[(m_CurrentUndoPos + 1)]->RemoveImageFromMemory(
79                  this->m_GlobalPath);
80                  } //fi
81                 imgRet = this->m_ImgUndoDeque[m_CurrentUndoPos];
82                 std::cout << "imageName:  " << imgRet->GetImageName() << std::endl;
83                 this->m_CurrentUndoPos--;
84                 //adding to memory
85                 if (this->m_CurrentUndoPos != -1) {
86                         //Loading image
87                         StringType fullPath = this->m_GlobalPath
88                                         + this->m_ImgUndoDeque[m_CurrentUndoPos]->GetImageName();
89                         this->m_ImgUndoDeque[m_CurrentUndoPos]->LoadImageMHDToMemory(
90                                         this->m_GlobalPath);
91                 } //fi
92         } //fi
93         return (imgRet);
94 }
95 //virtual
96 ImageInfoUR* Image3DDequeUR::Redo() {
97
98         ImageInfoUR* imgRet = new ImageInfoUR();
99         //managing undo deque
100         if (this->m_ImgUndoDeque.size() > 0) {
101                 if ((m_CurrentUndoPos - 1) != -1) {
102                         this->m_ImgUndoDeque[m_CurrentUndoPos - 1]->RemoveImageFromMemory(
103                                         this->m_GlobalPath);
104                 } //fi
105                 this->m_CurrentUndoPos++; //ready to do undo
106                 if (this->m_CurrentUndoPos < ((int) this->m_ImgUndoDeque.size())) {
107                         this->m_ImgUndoDeque[m_CurrentUndoPos]->LoadImageMHDToMemory(
108                                         this->m_GlobalPath);
109                 } //fi
110                   //end of undo management
111         } //fi
112           //managing redo
113         if ((this->m_ImgRedoDeque.size() > 0) && (this->m_CurrentRedoPos != -1)) {
114                 if ((this->m_CurrentRedoPos + 1) < this->m_ImgRedoDeque.size()) {
115                         this->m_ImgRedoDeque[(m_CurrentRedoPos + 1)]->RemoveImageFromMemory(
116                                         this->m_GlobalPath);
117                 } //fi
118                 imgRet = this->m_ImgRedoDeque[this->m_CurrentRedoPos];
119                 this->m_CurrentRedoPos--;
120                 if (this->m_CurrentRedoPos != -1) {
121                         this->m_ImgRedoDeque[m_CurrentRedoPos]->LoadImageMHDToMemory(
122                                         this->m_GlobalPath);
123                 } //fi
124                   //end of redo management
125         }
126         return (imgRet);
127 }
128 //virtual
129 void Image3DDequeUR::CleanContainers() {
130         for (unsigned int i = 0; i < this->m_ImgUndoDeque.size(); i++) {
131                 this->m_ImgUndoDeque[i]->RemoveImageFromMemory(this->m_GlobalPath);
132                 this->m_ImgUndoDeque[i]->RemoveImageFromDisk(this->m_GlobalPath);
133         } //rof
134         for (unsigned int i = 0; i < this->m_ImgRedoDeque.size(); i++) {
135                 this->m_ImgRedoDeque[i]->RemoveImageFromMemory(this->m_GlobalPath);
136                 this->m_ImgRedoDeque[i]->RemoveImageFromDisk(this->m_GlobalPath);
137         } //rof
138         this->m_ImgRedoDeque.clear();
139         this->m_ImgUndoDeque.clear();
140 }
141
142 void Image3DDequeUR::SetGlobalPath(const StringType& globalPath) {
143         this->m_GlobalPath = globalPath;
144 }
145
146 StringType Image3DDequeUR::GetGlobalPath() {
147         return (this->m_GlobalPath);
148 }
149
150 StringType Image3DDequeUR::GetImageName(const int & pos, const bool& undo) {
151 //Giving a name to an image using the date and time
152         if (this->m_IDImages.empty()) {
153                 time_t rawtime;
154                 struct tm * timeinfo;
155                 char buffer[80];
156                 time(&rawtime);
157                 timeinfo = localtime(&rawtime);
158                 strftime(buffer, 80, "%H%M%S_%a_%d_%b_%y_", timeinfo);
159                 StringType date(buffer);
160                 StringType aux(buffer);
161                 this->m_IDImages = "img_" + aux;
162         }
163         std::stringstream ss; //create a stringstream
164         ss << pos; //add number to the stream
165         StringType imgType;
166         if (undo) {
167                 imgType = "undo";
168         } else {
169                 imgType = "redo";
170         }
171         StringType imageName = this->m_IDImages + imgType + ss.str();
172         imageName.append(".mhd");
173         return (imageName);
174 }