[1061] | 1 | #include "wmfinalpage.h"
|
---|
| 2 | #include "ui_wmfinalpage.h"
|
---|
| 3 |
|
---|
[1093] | 4 | WmFinalPage::WmFinalPage(QString AppDir, QString wmLocation, QList<std::shared_ptr<WmPage> > &pages, QWidget *parent) :
|
---|
[1061] | 5 | QWizardPage(parent), ui(new Ui::wmfinalpage), pages(pages)
|
---|
| 6 | {
|
---|
| 7 | ui->setupUi(this);
|
---|
| 8 | this->wmLocation=wmLocation;
|
---|
| 9 |
|
---|
| 10 | this->oniSplitCommands = new QStringList();
|
---|
[1093] | 11 | this->myConverter = new Converter(AppDir, this->oniSplitCommands);
|
---|
[1061] | 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);
|
---|
[1093] | 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)));
|
---|
[1061] | 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++){
|
---|
[1093] | 63 | pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 64 | }
|
---|
| 65 | break;
|
---|
| 66 | }
|
---|
| 67 | case WINDOW_TYPE::DIARY:
|
---|
| 68 | typeNode = rootNode.append_child("DPge");
|
---|
| 69 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
[1093] | 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()))));
|
---|
[1061] | 73 | currentIGPGId = globalSectionCounter;
|
---|
[1093] | 74 | typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 75 | break;
|
---|
| 76 | case WINDOW_TYPE::HELP:
|
---|
| 77 | typeNode = rootNode.append_child("HPge");
|
---|
| 78 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
| 79 | currentIGPGId = globalSectionCounter;
|
---|
[1093] | 80 | typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 81 | break;
|
---|
| 82 | case WINDOW_TYPE::TEXT_CONSOLE:
|
---|
| 83 | {
|
---|
| 84 | typeNode = rootNode.append_child("TxtC");
|
---|
| 85 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
[1093] | 86 | typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 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++){
|
---|
[1093] | 92 | pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 93 | }
|
---|
| 94 | break;
|
---|
| 95 | }
|
---|
| 96 | case WINDOW_TYPE::WEAPON:
|
---|
| 97 | typeNode = rootNode.append_child("WPge");
|
---|
| 98 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
[1093] | 99 | typeNode.append_child("WeaponClass").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("leWeaponClassName").toString()));
|
---|
[1061] | 100 | currentIGPGId = globalSectionCounter;
|
---|
[1093] | 101 | typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 102 | break;
|
---|
| 103 | case WINDOW_TYPE::ITEM:
|
---|
| 104 | typeNode = rootNode.append_child("IPge");
|
---|
| 105 | typeNode.append_attribute("id").set_value(++globalSectionCounter);
|
---|
[1093] | 106 | typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR(field("lePageNumber").toString()));
|
---|
[1061] | 107 | currentIGPGId = globalSectionCounter;
|
---|
[1093] | 108 | typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 109 | break;
|
---|
| 110 | case WINDOW_TYPE::ENUM_END:
|
---|
[1093] | 111 | UtilVago::showAndLogErrorPopUp("An error ocurred: WmFinalPage::startProcessing invalid WINDOW_TYPE");
|
---|
[1061] | 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();
|
---|
[1093] | 133 | this->oniSplitCommands->append("-create:txmp " + Util::String::insertQuotes(this->wmLocation) + " -format:bgr32 " + Util::String::insertQuotes(imageLocation));
|
---|
[1061] | 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 |
|
---|
[1093] | 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)));
|
---|
[1061] | 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++){
|
---|
[1093] | 167 | igsaMainTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 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++){
|
---|
[1093] | 175 | igsaFooterTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(QSTR_TO_CSTR("#" + QString::number(++globalSectionCounter)));
|
---|
[1061] | 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");
|
---|
[1093] | 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())));
|
---|
[1061] | 207 | igstMainTextFontNode.append_child("Flags").append_child(pugi::xml_node_type::node_pcdata).set_value("Family Style Color Size");
|
---|
| 208 |
|
---|
[1093] | 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 | }
|
---|
[1061] | 221 | }
|
---|
| 222 |
|
---|
| 223 | };
|
---|
| 224 |
|
---|
| 225 | ////// Main Text
|
---|
| 226 | setIGStXmlSection(mainText, mainTextNumberOfRows);
|
---|
| 227 |
|
---|
| 228 | ////// Footer
|
---|
| 229 | setIGStXmlSection(footerText, footerTextNumberOfRows);
|
---|
| 230 | }
|
---|
| 231 |
|
---|
[1093] | 232 | if(!doc.save_file(QSTR_TO_CSTR(filePath))){
|
---|
| 233 | UtilVago::showAndLogErrorPopUpLogButton("Couldn't create " + filePath + " file!");
|
---|
[1061] | 234 | return;
|
---|
| 235 | }
|
---|
| 236 |
|
---|
| 237 | // Convert XML file to Oni
|
---|
| 238 | this->oniSplitCommands->clear();
|
---|
[1093] | 239 | this->oniSplitCommands->append("-create " + Util::String::insertQuotes(this->wmLocation) + " " + Util::String::insertQuotes(filePath));
|
---|
[1061] | 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 | }
|
---|