campaignproperties.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /*
  2. * campaignproperties.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "campaignproperties.h"
  12. #include "ui_campaignproperties.h"
  13. #include "../../lib/GameLibrary.h"
  14. #include "../../lib/texts/CGeneralTextHandler.h"
  15. #include "../../lib/campaign/CampaignRegionsHandler.h"
  16. #include "../../lib/campaign/CampaignState.h"
  17. #include "../../lib/constants/StringConstants.h"
  18. #include "../../lib/json/JsonNode.h"
  19. CampaignProperties::CampaignProperties(std::shared_ptr<CampaignState> campaignState):
  20. ui(new Ui::CampaignProperties),
  21. campaignState(campaignState),
  22. regions(campaignState->campaignRegions)
  23. {
  24. ui->setupUi(this);
  25. setWindowTitle(tr("Campaign Properties"));
  26. setWindowModality(Qt::ApplicationModal);
  27. ui->lineEditName->setText(QString::fromStdString(campaignState->name.toString()));
  28. ui->textEditDescription->setText(QString::fromStdString(campaignState->description.toString()));
  29. ui->lineEditAuthor->setText(QString::fromStdString(campaignState->author.toString()));
  30. ui->lineEditAuthorContact->setText(QString::fromStdString(campaignState->authorContact.toString()));
  31. ui->dateTimeEditCreationDateTime->setDateTime(QDateTime::fromSecsSinceEpoch(campaignState->creationDateTime));
  32. ui->lineEditCampaignVersion->setText(QString::fromStdString(campaignState->campaignVersion.toString()));
  33. ui->lineEditMusic->setText(QString::fromStdString(campaignState->music.getName()));
  34. ui->checkBoxScenarioDifficulty->setChecked(campaignState->difficultyChosenByPlayer);
  35. ui->lineEditLoadingBackground->setText(QString::fromStdString(campaignState->loadingBackground.getName()));
  36. ui->checkBoxVideoRim->setChecked(campaignState->videoRim != ImagePath::builtin("NONE"));
  37. ui->lineEditVideoRim->setText(QString::fromStdString(campaignState->videoRim.getName()));
  38. ui->lineEditVideoRim->setEnabled(ui->checkBoxVideoRim->isChecked());
  39. ui->lineEditIntroVideo->setText(QString::fromStdString(campaignState->introVideo.getName()));
  40. ui->lineEditOutroVideo->setText(QString::fromStdString(campaignState->outroVideo.getName()));
  41. const JsonNode legacyRegionConfig(JsonPath::builtin("config/campaignRegions.json"));
  42. auto legacyRegions = legacyRegionConfig.Struct();
  43. int legacyRegionNumber = legacyRegions.size();
  44. for (int i = 0; i < legacyRegionNumber; i++)
  45. {
  46. auto it = legacyRegions.begin();
  47. std::advance(it, i);
  48. ui->comboBoxRegionPreset->insertItem(i, QString::fromStdString(it->first));
  49. }
  50. ui->comboBoxRegionPreset->insertItem(legacyRegionNumber, tr("Custom"));
  51. ui->comboBoxRegionPreset->setCurrentIndex(ui->comboBoxRegionPreset->count() - 1);
  52. loadRegion();
  53. show();
  54. }
  55. CampaignProperties::~CampaignProperties()
  56. {
  57. delete ui;
  58. }
  59. bool CampaignProperties::showCampaignProperties(std::shared_ptr<CampaignState> campaignState)
  60. {
  61. if(!campaignState)
  62. return false;
  63. auto * dialog = new CampaignProperties(campaignState);
  64. dialog->setAttribute(Qt::WA_DeleteOnClose);
  65. return dialog->exec() == QDialog::Accepted;
  66. }
  67. void CampaignProperties::on_buttonBox_clicked(QAbstractButton * button)
  68. {
  69. if(button == ui->buttonBox->button(QDialogButtonBox::Ok))
  70. {
  71. if(!saveRegion())
  72. return;
  73. campaignState->name = MetaString::createFromRawString(ui->lineEditName->text().toStdString());
  74. campaignState->description = MetaString::createFromRawString(ui->textEditDescription->toPlainText().toStdString());
  75. campaignState->author = MetaString::createFromRawString(ui->lineEditAuthor->text().toStdString());
  76. campaignState->authorContact = MetaString::createFromRawString(ui->lineEditAuthorContact->text().toStdString());
  77. campaignState->creationDateTime = ui->dateTimeEditCreationDateTime->dateTime().toSecsSinceEpoch();
  78. campaignState->campaignVersion = MetaString::createFromRawString(ui->lineEditCampaignVersion->text().toStdString());
  79. campaignState->music = AudioPath::builtin(ui->lineEditMusic->text().toStdString());
  80. campaignState->difficultyChosenByPlayer = ui->checkBoxScenarioDifficulty->isChecked();
  81. campaignState->loadingBackground = ImagePath::builtin(ui->lineEditLoadingBackground->text().toStdString());
  82. campaignState->videoRim = ImagePath::builtin(ui->lineEditVideoRim->text().toStdString());
  83. campaignState->introVideo = VideoPath::builtin(ui->lineEditIntroVideo->text().toStdString());
  84. campaignState->outroVideo = VideoPath::builtin(ui->lineEditOutroVideo->text().toStdString());
  85. accept();
  86. }
  87. close();
  88. }
  89. void CampaignProperties::on_comboBoxRegionPreset_currentIndexChanged(int index)
  90. {
  91. if(ui->comboBoxRegionPreset->currentIndex() != ui->comboBoxRegionPreset->count() - 1)
  92. regions = *LIBRARY->campaignRegions->getByIndex(index);
  93. loadRegion();
  94. }
  95. void CampaignProperties::on_pushButtonRegionAdd_clicked()
  96. {
  97. int row = ui->tableWidgetRegions->rowCount();
  98. ui->tableWidgetRegions->insertRow(row);
  99. ui->tableWidgetRegions->setItem(row, 0, new QTableWidgetItem("INFIX"));
  100. ui->tableWidgetRegions->setItem(row, 1, new QTableWidgetItem(QString::number(0)));
  101. ui->tableWidgetRegions->setItem(row, 2, new QTableWidgetItem(QString::number(0)));
  102. ui->tableWidgetRegions->setItem(row, 3, new QTableWidgetItem(QString::number(-1)));
  103. ui->tableWidgetRegions->setItem(row, 4, new QTableWidgetItem(QString::number(-1)));
  104. }
  105. void CampaignProperties::on_pushButtonRegionRemove_clicked()
  106. {
  107. int rows = ui->tableWidgetRegions->rowCount() - 1;
  108. ui->tableWidgetRegions->removeRow(rows);
  109. ui->tableWidgetRegions->setRowCount(rows);
  110. }
  111. void CampaignProperties::on_checkBoxVideoRim_toggled(bool checked)
  112. {
  113. ui->lineEditVideoRim->setEnabled(checked);
  114. ui->lineEditVideoRim->setText(checked ? "" : "NONE");
  115. }
  116. void CampaignProperties::loadRegion()
  117. {
  118. ui->lineEditBackground->setText(QString::fromStdString(regions.campBackground.empty() ? regions.campPrefix + "_BG" : regions.campBackground));
  119. ui->lineEditSuffix1->setText(QString::fromStdString(regions.campSuffix.size() ? regions.campSuffix[0] : "En"));
  120. ui->lineEditSuffix2->setText(QString::fromStdString(regions.campSuffix.size() ? regions.campSuffix[1] : "Se"));
  121. ui->lineEditSuffix3->setText(QString::fromStdString(regions.campSuffix.size() ? regions.campSuffix[2] : "Co"));
  122. ui->lineEditPrefix->setText(QString::fromStdString(regions.campPrefix));
  123. ui->spinBoxColorSuffixLength->setValue(regions.colorSuffixLength);
  124. ui->tableWidgetRegions->clearContents();
  125. ui->tableWidgetRegions->setRowCount(0);
  126. ui->tableWidgetRegions->setColumnCount(5);
  127. ui->tableWidgetRegions->setHorizontalHeaderLabels({tr("Infix"), tr("X"), tr("Y"), tr("Label Pos X"), tr("Label Pos Y")});
  128. for (int i = 0; i < regions.regions.size(); ++i)
  129. {
  130. ui->tableWidgetRegions->insertRow(ui->tableWidgetRegions->rowCount());
  131. ui->tableWidgetRegions->setItem(i, 0, new QTableWidgetItem(QString::fromStdString(regions.regions[i].infix)));
  132. ui->tableWidgetRegions->setItem(i, 1, new QTableWidgetItem(QString::number(regions.regions[i].pos.x)));
  133. ui->tableWidgetRegions->setItem(i, 2, new QTableWidgetItem(QString::number(regions.regions[i].pos.y)));
  134. ui->tableWidgetRegions->setItem(i, 3, new QTableWidgetItem(QString::number(regions.regions[i].labelPos.has_value() ? (*regions.regions[i].labelPos).x : -1)));
  135. ui->tableWidgetRegions->setItem(i, 4, new QTableWidgetItem(QString::number(regions.regions[i].labelPos.has_value() ? (*regions.regions[i].labelPos).y : -1)));
  136. }
  137. ui->tableWidgetRegions->resizeColumnsToContents();
  138. }
  139. bool CampaignProperties::saveRegion()
  140. {
  141. regions.campBackground = ui->lineEditBackground->text().toStdString();
  142. if(regions.campSuffix.size() == 3)
  143. {
  144. regions.campSuffix[0] = ui->lineEditSuffix1->text().toStdString();
  145. regions.campSuffix[1] = ui->lineEditSuffix2->text().toStdString();
  146. regions.campSuffix[2] = ui->lineEditSuffix3->text().toStdString();
  147. }
  148. else
  149. {
  150. regions.campSuffix.push_back(ui->lineEditSuffix1->text().toStdString());
  151. regions.campSuffix.push_back(ui->lineEditSuffix2->text().toStdString());
  152. regions.campSuffix.push_back(ui->lineEditSuffix3->text().toStdString());
  153. }
  154. regions.campPrefix = ui->lineEditPrefix->text().toStdString();
  155. regions.colorSuffixLength = ui->spinBoxColorSuffixLength->value();
  156. regions.regions.clear();
  157. for (int i = 0; i < ui->tableWidgetRegions->rowCount(); ++i)
  158. {
  159. CampaignRegions::RegionDescription rd;
  160. rd.infix = ui->tableWidgetRegions->item(i, 0)->text().toStdString();
  161. rd.pos.x = ui->tableWidgetRegions->item(i, 1)->text().toInt();
  162. rd.pos.y = ui->tableWidgetRegions->item(i, 2)->text().toInt();
  163. auto labelX = ui->tableWidgetRegions->item(i, 3)->text().toInt();
  164. auto labelY = ui->tableWidgetRegions->item(i, 4)->text().toInt();
  165. if(labelX == -1 || labelY == -1)
  166. rd.labelPos = std::nullopt;
  167. else
  168. Point(labelX, labelY);
  169. regions.regions.push_back(rd);
  170. }
  171. if(campaignState->campaignRegions.regions.size() > regions.regions.size())
  172. {
  173. QMessageBox::StandardButton reply;
  174. reply = QMessageBox::question(this, tr("Fewer Scenarios"), tr("New Region setup supports fewer scenarios than before. Some will removed. Continue?"), QMessageBox::Yes|QMessageBox::No);
  175. if (reply != QMessageBox::Yes)
  176. return false;
  177. }
  178. campaignState->campaignRegions = regions;
  179. while(campaignState->scenarios.size() < campaignState->campaignRegions.regions.size())
  180. campaignState->scenarios.emplace(CampaignScenarioID(std::prev(campaignState->scenarios.end())->first + 1), CampaignScenario());
  181. while(campaignState->scenarios.size() > campaignState->campaignRegions.regions.size())
  182. {
  183. auto elem = std::prev(campaignState->scenarios.end());
  184. campaignState->mapPieces.erase(elem->first);
  185. campaignState->scenarios.erase(elem);
  186. }
  187. return true;
  188. }