]> Creatis software - clitk.git/blob - vv/vvReadState.cxx
basic GUI state reading/saving
[clitk.git] / vv / vvReadState.cxx
1 #include "vvReadState.h"
2 #include "vvMainWindow.h"
3
4 #include <qtreewidget.h>
5
6 #include <QFile>
7 #include <QXmlStreamReader>
8
9 #include <cassert>
10 #include <string>
11
12 vvReadState::vvReadState() : m_XmlReader(new QXmlStreamReader), m_File(new QFile)
13 {
14   m_NumImages = 0;
15 }
16
17 vvReadState::~vvReadState()
18 {
19 }
20
21 void vvReadState::Run(vvMainWindow* vvWindow, const std::string& file)
22 {
23   assert(vvWindow);
24
25   m_NumImages = 0;
26   m_File->setFileName(file.c_str());
27   m_File->open(QIODevice::ReadOnly);
28   m_XmlReader->setDevice(m_File.get());
29   m_Window = vvWindow;
30   QTreeWidget* tree = m_Window->GetTree();
31   m_TreeItemCount = tree->topLevelItemCount();
32
33   ReadGUI();
34   ReadTree();
35 }
36
37 void vvReadState::ReadTree()
38 {
39   std::string value;
40   
41   while (!m_XmlReader->atEnd()) {
42     m_XmlReader->readNext();
43     value = m_XmlReader->qualifiedName().toString().toStdString();
44     if (m_XmlReader->isStartElement()) {
45       if (value == "Image") 
46         value = ReadImage();
47     } 
48   }
49   
50   if (m_XmlReader->hasError())
51     std::cout << "Error " << m_XmlReader->error() << " XML " << std::endl;
52 }
53
54 std::string  vvReadState::ReadImage()
55 {
56   std::string value;
57   int current_index = -1;
58   std::vector<std::string> files(1);
59
60   QXmlStreamAttributes attributes = m_XmlReader->attributes();
61   if (!m_XmlReader->hasError())
62     current_index = attributes.value("Index").toString().toInt();
63
64   current_index += m_TreeItemCount;
65   
66   while (!m_XmlReader->isEndElement() || value != "Image") { 
67     m_XmlReader->readNext();
68     value = m_XmlReader->qualifiedName().toString().toStdString();
69     //std::cout << "Value = " << value << std::endl;
70     if (m_XmlReader->isStartElement()) {
71       if (value == "FileName") {
72         files[0] = m_XmlReader->readElementText().toStdString();
73         if (!m_XmlReader->hasError()) {
74           m_Window->LoadImages(files, vvImageReader::IMAGE);
75         }
76       }
77       else if (current_index >= 0) {
78         if (value == "Fusion") 
79           value = ReadFusion(current_index);
80         else if (value == "Overlay")
81           value = ReadOverlay(current_index);
82         else if (value == "Vector")
83           value = ReadVector(current_index);
84       }
85     }
86   }
87   
88   if (!m_XmlReader->hasError())
89     m_NumImages++;
90
91   return value;
92 }
93
94 std::string vvReadState::ReadFusion(int index)
95 {
96   std::string file, value;
97   while (!m_XmlReader->isEndElement() || value != "Fusion") {
98     m_XmlReader->readNext();
99     value = m_XmlReader->qualifiedName().toString().toStdString();
100     if (m_XmlReader->isStartElement()) {
101       if (value == "FileName") {
102         file = m_XmlReader->readElementText().toStdString();
103         if (!m_XmlReader->hasError())
104           m_Window->AddFusionImage(index, file.c_str());
105       }
106     }
107   }
108   return value;
109 }
110
111 std::string vvReadState::ReadOverlay(int index)
112 {
113   std::string file, value;
114   while (!m_XmlReader->isEndElement() || value != "Overlay") {
115     m_XmlReader->readNext();
116     value = m_XmlReader->qualifiedName().toString().toStdString();
117     if (m_XmlReader->isStartElement()) {
118       if (value == "FileName") {
119         file = m_XmlReader->readElementText().toStdString();
120         if (!m_XmlReader->hasError())
121           m_Window->AddOverlayImage(index, file.c_str());
122       }
123     }
124   }
125   return value;
126 }
127
128 std::string vvReadState::ReadVector(int index)
129 {
130   std::string file, value;
131   while (!m_XmlReader->isEndElement() || value != "Vector") {
132     m_XmlReader->readNext();
133     value = m_XmlReader->qualifiedName().toString().toStdString();
134     if (m_XmlReader->isStartElement()) {
135       if (value == "FileName") {
136         file = m_XmlReader->readElementText().toStdString();
137         if (!m_XmlReader->hasError())
138           m_Window->AddField(file.c_str(), index);
139       }
140     }
141   }
142   return value;
143 }
144
145 void vvReadState::ReadGUI()
146 {
147
148 }
149