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