1 | #include "wmfinalpage.h"
|
---|
2 | #include "ui_wmfinalpage.h"
|
---|
3 |
|
---|
4 | WmFinalPage::WmFinalPage(QString AppDir, QString wmLocation, QList<std::shared_ptr<WmPage> > &pages, QWidget *parent) :
|
---|
5 | QWizardPage(parent), ui(new Ui::wmfinalpage), pages(pages)
|
---|
6 | {
|
---|
7 | ui->setupUi(this);
|
---|
8 | this->wmLocation=wmLocation;
|
---|
9 |
|
---|
10 | this->oniSplitCommands = new QStringList();
|
---|
11 | this->myConverter = new Converter(AppDir, this->oniSplitCommands);
|
---|
12 |
|
---|
13 | ui->lbComplete->setText("<html>The wizard is now complete. The window messages have been converted. "
|
---|
14 | "You can view all converted files clicking <a href=' '>here.</a><br />"
|
---|
15 | "<br />Click restart to create more window messages from the wizard beggining, "
|
---|
16 | "otherwise click finish.</html>"); // Don't use rich text in qtdesigner because it generates platform dependent code
|
---|
17 |
|
---|
18 | connectSlots();
|
---|
19 | }
|
---|
20 |
|
---|
21 | void WmFinalPage::openSoundsFolder(){
|
---|
22 | QDesktopServices::openUrl(QUrl("file:///"+this->wmLocation));
|
---|
23 | }
|
---|
24 |
|
---|
25 | void WmFinalPage::initializePage(){
|
---|
26 | startProcessing();
|
---|
27 | }
|
---|
28 |
|
---|
29 | void WmFinalPage::startProcessing(){
|
---|
30 | // Check if images folder exists and create it if necessary
|
---|
31 | QDir saveDir(this->wmLocation);
|
---|
32 |
|
---|
33 | if(!saveDir.exists())
|
---|
34 | {
|
---|
35 | saveDir.mkpath("."); // http://stackoverflow.com/questions/2241808/checking-if-a-folder-exists-and-creating-folders-in-qt-c thanks Petrucio
|
---|
36 | }
|
---|
37 |
|
---|
38 | QString filePath = this->wmLocation + "/" + field("leFileName").toString() + ".xml";
|
---|
39 |
|
---|
40 | int globalSectionCounter = -1;
|
---|
41 | int currentIGPGId = globalSectionCounter;
|
---|
42 | int currentIGSAId = globalSectionCounter;
|
---|
43 | int currentIGSTId = globalSectionCounter;
|
---|
44 |
|
---|
45 | pugi::xml_document doc;
|
---|
46 |
|
---|
47 | pugi::xml_node rootNode = doc.append_child("Oni");
|
---|
48 | pugi::xml_node typeNode;
|
---|
49 |
|
---|
50 | // Define type node
|
---|
51 | switch(static_cast<WINDOW_TYPE>(field("cbWindowType").toInt())){
|
---|
52 | case WINDOW_TYPE::OBJECTIVE:
|
---|
53 | {
|
---|
54 | typeNode = rootNode.append_child("OPge");
|
---|
55 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
56 | typeNode.append_child("LevelNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("leLevelId").toString()));
|
---|
57 | typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(QString("#") + QString::number(++globalSectionCounter)));
|
---|
58 | pugi::xml_node igpaNode = rootNode.append_child("IGPA");
|
---|
59 | igpaNode.append_attribute("id").set_value(globalSectionCounter);
|
---|
60 | pugi::xml_node pagesNode = igpaNode.append_child("Pages");
|
---|
61 | currentIGPGId = globalSectionCounter;
|
---|
62 | for(int i=0; i<this->pages.size(); i++){
|
---|
63 | pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
64 | }
|
---|
65 | break;
|
---|
66 | }
|
---|
67 | case WINDOW_TYPE::DIARY:
|
---|
68 | typeNode = rootNode.append_child("DPge");
|
---|
69 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
70 | typeNode.append_child("LevelNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("leLevelId").toString()));
|
---|
71 | typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("lePageNumber").toString()));
|
---|
72 | typeNode.append_child("IsLearnedMove").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(QString::number(static_cast<int>(field("cbIsLearnedMove").toBool()))));
|
---|
73 | currentIGPGId = globalSectionCounter;
|
---|
74 | typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
75 | break;
|
---|
76 | case WINDOW_TYPE::HELP:
|
---|
77 | typeNode = rootNode.append_child("HPge");
|
---|
78 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
79 | currentIGPGId = globalSectionCounter;
|
---|
80 | typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
81 | break;
|
---|
82 | case WINDOW_TYPE::TEXT_CONSOLE:
|
---|
83 | {
|
---|
84 | typeNode = rootNode.append_child("TxtC");
|
---|
85 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
86 | typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
87 | pugi::xml_node igpaNode = rootNode.append_child("IGPA");
|
---|
88 | igpaNode.append_attribute("id").set_value(globalSectionCounter);
|
---|
89 | currentIGPGId = globalSectionCounter;
|
---|
90 | pugi::xml_node pagesNode = igpaNode.append_child("Pages");
|
---|
91 | for(int i=0; i<this->pages.size(); i++){
|
---|
92 | pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
93 | }
|
---|
94 | break;
|
---|
95 | }
|
---|
96 | case WINDOW_TYPE::WEAPON:
|
---|
97 | typeNode = rootNode.append_child("WPge");
|
---|
98 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
99 | typeNode.append_child("WeaponClass").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("leWeaponClassName").toString()));
|
---|
100 | currentIGPGId = globalSectionCounter;
|
---|
101 | typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
102 | break;
|
---|
103 | case WINDOW_TYPE::ITEM:
|
---|
104 | typeNode = rootNode.append_child("IPge");
|
---|
105 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
106 | typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("lePageNumber").toString()));
|
---|
107 | currentIGPGId = globalSectionCounter;
|
---|
108 | typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
109 | break;
|
---|
110 | case WINDOW_TYPE::ENUM_END:
|
---|
111 | UtilVago::showAndLogErrorPopUp("An error ocurred: WmFinalPage::startProcessing invalid WINDOW_TYPE");
|
---|
112 | break;
|
---|
113 | }
|
---|
114 |
|
---|
115 | // Write pages text
|
---|
116 | for(int i=0; i<this->pages.size(); i++){
|
---|
117 |
|
---|
118 | QTextEdit &mainText = this->pages[i]->getMainText();
|
---|
119 | int mainTextNumberOfRows = mainText.toPlainText().split("\n").size();
|
---|
120 |
|
---|
121 | QTextEdit &footerText = this->pages[i]->getFooterText();
|
---|
122 | int footerTextNumberOfRows = footerText.toPlainText().split("\n").size();
|
---|
123 |
|
---|
124 | // Create TXMP image if exists
|
---|
125 | QString imageLocation = this->pages[i]->getMiddleImage().toolTip();
|
---|
126 | QString imageTXMPName;
|
---|
127 |
|
---|
128 | if(!imageLocation.isEmpty()){
|
---|
129 |
|
---|
130 | imageTXMPName = "TXMP" + QFileInfo(imageLocation).baseName();
|
---|
131 |
|
---|
132 | this->oniSplitCommands->clear();
|
---|
133 | this->oniSplitCommands->append("-create:txmp " + Util::String::insertQuotes(this->wmLocation) + " -format:bgr32 " + Util::String::insertQuotes(imageLocation));
|
---|
134 |
|
---|
135 | this->myConverter->start(); // finally process the onisplit commands
|
---|
136 | this->myConverter->wait(); // wait for it to complete
|
---|
137 | }
|
---|
138 |
|
---|
139 | // IGPG
|
---|
140 | pugi::xml_node igpgNode = rootNode.append_child("IGPG");
|
---|
141 |
|
---|
142 | igpgNode.append_attribute("id").set_value(++currentIGPGId);
|
---|
143 |
|
---|
144 | pugi::xml_node igpgFontNode = igpgNode.append_child("Font");
|
---|
145 | igpgFontNode.append_child("Family").append_child(pugi::xml_node_type::node_pcdata).set_value("TSFFTahoma");
|
---|
146 | igpgFontNode.append_child("Style").append_child(pugi::xml_node_type::node_pcdata).set_value("Bold");
|
---|
147 | igpgFontNode.append_child("Color").append_child(pugi::xml_node_type::node_pcdata).set_value("255 127 0");
|
---|
148 | igpgFontNode.append_child("Size").append_child(pugi::xml_node_type::node_pcdata).set_value("12");
|
---|
149 | igpgFontNode.append_child("Flags").append_child(pugi::xml_node_type::node_pcdata).set_value("Family Style Color Size");
|
---|
150 |
|
---|
151 | currentIGSAId = globalSectionCounter;
|
---|
152 |
|
---|
153 | igpgNode.append_child("Image").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(imageTXMPName));
|
---|
154 | igpgNode.append_child("Text1").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
155 | igpgNode.append_child("Text2").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
156 |
|
---|
157 | // IGSA
|
---|
158 |
|
---|
159 | ////// Main Text
|
---|
160 | pugi::xml_node igsaMainTextNode = rootNode.append_child("IGSA");
|
---|
161 | igsaMainTextNode.append_attribute("id").set_value(++currentIGSAId);
|
---|
162 | pugi::xml_node igsaMainTextStringsNode = igsaMainTextNode.append_child("Strings");
|
---|
163 |
|
---|
164 | currentIGSTId = globalSectionCounter;
|
---|
165 |
|
---|
166 | for(int i=0; i<mainTextNumberOfRows; i++){
|
---|
167 | igsaMainTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
168 | }
|
---|
169 |
|
---|
170 | ////// Footer
|
---|
171 | pugi::xml_node igsaFooterTextNode = rootNode.append_child("IGSA");
|
---|
172 | igsaFooterTextNode.append_attribute("id").set_value(++currentIGSAId);
|
---|
173 | pugi::xml_node igsaFooterTextStringsNode = igsaFooterTextNode.append_child("Strings");
|
---|
174 | for(int i=0; i<footerTextNumberOfRows; i++){
|
---|
175 | igsaFooterTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
176 | }
|
---|
177 |
|
---|
178 | // IGSt
|
---|
179 |
|
---|
180 | auto setIGStXmlSection = [&rootNode, ¤tIGSTId](QTextEdit ¤tTextEdit, int numberOfRows){
|
---|
181 |
|
---|
182 | for(int i=0; i<numberOfRows; i++){
|
---|
183 |
|
---|
184 | QTextCursor currentCursor = currentTextEdit.textCursor();
|
---|
185 | currentCursor.setPosition(currentTextEdit.document()->findBlockByLineNumber(i).position());
|
---|
186 | currentCursor.movePosition(QTextCursor::StartOfLine);
|
---|
187 | currentCursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
|
---|
188 | QTextCharFormat format = currentCursor.charFormat();
|
---|
189 | QString colorRGB = QString::number(format.foreground().color().red()) + " " +
|
---|
190 | QString::number(format.foreground().color().green()) + " " +
|
---|
191 | QString::number(format.foreground().color().blue());
|
---|
192 | QString style = (QString(format.fontItalic() ? "Italic " : "") + (format.fontWeight() == QFont::Bold ? "Bold " : "")).trimmed();
|
---|
193 |
|
---|
194 | if(style.isEmpty()){
|
---|
195 | style = "Normal";
|
---|
196 | }
|
---|
197 |
|
---|
198 |
|
---|
199 | pugi::xml_node igstMainTextNode = rootNode.append_child("IGSt");
|
---|
200 | igstMainTextNode.append_attribute("id").set_value(++currentIGSTId);
|
---|
201 |
|
---|
202 | pugi::xml_node igstMainTextFontNode = igstMainTextNode.append_child("Font");
|
---|
203 | igstMainTextFontNode.append_child("Family").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("TSFF" + format.font().family()));
|
---|
204 | igstMainTextFontNode.append_child("Style").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(style));
|
---|
205 | igstMainTextFontNode.append_child("Color").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(colorRGB));
|
---|
206 | igstMainTextFontNode.append_child("Size").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(QString::number(format.font().pointSize())));
|
---|
207 | igstMainTextFontNode.append_child("Flags").append_child(pugi::xml_node_type::node_pcdata).set_value("Family Style Color Size");
|
---|
208 |
|
---|
209 | QString currentRowText = currentCursor.selection().toPlainText();
|
---|
210 |
|
---|
211 | pugi::xml_node currentIGStNode = igstMainTextNode.append_child("Text");
|
---|
212 |
|
---|
213 | if(!currentRowText.trimmed().isEmpty()){
|
---|
214 | currentIGStNode.append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(currentRowText));
|
---|
215 | }
|
---|
216 | else{
|
---|
217 | // Empty paragraph use OniSplit correct representation (<Text xml:space="preserve"> </Text>)
|
---|
218 | currentIGStNode.append_child(pugi::xml_node_type::node_pcdata).set_value(" ");
|
---|
219 | currentIGStNode.append_attribute("xml:space").set_value("preserve");
|
---|
220 | }
|
---|
221 | }
|
---|
222 |
|
---|
223 | };
|
---|
224 |
|
---|
225 | ////// Main Text
|
---|
226 | setIGStXmlSection(mainText, mainTextNumberOfRows);
|
---|
227 |
|
---|
228 | ////// Footer
|
---|
229 | setIGStXmlSection(footerText, footerTextNumberOfRows);
|
---|
230 | }
|
---|
231 |
|
---|
232 | if(!doc.save_file(QSTR_TO_CSTR(filePath))){
|
---|
233 | UtilVago::showAndLogErrorPopUpLogButton("Couldn't create " + filePath + " file!");
|
---|
234 | return;
|
---|
235 | }
|
---|
236 |
|
---|
237 | // Convert XML file to Oni
|
---|
238 | this->oniSplitCommands->clear();
|
---|
239 | this->oniSplitCommands->append("-create " + Util::String::insertQuotes(this->wmLocation) + " " + Util::String::insertQuotes(filePath));
|
---|
240 |
|
---|
241 | this->myConverter->start(); // finally process the onisplit commands
|
---|
242 | this->myConverter->wait(); // wait for it to complete
|
---|
243 | }
|
---|
244 |
|
---|
245 | void WmFinalPage::catchOSplitProcessingErrors(QString result, int numErrors){
|
---|
246 |
|
---|
247 | if(numErrors!=0){
|
---|
248 | QString sNumErrors=QString::number(numErrors);
|
---|
249 | if(numErrors>1){
|
---|
250 | UtilVago::showErrorPopUpLogButton(result+"\n This is the last of " + sNumErrors + " errors.");
|
---|
251 | }
|
---|
252 | else{
|
---|
253 | UtilVago::showErrorPopUpLogButton(result);
|
---|
254 | }
|
---|
255 | }
|
---|
256 | }
|
---|
257 |
|
---|
258 | void WmFinalPage::connectSlots(){
|
---|
259 | //This signal is for thread that is working setup the progress bar (make it visible and set it's min-max)
|
---|
260 | connect(this->myConverter, SIGNAL(resultConversion(QString, int)), this, SLOT(catchOSplitProcessingErrors(QString, int)));
|
---|
261 | connect(ui->lbComplete, SIGNAL(linkActivated(const QString & )), this, SLOT(openSoundsFolder()));
|
---|
262 | }
|
---|
263 |
|
---|
264 | WmFinalPage::~WmFinalPage()
|
---|
265 | {
|
---|
266 | delete this->oniSplitCommands;
|
---|
267 | delete this->myConverter;
|
---|
268 | delete ui;
|
---|
269 | }
|
---|