1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-14 02:33:51 +02:00

Editor save & load template works

This commit is contained in:
Tomasz Zieliński 2024-02-29 20:05:20 +01:00
parent b7320bbc8a
commit 74bd6d6075
3 changed files with 143 additions and 14 deletions

View File

@ -69,6 +69,7 @@ QVariant toVariant(const JsonNode & node)
return QVariant(node.Bool()); return QVariant(node.Bool());
break; break;
case JsonNode::JsonType::DATA_FLOAT: case JsonNode::JsonType::DATA_FLOAT:
case JsonNode::JsonType::DATA_INTEGER:
return QVariant(node.Float()); return QVariant(node.Float());
break; break;
case JsonNode::JsonType::DATA_STRING: case JsonNode::JsonType::DATA_STRING:

View File

@ -17,7 +17,10 @@
#include "../lib/mapping/CMapEditManager.h" #include "../lib/mapping/CMapEditManager.h"
#include "../lib/mapping/MapFormat.h" #include "../lib/mapping/MapFormat.h"
#include "../lib/CGeneralTextHandler.h" #include "../lib/CGeneralTextHandler.h"
#include "../lib/serializer/JsonSerializer.h"
#include "../lib/serializer/JsonDeserializer.h"
#include "jsonutils.h"
#include "windownewmap.h" #include "windownewmap.h"
#include "ui_windownewmap.h" #include "ui_windownewmap.h"
#include "mainwindow.h" #include "mainwindow.h"
@ -52,34 +55,142 @@ WindowNewMap::WindowNewMap(QWidget *parent) :
ui->cpuTeamsCombo->setItemData(i, QVariant(cpuPlayers.at(i))); ui->cpuTeamsCombo->setItemData(i, QVariant(cpuPlayers.at(i)));
} }
for(auto * combo : {ui->humanCombo, ui->cpuCombo, ui->humanTeamsCombo, ui->cpuTeamsCombo})
combo->setCurrentIndex(0);
loadUserSettings(); bool useLoaded = loadUserSettings();
if (!useLoaded)
{
// FIXME This will change the teams, and map sizes as well
for(auto * combo : {ui->humanCombo, ui->cpuCombo, ui->humanTeamsCombo, ui->cpuTeamsCombo})
combo->setCurrentIndex(0);
}
show(); show();
//setup initial parameters if (!useLoaded)
int width = ui->widthTxt->text().toInt(); {
int height = ui->heightTxt->text().toInt(); //setup initial parameters
mapGenOptions.setWidth(width ? width : 1); int width = ui->widthTxt->text().toInt();
mapGenOptions.setHeight(height ? height : 1); int height = ui->heightTxt->text().toInt();
bool twoLevel = ui->twoLevelCheck->isChecked(); mapGenOptions.setWidth(width ? width : 1);
mapGenOptions.setHasTwoLevels(twoLevel); mapGenOptions.setHeight(height ? height : 1);
updateTemplateList(); bool twoLevel = ui->twoLevelCheck->isChecked();
mapGenOptions.setHasTwoLevels(twoLevel);
// FIXME: Do not reset loaded template
updateTemplateList();
}
} }
WindowNewMap::~WindowNewMap() WindowNewMap::~WindowNewMap()
{ {
saveUserSettings();
delete ui; delete ui;
} }
void WindowNewMap::loadUserSettings() bool WindowNewMap::loadUserSettings()
{ {
bool ret = false;
CRmgTemplate * templ = nullptr;
//load window settings //load window settings
QSettings s(Ui::teamName, Ui::appName); QSettings s(Ui::teamName, Ui::appName);
auto generateRandom = s.value(newMapGenerateRandom);
if (generateRandom.isValid())
{
ui->randomMapCheck->setChecked(generateRandom.toBool());
}
auto settings = s.value(newMapWindow);
if (settings.isValid())
{
mapGenOptions = CMapGenOptions();
auto node = JsonUtils::toJson(settings);
JsonDeserializer handler(nullptr, node);
handler.serializeStruct("lastSettings", mapGenOptions);
templ = const_cast<CRmgTemplate*>(mapGenOptions.getMapTemplate()); // Remember for later
ui->widthTxt->setText(QString::number(mapGenOptions.getWidth()));
ui->heightTxt->setText(QString::number(mapGenOptions.getHeight()));
for(auto & sz : mapSizes)
{
if(sz.second.first == mapGenOptions.getWidth() &&
sz.second.second == mapGenOptions.getHeight())
{
ui->sizeCombo->setCurrentIndex(sz.first);
break;
}
}
ui->twoLevelCheck->setChecked(mapGenOptions.getHasTwoLevels());
auto humanComboIndex = mapGenOptions.getHumanOrCpuPlayerCount();
if (humanComboIndex == CMapGenOptions::RANDOM_SIZE)
{
humanComboIndex = 0;
}
ui->humanCombo->setCurrentIndex(humanComboIndex);
//Can't be 0
ui->cpuCombo->setCurrentIndex(mapGenOptions.getCompOnlyPlayerCount());
ui->humanTeamsCombo->setCurrentIndex(mapGenOptions.getTeamCount());
ui->cpuTeamsCombo->setCurrentIndex(mapGenOptions.getCompOnlyTeamCount());
switch (mapGenOptions.getWaterContent())
{
case EWaterContent::RANDOM:
ui->waterOpt1->setChecked(true); break;
case EWaterContent::NONE:
ui->waterOpt2->setChecked(true); break;
case EWaterContent::NORMAL:
ui->waterOpt3->setChecked(true); break;
case EWaterContent::ISLANDS:
ui->waterOpt4->setChecked(true); break;
}
switch (mapGenOptions.getMonsterStrength())
{
case EMonsterStrength::RANDOM:
ui->monsterOpt1->setChecked(true); break;
case EMonsterStrength::GLOBAL_WEAK:
ui->monsterOpt2->setChecked(true); break;
case EMonsterStrength::GLOBAL_NORMAL:
ui->monsterOpt3->setChecked(true); break;
case EMonsterStrength::GLOBAL_STRONG:
ui->monsterOpt4->setChecked(true); break;
}
ret = true;
}
// FIXME: This cleans the list absolutely, and removes any template set
updateTemplateList();
mapGenOptions.setMapTemplate(templ); // Can be null
if (templ)
{
std::string name = templ->getId();
for (size_t i = 0; i < ui->templateCombo->count(); i++)
{
auto * t = data_cast<const CRmgTemplate>(ui->templateCombo->itemData(i).toLongLong());
if (t && t->getId() == name)
{
ui->templateCombo->setCurrentIndex(i);
break;
}
/*
// FIXME: It is serialized with a scope
if (ui->templateCombo->itemText(i).toStdString() == name)
{
ui->templateCombo->setCurrentIndex(i);
break;
}
*/
}
ret = true;
}
/*
auto width = s.value(newMapWidth); auto width = s.value(newMapWidth);
if (width.isValid()) if (width.isValid())
{ {
@ -175,11 +286,23 @@ void WindowNewMap::loadUserSettings()
//Display problem on status bar //Display problem on status bar
} }
} }
*/
} }
void WindowNewMap::saveUserSettings() void WindowNewMap::saveUserSettings()
{ {
QSettings s(Ui::teamName, Ui::appName); QSettings s(Ui::teamName, Ui::appName);
JsonNode data;
JsonSerializer ser(nullptr, data);
ser.serializeStruct("lastSettings", mapGenOptions);
auto variant = JsonUtils::toVariant(data);
s.setValue(newMapWindow, variant);
s.setValue(newMapGenerateRandom, ui->randomMapCheck->isChecked());
/*
s.setValue(newMapWidth, ui->widthTxt->text().toInt()); s.setValue(newMapWidth, ui->widthTxt->text().toInt());
s.setValue(newMapHeight, ui->heightTxt->text().toInt()); s.setValue(newMapHeight, ui->heightTxt->text().toInt());
s.setValue(newMapTwoLevel, ui->twoLevelCheck->isChecked()); s.setValue(newMapTwoLevel, ui->twoLevelCheck->isChecked());
@ -217,6 +340,7 @@ void WindowNewMap::saveUserSettings()
{ {
s.setValue(newMapTemplate, templateName); s.setValue(newMapTemplate, templateName);
} }
*/
} }
void WindowNewMap::saveOptions(const CMapGenOptions & options) void WindowNewMap::saveOptions(const CMapGenOptions & options)
@ -232,6 +356,7 @@ void WindowNewMap::loadOptions()
void WindowNewMap::on_cancelButton_clicked() void WindowNewMap::on_cancelButton_clicked()
{ {
saveUserSettings();
close(); close();
} }
@ -278,6 +403,8 @@ void WindowNewMap::on_okButton_clicked()
mapGenOptions.setWaterContent(water); mapGenOptions.setWaterContent(water);
mapGenOptions.setMonsterStrength(monster); mapGenOptions.setMonsterStrength(monster);
saveUserSettings();
std::unique_ptr<CMap> nmap; std::unique_ptr<CMap> nmap;
if(ui->randomMapCheck->isChecked()) if(ui->randomMapCheck->isChecked())
{ {

View File

@ -23,6 +23,7 @@ class WindowNewMap : public QDialog, public MapGenOptionsSaver
{ {
Q_OBJECT Q_OBJECT
const QString newMapWindow = "NewMapWindow/Settings";
const QString newMapWidth = "NewMapWindow/Width"; const QString newMapWidth = "NewMapWindow/Width";
const QString newMapHeight = "NewMapWindow/Height"; const QString newMapHeight = "NewMapWindow/Height";
const QString newMapTwoLevel = "NewMapWindow/TwoLevel"; const QString newMapTwoLevel = "NewMapWindow/TwoLevel";
@ -109,7 +110,7 @@ private:
void updateTemplateList(); void updateTemplateList();
void loadUserSettings(); bool loadUserSettings();
void saveUserSettings(); void saveUserSettings();
void saveOptions(const CMapGenOptions & options) override; void saveOptions(const CMapGenOptions & options) override;