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