Files
vcmi/mapeditor/campaigneditor/campaignproperties.cpp
T

198 lines
8.3 KiB
C++
Raw Normal View History

2025-03-23 19:52:21 +01:00
/*
* campaignproperties.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "campaignproperties.h"
#include "ui_campaignproperties.h"
#include "../../lib/GameLibrary.h"
#include "../../lib/texts/CGeneralTextHandler.h"
#include "../../lib/campaign/CampaignState.h"
#include "../../lib/constants/StringConstants.h"
2025-04-10 21:04:24 +02:00
#include "../../lib/json/JsonNode.h"
2025-03-23 19:52:21 +01:00
CampaignProperties::CampaignProperties(std::shared_ptr<CampaignState> campaignState):
ui(new Ui::CampaignProperties),
campaignState(campaignState),
regions(campaignState->campaignRegions)
{
ui->setupUi(this);
setWindowTitle(tr("Campaign Properties"));
setWindowModality(Qt::ApplicationModal);
ui->lineEditName->setText(QString::fromStdString(campaignState->name.toString()));
ui->textEditDescription->setText(QString::fromStdString(campaignState->description.toString()));
ui->lineEditAuthor->setText(QString::fromStdString(campaignState->author.toString()));
ui->lineEditAuthorContact->setText(QString::fromStdString(campaignState->authorContact.toString()));
ui->dateTimeEditCreationDateTime->setDateTime(QDateTime::fromSecsSinceEpoch(campaignState->creationDateTime));
ui->lineEditCampaignVersion->setText(QString::fromStdString(campaignState->campaignVersion.toString()));
ui->lineEditMusic->setText(QString::fromStdString(campaignState->music.getName()));
ui->checkBoxScenarioDifficulty->setChecked(campaignState->difficultyChosenByPlayer);
2025-04-10 21:04:24 +02:00
const JsonNode legacyRegionConfig(JsonPath::builtin("config/campaign_regions.json"));
int legacyRegionNumber = legacyRegionConfig["campaign_regions"].Vector().size();
for (int i = 0; i < legacyRegionNumber; i++)
2025-03-23 19:52:21 +01:00
ui->comboBoxRegionPreset->insertItem(i, QString::fromStdString(LIBRARY->generaltexth->translate("core.camptext.names", i)));
2025-04-10 21:04:24 +02:00
ui->comboBoxRegionPreset->insertItem(legacyRegionNumber, tr("Custom"));
2025-03-23 19:52:21 +01:00
ui->comboBoxRegionPreset->setCurrentIndex(20);
loadRegion();
show();
}
CampaignProperties::~CampaignProperties()
{
delete ui;
}
bool CampaignProperties::showCampaignProperties(std::shared_ptr<CampaignState> campaignState)
{
if(!campaignState)
return false;
auto * dialog = new CampaignProperties(campaignState);
dialog->setAttribute(Qt::WA_DeleteOnClose);
return dialog->exec() == QDialog::Accepted;
}
void CampaignProperties::on_buttonBox_clicked(QAbstractButton * button)
{
if(button == ui->buttonBox->button(QDialogButtonBox::Ok))
{
if(!saveRegion())
return;
campaignState->name = MetaString::createFromRawString(ui->lineEditName->text().toStdString());
campaignState->description = MetaString::createFromRawString(ui->textEditDescription->toPlainText().toStdString());
campaignState->author = MetaString::createFromRawString(ui->lineEditAuthor->text().toStdString());
campaignState->authorContact = MetaString::createFromRawString(ui->lineEditAuthorContact->text().toStdString());
campaignState->creationDateTime = ui->dateTimeEditCreationDateTime->dateTime().toSecsSinceEpoch();
campaignState->campaignVersion = MetaString::createFromRawString(ui->lineEditCampaignVersion->text().toStdString());
campaignState->music = AudioPath::builtin(ui->lineEditMusic->text().toStdString());
campaignState->difficultyChosenByPlayer = ui->checkBoxScenarioDifficulty->isChecked();
accept();
}
close();
}
void CampaignProperties::on_comboBoxRegionPreset_currentIndexChanged(int index)
{
if(ui->comboBoxRegionPreset->count() == 21 && ui->comboBoxRegionPreset->currentIndex() != 20)
regions = CampaignRegions::getLegacy(ui->comboBoxRegionPreset->currentIndex());
loadRegion();
}
void CampaignProperties::on_pushButtonRegionAdd_clicked()
{
int row = ui->tableWidgetRegions->rowCount();
ui->tableWidgetRegions->insertRow(row);
ui->tableWidgetRegions->setItem(row, 0, new QTableWidgetItem("INFIX"));
ui->tableWidgetRegions->setItem(row, 1, new QTableWidgetItem(QString::number(0)));
ui->tableWidgetRegions->setItem(row, 2, new QTableWidgetItem(QString::number(0)));
ui->tableWidgetRegions->setItem(row, 3, new QTableWidgetItem(QString::number(-1)));
ui->tableWidgetRegions->setItem(row, 4, new QTableWidgetItem(QString::number(-1)));
}
void CampaignProperties::on_pushButtonRegionRemove_clicked()
{
int rows = ui->tableWidgetRegions->rowCount() - 1;
ui->tableWidgetRegions->removeRow(rows);
ui->tableWidgetRegions->setRowCount(rows);
}
void CampaignProperties::loadRegion()
{
ui->lineEditBackground->setText(QString::fromStdString(regions.campBackground.empty() ? regions.campPrefix + "_BG" : regions.campBackground));
ui->lineEditSuffix1->setText(QString::fromStdString(regions.campSuffix.size() ? regions.campSuffix[0] : "En"));
ui->lineEditSuffix2->setText(QString::fromStdString(regions.campSuffix.size() ? regions.campSuffix[1] : "Se"));
ui->lineEditSuffix3->setText(QString::fromStdString(regions.campSuffix.size() ? regions.campSuffix[2] : "Co"));
ui->lineEditPrefix->setText(QString::fromStdString(regions.campPrefix));
ui->spinBoxColorSuffixLength->setValue(regions.colorSuffixLength);
ui->tableWidgetRegions->clearContents();
ui->tableWidgetRegions->setRowCount(0);
ui->tableWidgetRegions->setColumnCount(5);
ui->tableWidgetRegions->setHorizontalHeaderLabels({tr("Infix"), tr("X"), tr("Y"), tr("Label Pos X"), tr("Label Pos Y")});
for (int i = 0; i < regions.regions.size(); ++i)
{
ui->tableWidgetRegions->insertRow(ui->tableWidgetRegions->rowCount());
ui->tableWidgetRegions->setItem(i, 0, new QTableWidgetItem(QString::fromStdString(regions.regions[i].infix)));
ui->tableWidgetRegions->setItem(i, 1, new QTableWidgetItem(QString::number(regions.regions[i].pos.x)));
ui->tableWidgetRegions->setItem(i, 2, new QTableWidgetItem(QString::number(regions.regions[i].pos.y)));
ui->tableWidgetRegions->setItem(i, 3, new QTableWidgetItem(QString::number(regions.regions[i].labelPos.has_value() ? (*regions.regions[i].labelPos).x : -1)));
ui->tableWidgetRegions->setItem(i, 4, new QTableWidgetItem(QString::number(regions.regions[i].labelPos.has_value() ? (*regions.regions[i].labelPos).y : -1)));
}
ui->tableWidgetRegions->resizeColumnsToContents();
}
bool CampaignProperties::saveRegion()
{
regions.campBackground = ui->lineEditBackground->text().toStdString();
if(regions.campSuffix.size() == 3)
{
regions.campSuffix[0] = ui->lineEditSuffix1->text().toStdString();
regions.campSuffix[1] = ui->lineEditSuffix2->text().toStdString();
regions.campSuffix[2] = ui->lineEditSuffix3->text().toStdString();
}
else
{
regions.campSuffix.push_back(ui->lineEditSuffix1->text().toStdString());
regions.campSuffix.push_back(ui->lineEditSuffix2->text().toStdString());
regions.campSuffix.push_back(ui->lineEditSuffix3->text().toStdString());
}
regions.campPrefix = ui->lineEditPrefix->text().toStdString();
regions.colorSuffixLength = ui->spinBoxColorSuffixLength->value();
regions.regions.clear();
for (int i = 0; i < ui->tableWidgetRegions->rowCount(); ++i)
{
CampaignRegions::RegionDescription rd;
rd.infix = ui->tableWidgetRegions->item(i, 0)->text().toStdString();
rd.pos.x = ui->tableWidgetRegions->item(i, 1)->text().toInt();
rd.pos.y = ui->tableWidgetRegions->item(i, 2)->text().toInt();
auto labelX = ui->tableWidgetRegions->item(i, 3)->text().toInt();
auto labelY = ui->tableWidgetRegions->item(i, 4)->text().toInt();
if(labelX == -1 || labelY == -1)
rd.labelPos = std::nullopt;
else
Point(labelX, labelY);
regions.regions.push_back(rd);
}
if(campaignState->campaignRegions.regions.size() > regions.regions.size())
{
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, tr("Fewer Scenarios"), tr("New Region setup supports fewer scenarios than before. Some will removed. Continue?"), QMessageBox::Yes|QMessageBox::No);
if (reply != QMessageBox::Yes)
return false;
}
campaignState->campaignRegions = regions;
while(campaignState->scenarios.size() < campaignState->campaignRegions.regions.size())
campaignState->scenarios.emplace(CampaignScenarioID(std::prev(campaignState->scenarios.end())->first + 1), CampaignScenario());
while(campaignState->scenarios.size() > campaignState->campaignRegions.regions.size())
{
auto elem = std::prev(campaignState->scenarios.end());
campaignState->mapPieces.erase(elem->first);
campaignState->scenarios.erase(elem);
}
return true;
}