source: s10k/Vago/windowMessagesWizard/wmfinalpage.cpp@ 1092

Last change on this file since 1092 was 1063, checked in by s10k, 8 years ago

Fixes for mac os

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