]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/image3DDequeUR.cxx
DFCH: ManualPaint + imageUndoRedo: Undo/Redo functionality its now 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_CurrentURPos = -1;
8 }
9 //virtual
10 Image3DDequeUR::~Image3DDequeUR() {
11         this->CleanHardDisk();
12 }
13 //virtual
14 void Image3DDequeUR::AddImagesToURContainer(VTKImageDataPointerType imgUndo,
15                 VTKImageDataPointerType imgRedo, ImageMManager* imMManager) {
16         this->CleanURContainerFromIndex(this->m_CurrentURPos + 1);
17         //Adding image
18         ImageInfoUR* imageInfo = new ImageInfoUR();
19         imageInfo->SetImageName(this->GetImageName(this->m_ImgURDeque.size()));
20         imageInfo->SetImages(imgUndo, imgRedo);
21         imageInfo->SetImageMManager(imMManager);
22         //Adding to deque
23         this->m_ImgURDeque.push_back(imageInfo);
24         this->m_CurrentURPos = this->m_ImgURDeque.size() - 1;
25         //Managing memory
26         this->ManageMemory();
27 }
28 //virtual
29 ImageInfoUR* Image3DDequeUR::Undo() {
30         ImageInfoUR* imgRet = NULL;
31         int imgURDequeSize = this->m_ImgURDeque.size();
32         if ((this->m_ImgURDeque.size() > 0) && (this->m_CurrentURPos != -1)
33                         && (this->m_CurrentURPos < imgURDequeSize)) {
34                 imgRet = this->m_ImgURDeque[m_CurrentURPos];
35                 this->m_CurrentURPos--;
36         } //fi
37         return (imgRet);
38 }
39
40 //virtual
41 ImageInfoUR* Image3DDequeUR::Redo() {
42         ImageInfoUR* imgRet = NULL;
43         this->m_CurrentURPos++;
44         int imgURDequeSize = this->m_ImgURDeque.size();
45         if ((this->m_ImgURDeque.size() > 0) && (this->m_CurrentURPos != -1)
46                         && (this->m_CurrentURPos < imgURDequeSize)) {
47                 imgRet = this->m_ImgURDeque[m_CurrentURPos];
48         } //fi
49         else {
50                 this->m_CurrentURPos--;
51         }
52         return (imgRet);
53 }
54 //virtual
55 void Image3DDequeUR::CleanURContainerFromIndex(const int& index) {
56         int count = 0;
57         for (unsigned int i = index; i < this->m_ImgURDeque.size(); i++) {
58                 this->m_ImgURDeque[i]->RemoveImagesFromMemory(this->m_GlobalPath);
59                 this->m_ImgURDeque[i]->RemoveImagesFromDisk(this->m_GlobalPath);
60                 count++;
61         }
62         for (int i = 0; i < count; i++) {
63                 this->m_ImgURDeque.pop_back();
64         } //rof
65 }
66
67 //virtual
68 void Image3DDequeUR::ManageMemory() {
69         int imgURDequeSize = this->m_ImgURDeque.size();
70         for (int i = 0; i < imgURDequeSize; i++) {
71                 if (this->m_ImgURDeque[i]->GetStatus()) {
72                         this->m_ImgURDeque[i]->RemoveImagesFromMemory(this->m_GlobalPath);
73                 } //fi
74         } //rof
75           //Adding CurrentUndoPos to memory
76         if ((this->m_CurrentURPos != -1)
77                         && !(this->m_ImgURDeque[this->m_CurrentURPos]->GetStatus())) {
78                 this->m_ImgURDeque[this->m_CurrentURPos]->LoadImagesToMemory(
79                                 this->m_GlobalPath);
80         }
81         int currentRedoPos = this->m_CurrentURPos + 1;
82         if ((currentRedoPos < imgURDequeSize)
83                         && !(this->m_ImgURDeque[currentRedoPos]->GetStatus())) {
84                 this->m_ImgURDeque[currentRedoPos]->LoadImagesToMemory(
85                                 this->m_GlobalPath);
86         }
87 }
88
89 void Image3DDequeUR::SetGlobalPath(const StringType& globalPath) {
90         this->m_GlobalPath = globalPath;
91 }
92
93 void Image3DDequeUR::CleanHardDisk() {
94         for (unsigned int i = 0; i < this->m_ImgURDeque.size(); i++) {
95                 this->m_ImgURDeque[i]->RemoveImagesFromDisk(this->m_GlobalPath);
96         }
97 }
98
99 Image3DDequeUR::StringType Image3DDequeUR::GetGlobalPath() {
100         return (this->m_GlobalPath);
101 }
102
103 Image3DDequeUR::StringType Image3DDequeUR::GetImageName(const int & pos) {
104 //Giving a name to an image using the date and time
105         if (this->m_IDImages.empty()) {
106                 time_t rawtime;
107                 struct tm * timeinfo;
108                 char buffer[80];
109                 time(&rawtime);
110                 timeinfo = localtime(&rawtime);
111                 strftime(buffer, 80, "%H%M%S_%a_%d_%b_%y_", timeinfo);
112                 StringType date(buffer);
113                 StringType aux(buffer);
114                 this->m_IDImages = "img_" + aux;
115         }
116         std::stringstream ss; //create a stringstream
117         ss << pos; //add number to the stream
118         StringType imageName = this->m_IDImages + ss.str();
119         return (imageName);
120 }