]> 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 /*!
2  * @file        image3DDequeUR.cxx
3  * @brief       This file contains the implementation of the Image3DDequeUR class.
4  * @author      Info-Dev
5  * @author      Diego CACERES (diego.caceres[AT]creatis.insa-lyon.fr)
6  * @date        2011-11-15
7  */
8
9 #include "image3DDequeUR.h"
10 #include <iostream>
11 #include <sstream>
12
13 // ----------------------------------------------------------------------------------
14 Image3DDequeUR::Image3DDequeUR() {
15         this->m_GlobalPath = "/home/caceres/temporal/";
16         this->m_CurrentURPos = -1;
17 }
18 // ----------------------------------------------------------------------------------
19 //virtual
20 Image3DDequeUR::~Image3DDequeUR() {
21         this->CleanHardDisk();
22 }
23 // ----------------------------------------------------------------------------------
24 //virtual
25 void Image3DDequeUR::AddImagesToURContainer(VTKImageDataPointerType imgUndo,
26                 VTKImageDataPointerType imgRedo, ImageMManager* imMManager) {
27         this->CleanURContainerFromIndex(this->m_CurrentURPos + 1);
28         //Adding image
29         ImageInfoUR* imageInfo = new ImageInfoUR();
30         imageInfo->SetImageName(this->GetImageName(this->m_ImgURDeque.size()));
31         imageInfo->SetImages(imgUndo, imgRedo);
32         imageInfo->SetImageMManager(imMManager);
33         //Adding to deque
34         this->m_ImgURDeque.push_back(imageInfo);
35         this->m_CurrentURPos = this->m_ImgURDeque.size() - 1;
36         //Managing memory
37         this->ManageMemory();
38 }
39 // ----------------------------------------------------------------------------------
40 //virtual
41 ImageInfoUR* Image3DDequeUR::Undo() {
42         ImageInfoUR* imgRet = NULL;
43         int imgURDequeSize = this->m_ImgURDeque.size();
44         if ((this->m_ImgURDeque.size() > 0) && (this->m_CurrentURPos != -1)
45                         && (this->m_CurrentURPos < imgURDequeSize)) {
46                 imgRet = this->m_ImgURDeque[m_CurrentURPos];
47                 this->m_CurrentURPos--;
48         } //fi
49         return (imgRet);
50 }
51 // ----------------------------------------------------------------------------------
52 //virtual
53 ImageInfoUR* Image3DDequeUR::Redo() {
54         ImageInfoUR* imgRet = NULL;
55         this->m_CurrentURPos++;
56         int imgURDequeSize = this->m_ImgURDeque.size();
57         if ((this->m_ImgURDeque.size() > 0) && (this->m_CurrentURPos != -1)
58                         && (this->m_CurrentURPos < imgURDequeSize)) {
59                 imgRet = this->m_ImgURDeque[m_CurrentURPos];
60         } //fi
61         else {
62                 this->m_CurrentURPos--;
63         }
64         return (imgRet);
65 }
66 // ----------------------------------------------------------------------------------
67 //virtual
68 void Image3DDequeUR::CleanURContainerFromIndex(const int& index) {
69         int count = 0;
70         for (unsigned int i = index; i < this->m_ImgURDeque.size(); i++) {
71                 this->m_ImgURDeque[i]->RemoveImagesFromMemory(this->m_GlobalPath);
72                 this->m_ImgURDeque[i]->RemoveImagesFromDisk(this->m_GlobalPath);
73                 count++;
74         }
75         for (int i = 0; i < count; i++) {
76                 this->m_ImgURDeque.pop_back();
77         } //rof
78 }
79 // ----------------------------------------------------------------------------------
80 //virtual
81 void Image3DDequeUR::ManageMemory() {
82         int imgURDequeSize = this->m_ImgURDeque.size();
83         for (int i = 0; i < imgURDequeSize; i++) {
84                 if (this->m_ImgURDeque[i]->GetStatus()) {
85                         this->m_ImgURDeque[i]->RemoveImagesFromMemory(this->m_GlobalPath);
86                 } //fi
87         } //rof
88           //Adding CurrentUndoPos to memory
89         if ((this->m_CurrentURPos != -1)
90                         && !(this->m_ImgURDeque[this->m_CurrentURPos]->GetStatus())) {
91                 this->m_ImgURDeque[this->m_CurrentURPos]->LoadImagesToMemory(
92                                 this->m_GlobalPath);
93         }
94         int currentRedoPos = this->m_CurrentURPos + 1;
95         if ((currentRedoPos < imgURDequeSize)
96                         && !(this->m_ImgURDeque[currentRedoPos]->GetStatus())) {
97                 this->m_ImgURDeque[currentRedoPos]->LoadImagesToMemory(
98                                 this->m_GlobalPath);
99         }
100 }
101 // ----------------------------------------------------------------------------------
102 void Image3DDequeUR::SetGlobalPath(const StringType& globalPath) {
103         this->m_GlobalPath = globalPath;
104 }
105 // ----------------------------------------------------------------------------------
106 void Image3DDequeUR::CleanHardDisk() {
107         for (unsigned int i = 0; i < this->m_ImgURDeque.size(); i++) {
108                 this->m_ImgURDeque[i]->RemoveImagesFromDisk(this->m_GlobalPath);
109         }
110 }
111 // ----------------------------------------------------------------------------------
112 Image3DDequeUR::StringType Image3DDequeUR::GetGlobalPath() {
113         return (this->m_GlobalPath);
114 }
115 // ----------------------------------------------------------------------------------
116 Image3DDequeUR::StringType Image3DDequeUR::GetImageName(const int & pos) {
117 //Giving a name to an image using the date and time
118         if (this->m_IDImages.empty()) {
119                 time_t rawtime;
120                 struct tm * timeinfo;
121                 char buffer[80];
122                 time(&rawtime);
123                 timeinfo = localtime(&rawtime);
124                 strftime(buffer, 80, "%H%M%S_%a_%d_%b_%y_", timeinfo);
125                 StringType date(buffer);
126                 StringType aux(buffer);
127                 this->m_IDImages = "img_" + aux;
128         }
129         std::stringstream ss; //create a stringstream
130         ss << pos; //add number to the stream
131         StringType imageName = this->m_IDImages + ss.str();
132         return (imageName);
133 }
134 // ----------------------------------------------------------------------------------