From b2c98a8eb627976454e1a1df2cac352879d6398f Mon Sep 17 00:00:00 2001 From: SimplyLiz Date: Tue, 19 Jan 2021 20:52:49 +0100 Subject: [PATCH 01/25] update ui dialog --- src/TileDataUI.ui | 351 +++++++++++++++++++++++++++++++++++-------- src/TileSetDataUI.ui | 4 +- 2 files changed, 289 insertions(+), 66 deletions(-) diff --git a/src/TileDataUI.ui b/src/TileDataUI.ui index 3a2bf05..e5d22f0 100644 --- a/src/TileDataUI.ui +++ b/src/TileDataUI.ui @@ -7,8 +7,8 @@ 0 0 - 792 - 678 + 1033 + 811 @@ -46,7 +46,17 @@ - + + + + Subcategory + + + + + + + @@ -60,102 +70,315 @@ - - - Title - - - - - - - The items title. It's shown ingame and in the editors tree-view - - - - Description - + Description of the item that is shown in it's details - - + + - Author + Tags - - - - Author of this item - - + + - - + + - Power production - - - - - - - Power production of this item. Negative values means power consumption. + GroundDecoration - + - Water production + Biomes - - - Water production of this item. Negative values means power consumption. - - + + + + + + + + + + + + + + Build cost + + + + + + + Wealth + + + + + + + RequiredTiles + + + + + + + Author of this item + + + + + + + Education + + + + + + + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + x + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + + + + + + + The items title. It's shown ingame and in the editors tree-view + + + + + + + Inhabitants + + + + + + + Water production + + + + + + + + + placeOnGround + + + + + + + placeOnWater + + + + + + + isOverPlacable + + + + + + + + + Happyness + + + + + + + Upkeep cost + + + + + + + Author + + + + + + + Crime + + + + + + + Water production of this item. Negative values means power consumption. + + + + + + + Zones + + + + + + + Power production + + + + + + + Monthly upkeep cost + + + + + + + Power production of this item. Negative values means power consumption. + + + + + + + Buildcost + + + + + + + Title + + + + + + + + + + Pollution + + + + + + + FireHazard + + + + + + + + + + + + + + + + + + + - + - Upkeep cost + Styles - - - Monthly upkeep cost - - - - - - - Build cost - - + - - - - Buildcost - - + + diff --git a/src/TileSetDataUI.ui b/src/TileSetDataUI.ui index 0f6724e..4119474 100644 --- a/src/TileSetDataUI.ui +++ b/src/TileSetDataUI.ui @@ -202,8 +202,8 @@ 0 0 - 680 - 138 + 709 + 109 From e85dc999c9a8e0866c9a42eee1bd8efdc2f23fbc Mon Sep 17 00:00:00 2001 From: SimplyLiz Date: Tue, 19 Jan 2021 20:53:10 +0100 Subject: [PATCH 02/25] wire up some of the new parameters --- src/TileDataContainer.cxx | 236 ++++++++++++++++++++++---------------- src/TileDataContainer.hxx | 4 +- src/TileDataUI.cxx | 29 ++++- 3 files changed, 170 insertions(+), 99 deletions(-) diff --git a/src/TileDataContainer.cxx b/src/TileDataContainer.cxx index 1dbd5d8..c8b3acd 100644 --- a/src/TileDataContainer.cxx +++ b/src/TileDataContainer.cxx @@ -6,138 +6,180 @@ //-------------------------------------------------------------------------------- -bool TileDataContainer::hasTileData(const QString &id) const { return tileData.contains(id); } +bool TileDataContainer::hasTileData(const QString& id) const { return tileData.contains(id); } //-------------------------------------------------------------------------------- -TileData TileDataContainer::getTileData(const QString &id) const +TileData TileDataContainer::getTileData(const QString& id) const { - if (!tileData.contains(id)) - return TileData(); + if (!tileData.contains(id)) + return TileData(); - return tileData[id]; + return tileData[id]; } //-------------------------------------------------------------------------------- -QString TileDataContainer::loadFile(const QString &theFileName) +QString TileDataContainer::loadFile(const QString& theFileName) { - fileName = theFileName; - tileData.clear(); - - QFile file(fileName); - if (!file.exists()) - return QString(); - - if (!file.open(QIODevice::ReadOnly)) - return file.errorString(); - - QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); - if (doc.isNull() || !doc.isArray()) - return tr("Illegal file content"); - - for (const QJsonValue &value : doc.array()) - { - QJsonObject obj = value.toObject(); - - TileData tile; - QString id = obj.value("id").toString(); - tile.id = id.toStdString(); - tile.category = obj.value("category").toString().toStdString(); - tile.title = obj.value("title").toString().toStdString(); - tile.description = obj.value("description").toString().toStdString(); - tile.author = obj.value("author").toString().toStdString(); - tile.price = obj.value("price").toInt(); - tile.upkeepCost = obj.value("upkeep cost").toInt(); - tile.power = obj.value("power").toInt(); - tile.water = obj.value("water").toInt(); - - tileSetDataFromJson(tile.tiles, obj.value("tiles")); - tileSetDataFromJson(tile.shoreTiles, obj.value("shoreTiles")); - tileSetDataFromJson(tile.slopeTiles, obj.value("slopeTiles")); - - tileData.insert(id, tile); - } - - return QString(); + fileName = theFileName; + tileData.clear(); + + QFile file(fileName); + if (!file.exists()) + return QString(); + + if (!file.open(QIODevice::ReadOnly)) + return file.errorString(); + + QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); + if (doc.isNull() || !doc.isArray()) + return tr("Illegal file content"); + + for (const QJsonValue& value : doc.array()) + { + QJsonObject obj = value.toObject(); + + TileData tile; + QString id = obj.value("id").toString(); + tile.id = id.toStdString(); + tile.category = obj.value("category").toString().toStdString(); + tile.subCategory = obj.value("subCategory").toString().toStdString(); + tile.title = obj.value("title").toString().toStdString(); + tile.description = obj.value("description").toString().toStdString(); + tile.author = obj.value("author").toString().toStdString(); + tile.price = obj.value("price").toInt(); + tile.upkeepCost = obj.value("upkeep cost").toInt(); + tile.power = obj.value("power").toInt(); + tile.water = obj.value("water").toInt(); + tile.inhabitants = obj.value("inhabitants").toInt(); + tile.pollutionLevel = obj.value("pollutionLevel").toInt(); + tile.happyness = obj.value("happyness").toInt(); + tile.fireHazardLevel = obj.value("fireHazardLevel").toInt(); + tile.educationLevel = obj.value("educationLevel").toInt(); + tile.crimeLevel = obj.value("crimeLevel").toInt(); + tile.isOverPlacable = obj.value("isOverPlacable").toBool(); + tile.placeOnGround = obj.value("placeOnGround").toBool(); + tile.placeOnWater = obj.value("placeOnWater").toBool(); + + requiredTilesFromJson(tile.RequiredTiles, obj.value("RequiredTiles")); + + tileSetDataFromJson(tile.tiles, obj.value("tiles")); + tileSetDataFromJson(tile.shoreTiles, obj.value("shoreTiles")); + tileSetDataFromJson(tile.slopeTiles, obj.value("slopeTiles")); + + tileData.insert(id, tile); + } + + return QString(); } //-------------------------------------------------------------------------------- -void TileDataContainer::tileSetDataFromJson(TileSetData &data, const QJsonValue &value) +void TileDataContainer::tileSetDataFromJson(TileSetData& data, const QJsonValue& value) { - QJsonObject obj = value.toObject(); + QJsonObject obj = value.toObject(); - data.fileName = obj.value("fileName").toString().toStdString(); - data.count = obj.value("count").toInt(); - data.clippingWidth = obj.value("clip_width").toInt(); - data.clippingHeight = obj.value("clip_height").toInt(); + data.fileName = obj.value("fileName").toString().toStdString(); + data.count = obj.value("count").toInt(); + data.clippingWidth = obj.value("clip_width").toInt(); + data.clippingHeight = obj.value("clip_height").toInt(); } +void TileDataContainer::requiredTilesFromJson(RequiredTilesData& data, const QJsonValue& value) +{ + QJsonObject obj = value.toObject(); + + data.width = static_cast(obj.value("width").toInt()); + data.height= static_cast(obj.value("height").toInt()); +} + + //-------------------------------------------------------------------------------- bool TileDataContainer::saveFile() { - QJsonDocument doc; - QJsonArray array; - - for (const TileData &tile : tileData) - { - QJsonObject obj; - obj.insert("id", QString::fromStdString(tile.id)); - obj.insert("category", QString::fromStdString(tile.category)); - obj.insert("title", QString::fromStdString(tile.title)); - obj.insert("description", QString::fromStdString(tile.description)); - obj.insert("author", QString::fromStdString(tile.author)); - obj.insert("price", tile.price); - obj.insert("upkeep cost", tile.upkeepCost); - obj.insert("power", tile.power); - obj.insert("water", tile.water); - - if (!tile.tiles.fileName.empty()) - obj.insert("tiles", tileSetDataToJson(tile.tiles)); - - if (!tile.shoreTiles.fileName.empty()) - obj.insert("shoreTiles", tileSetDataToJson(tile.shoreTiles)); - - if (!tile.slopeTiles.fileName.empty()) - obj.insert("slopeTiles", tileSetDataToJson(tile.slopeTiles)); - - array.append(obj); - } - - doc.setArray(array); - - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly)) - { - // error handling - return false; - } - file.write(doc.toJson()); - return true; + QJsonDocument doc; + QJsonArray array; + + for (const TileData& tile : tileData) + { + QJsonObject obj; + obj.insert("id", QString::fromStdString(tile.id)); + obj.insert("category", QString::fromStdString(tile.category)); + obj.insert("subCategory", QString::fromStdString(tile.subCategory)); + obj.insert("title", QString::fromStdString(tile.title)); + obj.insert("description", QString::fromStdString(tile.description)); + obj.insert("author", QString::fromStdString(tile.author)); + obj.insert("price", tile.price); + obj.insert("upkeep cost", tile.upkeepCost); + obj.insert("power", tile.power); + obj.insert("water", tile.water); + obj.insert("inhabitants", tile.inhabitants); + obj.insert("pollutionLevel", tile.pollutionLevel); + obj.insert("happyness", tile.happyness); + obj.insert("fireHazardLevel", tile.fireHazardLevel); + obj.insert("educationLevel", tile.educationLevel); + obj.insert("crimeLevel", tile.crimeLevel); + obj.insert("isOverPlacable", tile.isOverPlacable); + obj.insert("placeOnGround", tile.placeOnGround); + obj.insert("placeOnWater", tile.placeOnWater); + + obj.insert("RequiredTiles", requiredTilesToJson(tile.RequiredTiles)); + + if (!tile.tiles.fileName.empty()) + obj.insert("tiles", tileSetDataToJson(tile.tiles)); + + if (!tile.shoreTiles.fileName.empty()) + obj.insert("shoreTiles", tileSetDataToJson(tile.shoreTiles)); + + if (!tile.slopeTiles.fileName.empty()) + obj.insert("slopeTiles", tileSetDataToJson(tile.slopeTiles)); + + array.append(obj); + } + + doc.setArray(array); + + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly)) + { + // error handling + return false; + } + file.write(doc.toJson()); + return true; } //-------------------------------------------------------------------------------- -QJsonObject TileDataContainer::tileSetDataToJson(const TileSetData &data) +QJsonObject TileDataContainer::tileSetDataToJson(const TileSetData& data) { - QJsonObject obj; + QJsonObject obj; - obj.insert("fileName", QString::fromStdString(data.fileName)); - obj.insert("count", data.count); - obj.insert("clip_width", data.clippingWidth); - obj.insert("clip_height", data.clippingHeight); + obj.insert("fileName", QString::fromStdString(data.fileName)); + obj.insert("count", data.count); + obj.insert("clip_width", data.clippingWidth); + obj.insert("clip_height", data.clippingHeight); + + return obj; +} + +QJsonObject TileDataContainer::requiredTilesToJson(const RequiredTilesData& data) +{ + QJsonObject obj; + obj.insert("width", static_cast(data.width)); + obj.insert("height", static_cast(data.height)); - return obj; + return obj; } //-------------------------------------------------------------------------------- -void TileDataContainer::removeTileData(const QString &id) { tileData.remove(id); } +void TileDataContainer::removeTileData(const QString& id) { tileData.remove(id); } //-------------------------------------------------------------------------------- -void TileDataContainer::addTileData(const TileData &tile) { tileData.insert(QString::fromStdString(tile.id), tile); } +void TileDataContainer::addTileData(const TileData& tile) { tileData.insert(QString::fromStdString(tile.id), tile); } //-------------------------------------------------------------------------------- diff --git a/src/TileDataContainer.hxx b/src/TileDataContainer.hxx index 15bb8c8..b27d427 100644 --- a/src/TileDataContainer.hxx +++ b/src/TileDataContainer.hxx @@ -25,7 +25,9 @@ public: private: void tileSetDataFromJson(TileSetData &data, const QJsonValue &value); - QJsonObject tileSetDataToJson(const TileSetData &data); + void requiredTilesFromJson(RequiredTilesData& data, const QJsonValue &value); + QJsonObject tileSetDataToJson(const TileSetData& data); + QJsonObject requiredTilesToJson(const RequiredTilesData& data); private: QString fileName; diff --git a/src/TileDataUI.cxx b/src/TileDataUI.cxx index 7278346..858bb0b 100644 --- a/src/TileDataUI.cxx +++ b/src/TileDataUI.cxx @@ -32,12 +32,16 @@ TileDataUI::TileDataUI() ui.id->setMaxLength(TD_ID_MAX_CHARS); ui.category->setMaxLength(TD_CATEGORY_MAX_CHARS); + ui.subCategory->setMaxLength(TD_SUBCATEGORY_MAX_CHARS); ui.title->setMaxLength(TD_TITLE_MAX_CHARS); ui.author->setMaxLength(TD_AUTHOR_MAX_CHARS); ui.buildCost->setRange(TD_PRICE_MIN, TD_PRICE_MAX); ui.upkeepCost->setRange(TD_UPKEEP_MIN, TD_UPKEEP_MAX); ui.powerProduction->setRange(TD_POWER_MIN, TD_POWER_MAX); ui.waterProduction->setRange(TD_WATER_MIN, TD_WATER_MAX); + ui.requiredTilesHeight->setRange(TD_REQUIREDTILES_MIN, TD_REQUIREDTILES_MAX); + ui.requiredTilesWidth->setRange(TD_REQUIREDTILES_MIN, TD_REQUIREDTILES_MAX); + w = new QWidget; tilesSet.setupUi(w); @@ -346,14 +350,25 @@ void TileDataUI::writeToTileData(TileData &tile) { tile.id = ui.id->text().toStdString(); tile.category = ui.category->text().toStdString(); + tile.subCategory = ui.subCategory->text().toStdString(); tile.title = ui.title->text().toStdString(); tile.description = ui.description->toPlainText().toStdString(); tile.author = ui.author->text().toStdString(); - tile.power = ui.powerProduction->value(); tile.water = ui.waterProduction->value(); tile.upkeepCost = ui.upkeepCost->value(); tile.price = ui.buildCost->value(); + tile.inhabitants = ui.inhabitants->value(); + tile.pollutionLevel = ui.pollutionLevel->value(); + tile.fireHazardLevel = ui.fireHazardLevel->value(); + tile.educationLevel = ui.educationLevel->value(); + tile.crimeLevel = ui.crimeLevel->value(); + tile.happyness = ui.happyness->value(); + tile.isOverPlacable = ui.isOverPlacable->checkState(); + tile.placeOnGround = ui.placeOnGround->checkState(); + tile.placeOnWater = ui.placeOnWater->checkState(); + tile.RequiredTiles.height = static_cast(ui.requiredTilesHeight->value()); + tile.RequiredTiles.width = static_cast(ui.requiredTilesWidth->value()); readTileSetDataWidget(tilesSet, tile.tiles); readTileSetDataWidget(cornerSet, tile.shoreTiles); @@ -369,6 +384,7 @@ void TileDataUI::readFromTileData(const TileData &tile) { ui.id->setText(QString::fromStdString(tile.id)); ui.category->setText(QString::fromStdString(tile.category)); + ui.subCategory->setText(QString::fromStdString(tile.subCategory)); ui.title->setText(QString::fromStdString(tile.title)); ui.description->setPlainText(QString::fromStdString(tile.description)); ui.author->setText(QString::fromStdString(tile.author)); @@ -377,6 +393,17 @@ void TileDataUI::readFromTileData(const TileData &tile) ui.waterProduction->setValue(tile.water); ui.upkeepCost->setValue(tile.upkeepCost); ui.buildCost->setValue(tile.price); + ui.inhabitants->setValue(tile.inhabitants); + ui.pollutionLevel->setValue(tile.pollutionLevel); + ui.fireHazardLevel->setValue(tile.fireHazardLevel); + ui.educationLevel->setValue(tile.educationLevel); + ui.crimeLevel->setValue(tile.crimeLevel); + ui.happyness->setValue(tile.happyness); + ui.isOverPlacable->setChecked(tile.isOverPlacable); + ui.placeOnWater->setChecked(tile.placeOnWater); + ui.placeOnGround->setChecked(tile.placeOnGround); + ui.requiredTilesHeight->setValue(tile.RequiredTiles.height); + ui.requiredTilesWidth->setValue(tile.RequiredTiles.width); fillTileSetDataWidget(tilesSet, tile.tiles); fillTileSetDataWidget(cornerSet, tile.shoreTiles); From 9af45a28237e235a7ea28886021414f85fc7fcc6 Mon Sep 17 00:00:00 2001 From: SimplyLiz Date: Wed, 20 Jan 2021 21:56:33 +0100 Subject: [PATCH 03/25] add helper functions for converting comma-seperated strings to vector and vice versa --- src/helpers.hxx | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/helpers.hxx diff --git a/src/helpers.hxx b/src/helpers.hxx new file mode 100644 index 0000000..21c7cd4 --- /dev/null +++ b/src/helpers.hxx @@ -0,0 +1,52 @@ +#ifndef HELPERS_HXX_ +#define HELPERS_HXX_ + +#include +#include +#include + +//void commaSeperatedStringToVector(const std::string& str, std::vector& tokens, const std::string& delimiters = ","); + +//-------------------------------------------------------------------------------- + static void commaSeperatedStringToVector(const std::string& inputString, std::vector& outputVector, const std::string& delimiter = ",") +{ + outputVector.clear(); + // Skip delimiters at beginning. + std::string::size_type lastPos = inputString.find_first_not_of(delimiter, 0); + + // Find first non-delimiter. + std::string::size_type pos = inputString.find_first_of(delimiter, lastPos); + + while (std::string::npos != pos || std::string::npos != lastPos) { + // Found a token, add it to the vector. + outputVector.push_back(inputString.substr(lastPos, pos - lastPos)); + + // Skip delimiters. + lastPos = inputString.find_first_not_of(delimiter, pos); + + // Find next non-delimiter. + pos = inputString.find_first_of(delimiter, lastPos); + } +} + +//-------------------------------------------------------------------------------- + + static std::string commaSeperateVector(const std::vector& inputVector, const char* const delimiter = ",") + { + switch (inputVector.size()) + { + case 0: + return ""; + case 1: + return inputVector[0]; + default: + std::ostringstream os; + std::copy(inputVector.begin(), inputVector.end() - 1, std::ostream_iterator(os, delimiter)); + os << *inputVector.rbegin(); + return os.str(); + } + } + +//-------------------------------------------------------------------------------- + +#endif \ No newline at end of file From 575f130da443e569e44406acc60433d6a11b99ee Mon Sep 17 00:00:00 2001 From: SimplyLiz Date: Wed, 20 Jan 2021 22:02:00 +0100 Subject: [PATCH 04/25] write and read tags from json --- CMakeLists.txt | 1 + src/TileDataContainer.cxx | 25 ++++++++++++++++++++++++- src/TileDataContainer.hxx | 5 ++++- src/TileDataUI.cxx | 11 +++++++++-- src/TileDataUI.hxx | 4 +++- 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25231af..89fcfb8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ set(SOURCES src/TileDataContainer.cxx) set(HEADERS + src/helpers.hxx src/TileDataContainer.hxx src/TileDataUI.hxx Cytopia/src/engine/basics/tileData.hxx diff --git a/src/TileDataContainer.cxx b/src/TileDataContainer.cxx index c8b3acd..28df708 100644 --- a/src/TileDataContainer.cxx +++ b/src/TileDataContainer.cxx @@ -64,6 +64,8 @@ QString TileDataContainer::loadFile(const QString& theFileName) requiredTilesFromJson(tile.RequiredTiles, obj.value("RequiredTiles")); + tagsFromJson(tile, obj.value("tags")); + tileSetDataFromJson(tile.tiles, obj.value("tiles")); tileSetDataFromJson(tile.shoreTiles, obj.value("shoreTiles")); tileSetDataFromJson(tile.slopeTiles, obj.value("slopeTiles")); @@ -94,6 +96,14 @@ void TileDataContainer::requiredTilesFromJson(RequiredTilesData& data, const QJs data.height= static_cast(obj.value("height").toInt()); } +void TileDataContainer::tagsFromJson(TileData& data, const QJsonValue& value) +{ + QJsonObject obj = value.toObject(); + for (const QJsonValue& tag : value.toArray()) + { + data.tags.push_back(tag.toString().toStdString()); + } +} //-------------------------------------------------------------------------------- @@ -125,7 +135,8 @@ bool TileDataContainer::saveFile() obj.insert("placeOnGround", tile.placeOnGround); obj.insert("placeOnWater", tile.placeOnWater); - obj.insert("RequiredTiles", requiredTilesToJson(tile.RequiredTiles)); + obj.insert("RequiredTiles", requiredTilesToJson(tile.RequiredTiles)); + obj.insert("tags", tagsToJson(tile.tags)); if (!tile.tiles.fileName.empty()) obj.insert("tiles", tileSetDataToJson(tile.tiles)); @@ -174,6 +185,18 @@ QJsonObject TileDataContainer::requiredTilesToJson(const RequiredTilesData& data return obj; } +QJsonArray TileDataContainer::tagsToJson(const std::vector& data) +{ + QJsonArray result; + + for (const std::string tag : data) + { + result.append(QString::fromStdString(tag)); + } + + return result; +} + //-------------------------------------------------------------------------------- void TileDataContainer::removeTileData(const QString& id) { tileData.remove(id); } diff --git a/src/TileDataContainer.hxx b/src/TileDataContainer.hxx index b27d427..038d9b3 100644 --- a/src/TileDataContainer.hxx +++ b/src/TileDataContainer.hxx @@ -6,6 +6,7 @@ #include #include "Cytopia/src/engine/basics/tileData.hxx" +#include "helpers.hxx" class TileDataContainer : public QObject { @@ -24,10 +25,12 @@ public: Map::iterator end() { return tileData.end(); } private: + void tagsFromJson(TileData& data, const QJsonValue& value); void tileSetDataFromJson(TileSetData &data, const QJsonValue &value); - void requiredTilesFromJson(RequiredTilesData& data, const QJsonValue &value); + void requiredTilesFromJson(RequiredTilesData& data, const QJsonValue& value); QJsonObject tileSetDataToJson(const TileSetData& data); QJsonObject requiredTilesToJson(const RequiredTilesData& data); + QJsonArray tagsToJson(const std::vector& data); private: QString fileName; diff --git a/src/TileDataUI.cxx b/src/TileDataUI.cxx index 858bb0b..05a03a0 100644 --- a/src/TileDataUI.cxx +++ b/src/TileDataUI.cxx @@ -13,6 +13,7 @@ #include #include + #include "Cytopia/src/engine/basics/tileData.hxx" //-------------------------------------------------------------------------------- @@ -42,7 +43,6 @@ TileDataUI::TileDataUI() ui.requiredTilesHeight->setRange(TD_REQUIREDTILES_MIN, TD_REQUIREDTILES_MAX); ui.requiredTilesWidth->setRange(TD_REQUIREDTILES_MIN, TD_REQUIREDTILES_MAX); - w = new QWidget; tilesSet.setupUi(w); setup(tilesSet); @@ -369,7 +369,9 @@ void TileDataUI::writeToTileData(TileData &tile) tile.placeOnWater = ui.placeOnWater->checkState(); tile.RequiredTiles.height = static_cast(ui.requiredTilesHeight->value()); tile.RequiredTiles.width = static_cast(ui.requiredTilesWidth->value()); - + + commaSeperatedStringToVector(ui.tags->text().toStdString(), tile.tags, ","); + readTileSetDataWidget(tilesSet, tile.tiles); readTileSetDataWidget(cornerSet, tile.shoreTiles); readTileSetDataWidget(slopeSet, tile.slopeTiles); @@ -405,6 +407,9 @@ void TileDataUI::readFromTileData(const TileData &tile) ui.requiredTilesHeight->setValue(tile.RequiredTiles.height); ui.requiredTilesWidth->setValue(tile.RequiredTiles.width); + // present tags as a comma seperated string + ui.tags->setText(QString::fromStdString(commaSeperateVector(tile.tags, ","))); + fillTileSetDataWidget(tilesSet, tile.tiles); fillTileSetDataWidget(cornerSet, tile.shoreTiles); fillTileSetDataWidget(slopeSet, tile.slopeTiles); @@ -569,3 +574,5 @@ void TileDataUI::duplicateItem() } //-------------------------------------------------------------------------------- + + diff --git a/src/TileDataUI.hxx b/src/TileDataUI.hxx index 20d5cd3..a8c63d7 100644 --- a/src/TileDataUI.hxx +++ b/src/TileDataUI.hxx @@ -8,9 +8,11 @@ #include "ui_TileDataUI.h" #include "ui_TileSetDataUI.h" +#include "helpers.hxx" #include "TileDataContainer.hxx" + class TileDataUI : public QMainWindow { Q_OBJECT @@ -42,7 +44,7 @@ private: // methods void fillTileSetDataWidget(const Ui_TileSetDataUi &ui, const TileSetData &data); void readTileSetDataWidget(const Ui_TileSetDataUi &ui, TileSetData &data); QJsonObject tileSetDataToJson(const TileSetData &data); - + private: // members TileDataContainer tileContainer; QTreeWidget *tree; From f6d9fc123dd1c3aaa83a6559f016f443e8053bd8 Mon Sep 17 00:00:00 2001 From: SimplyLiz Date: Sat, 23 Jan 2021 18:04:36 +0100 Subject: [PATCH 05/25] parse zones data from json --- src/TileDataContainer.cxx | 27 ++++++++++++++++++++++++++- src/TileDataContainer.hxx | 2 ++ src/TileDataUI.cxx | 29 +++++++++++++++++++++++++++++ src/TileDataUI.hxx | 4 +++- 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/TileDataContainer.cxx b/src/TileDataContainer.cxx index 28df708..edcd46f 100644 --- a/src/TileDataContainer.cxx +++ b/src/TileDataContainer.cxx @@ -65,7 +65,8 @@ QString TileDataContainer::loadFile(const QString& theFileName) requiredTilesFromJson(tile.RequiredTiles, obj.value("RequiredTiles")); tagsFromJson(tile, obj.value("tags")); - + zonesFromJson(tile.zones, obj.value("zones")); + tileSetDataFromJson(tile.tiles, obj.value("tiles")); tileSetDataFromJson(tile.shoreTiles, obj.value("shoreTiles")); tileSetDataFromJson(tile.slopeTiles, obj.value("slopeTiles")); @@ -105,6 +106,15 @@ void TileDataContainer::tagsFromJson(TileData& data, const QJsonValue& value) } } +void TileDataContainer::zonesFromJson(std::vector& data, const QJsonValue& value) +{ + QJsonObject obj = value.toObject(); + for (const QJsonValue& tag : value.toArray()) + { + data.push_back( Zones::_from_string_nocase(tag.toString().toStdString().c_str())); + } +} + //-------------------------------------------------------------------------------- bool TileDataContainer::saveFile() @@ -137,6 +147,7 @@ bool TileDataContainer::saveFile() obj.insert("RequiredTiles", requiredTilesToJson(tile.RequiredTiles)); obj.insert("tags", tagsToJson(tile.tags)); + obj.insert("zones", zonesToJson(tile.zones)); if (!tile.tiles.fileName.empty()) obj.insert("tiles", tileSetDataToJson(tile.tiles)); @@ -197,6 +208,20 @@ QJsonArray TileDataContainer::tagsToJson(const std::vector& data) return result; } +QJsonArray TileDataContainer::zonesToJson(const std::vector& data) +{ + QJsonArray result; + + for (const Zones zone : data) + { + std::string myzone = zone._to_string(); + result.append(QString::fromStdString(myzone)); + //result.append(QString::fromUtf8(zone._to_string())); + } + + return result; +} + //-------------------------------------------------------------------------------- void TileDataContainer::removeTileData(const QString& id) { tileData.remove(id); } diff --git a/src/TileDataContainer.hxx b/src/TileDataContainer.hxx index 038d9b3..be89e31 100644 --- a/src/TileDataContainer.hxx +++ b/src/TileDataContainer.hxx @@ -28,9 +28,11 @@ private: void tagsFromJson(TileData& data, const QJsonValue& value); void tileSetDataFromJson(TileSetData &data, const QJsonValue &value); void requiredTilesFromJson(RequiredTilesData& data, const QJsonValue& value); + void zonesFromJson(std::vector &data, const QJsonValue& value); QJsonObject tileSetDataToJson(const TileSetData& data); QJsonObject requiredTilesToJson(const RequiredTilesData& data); QJsonArray tagsToJson(const std::vector& data); + QJsonArray zonesToJson(const std::vector& data); private: QString fileName; diff --git a/src/TileDataUI.cxx b/src/TileDataUI.cxx index 05a03a0..2831823 100644 --- a/src/TileDataUI.cxx +++ b/src/TileDataUI.cxx @@ -372,6 +372,8 @@ void TileDataUI::writeToTileData(TileData &tile) commaSeperatedStringToVector(ui.tags->text().toStdString(), tile.tags, ","); + tile.zones = ZonesEnumVectorFromString(ui.zones->text()); + readTileSetDataWidget(tilesSet, tile.tiles); readTileSetDataWidget(cornerSet, tile.shoreTiles); readTileSetDataWidget(slopeSet, tile.slopeTiles); @@ -407,6 +409,7 @@ void TileDataUI::readFromTileData(const TileData &tile) ui.requiredTilesHeight->setValue(tile.RequiredTiles.height); ui.requiredTilesWidth->setValue(tile.RequiredTiles.width); + ui.zones->setText(QString::fromStdString(ZonesEnumVectorToString(tile.zones))); // present tags as a comma seperated string ui.tags->setText(QString::fromStdString(commaSeperateVector(tile.tags, ","))); @@ -415,6 +418,32 @@ void TileDataUI::readFromTileData(const TileData &tile) fillTileSetDataWidget(slopeSet, tile.slopeTiles); } +//------------------------ Zones ------------------------------------------------- + +std::string TileDataUI::ZonesEnumVectorToString(const std::vector& data) +{ + std::vector zones; + + for (const Zones zone : data) + { + zones.push_back(zone._to_string()); + } + return commaSeperateVector(zones); +} + +std::vector TileDataUI::ZonesEnumVectorFromString(QString zones) +{ + std::vector zoneNames; + commaSeperatedStringToVector(zones.toStdString(), zoneNames); + std::vector result; + for (const std::string& zoneName : zoneNames) + { + result.push_back(Zones::_from_string_nocase(zoneName.c_str())); + } + return result; +} + + //-------------------------------------------------------------------------------- void TileDataUI::fillTileSetDataWidget(const Ui_TileSetDataUi &ui, const TileSetData &data) diff --git a/src/TileDataUI.hxx b/src/TileDataUI.hxx index a8c63d7..a46252b 100644 --- a/src/TileDataUI.hxx +++ b/src/TileDataUI.hxx @@ -40,7 +40,9 @@ private: // methods void addItem(const TileData &tile); void ensureUniqueId(TileData &tile); void writeToTileData(TileData &tile); - void readFromTileData(const TileData &tile); + void readFromTileData(const TileData& tile); + std::vector ZonesEnumVectorFromString(QString zones); + std::string ZonesEnumVectorToString(const std::vector& data); void fillTileSetDataWidget(const Ui_TileSetDataUi &ui, const TileSetData &data); void readTileSetDataWidget(const Ui_TileSetDataUi &ui, TileSetData &data); QJsonObject tileSetDataToJson(const TileSetData &data); From 0ac876c7e0ba7d0a66f930899f0a4a9058f2780d Mon Sep 17 00:00:00 2001 From: SimplyLiz Date: Sat, 23 Jan 2021 21:14:24 +0100 Subject: [PATCH 06/25] use toggle buttons to represent active zones --- src/TileDataUI.cxx | 160 ++++++++++++++++++++++++++++++--------------- src/TileDataUI.hxx | 3 + 2 files changed, 109 insertions(+), 54 deletions(-) diff --git a/src/TileDataUI.cxx b/src/TileDataUI.cxx index 2831823..1fc2efb 100644 --- a/src/TileDataUI.cxx +++ b/src/TileDataUI.cxx @@ -27,7 +27,7 @@ TileDataUI::TileDataUI() connect(tree, &QTreeWidget::currentItemChanged, this, &TileDataUI::itemSelected); splitter->addWidget(tree); - QWidget *w = new QWidget; + QWidget* w = new QWidget; ui.setupUi(w); splitter->addWidget(w); @@ -72,16 +72,16 @@ TileDataUI::TileDataUI() void TileDataUI::createActions() { - QMenu *fileMenu = menuBar()->addMenu(tr("File")); - QMenu *editMenu = menuBar()->addMenu(tr("Edit")); - QMenu *helpMenu = menuBar()->addMenu(tr("Help")); + QMenu* fileMenu = menuBar()->addMenu(tr("File")); + QMenu* editMenu = menuBar()->addMenu(tr("Edit")); + QMenu* helpMenu = menuBar()->addMenu(tr("Help")); - QToolBar *toolBar = new QToolBar(this); + QToolBar* toolBar = new QToolBar(this); toolBar->setObjectName("ToolBar"); addToolBar(toolBar); // --- file menu --- - QAction *action = new QAction(tr("Save"), this); + QAction* action = new QAction(tr("Save"), this); action->setIcon(QIcon::fromTheme("document-save")); action->setShortcut(QKeySequence::Save); connect(action, &QAction::triggered, this, &TileDataUI::saveTileData); @@ -121,11 +121,15 @@ void TileDataUI::createActions() action = new QAction(tr("About Qt"), this); connect(action, &QAction::triggered, this, &QApplication::aboutQt); helpMenu->addAction(action); + + // --- zone buttons --- + // --- zone buttons --- + createZoneButtons(); } //-------------------------------------------------------------------------------- -void TileDataUI::closeEvent(QCloseEvent *event) +void TileDataUI::closeEvent(QCloseEvent* event) { saveTileData(); @@ -139,7 +143,7 @@ void TileDataUI::closeEvent(QCloseEvent *event) //-------------------------------------------------------------------------------- -void TileDataUI::setup(Ui_TileSetDataUi &ui) +void TileDataUI::setup(Ui_TileSetDataUi& ui) { connect(ui.fileButton, &QPushButton::clicked, this, [ui]() { QString fileName = QFileDialog::getOpenFileName(ui.fileButton, tr("Select Image"), ui.fileName->text(), tr("Images (*.png)")); @@ -159,7 +163,7 @@ void TileDataUI::setup(Ui_TileSetDataUi &ui) // recalc width based on current count ui.width->setValue(ui.origImage->pixmap()->width() / ui.count->value()); } - }); + }); connect(ui.deleteButton, &QPushButton::clicked, this, [ui, this]() { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Delete Image"), tr("Shall the image really be deleted?")); @@ -176,36 +180,36 @@ void TileDataUI::setup(Ui_TileSetDataUi &ui) ui.imageSize->hide(); ui.size1->setChecked(true); ui.deleteButton->setEnabled(false); - }); + }); connect(ui.count, QOverload::of(&QSpinBox::valueChanged), this, [ui](int value) { if (!ui.origImage->pixmap() || (value == 0)) return; ui.width->setValue(ui.origImage->pixmap()->width() / value); - }); + }); ui.origImage->hide(); // a hidden storage for the original sized pixmap - connect(ui.buttonGroup, static_cast(&QButtonGroup::buttonClicked), this, - [ui](QAbstractButton *button) { - if (!ui.origImage->pixmap()) - return; + connect(ui.buttonGroup, static_cast(&QButtonGroup::buttonClicked), this, + [ui](QAbstractButton* button) { + if (!ui.origImage->pixmap()) + return; - QPixmap pix = *(ui.origImage->pixmap()); + QPixmap pix = *(ui.origImage->pixmap()); - if (button == ui.size2) - pix = pix.transformed(QTransform().scale(2, 2)); - else if (button == ui.size4) - pix = pix.transformed(QTransform().scale(4, 4)); + if (button == ui.size2) + pix = pix.transformed(QTransform().scale(2, 2)); + else if (button == ui.size4) + pix = pix.transformed(QTransform().scale(4, 4)); - ui.image->setPixmap(pix); - }); + ui.image->setPixmap(pix); + }); } //-------------------------------------------------------------------------------- -bool TileDataUI::loadFile(const QString &fileName) +bool TileDataUI::loadFile(const QString& fileName) { QString error = tileContainer.loadFile(fileName); if (!error.isEmpty()) @@ -214,22 +218,22 @@ bool TileDataUI::loadFile(const QString &fileName) return false; } - QMap categories; - for (const TileData &tile : tileContainer) + QMap categories; + for (const TileData& tile : tileContainer) { QString category(QString::fromStdString(tile.category)); if (!categories.contains(category)) { - QTreeWidgetItem *item = newTreeRootItem(tile); + QTreeWidgetItem* item = newTreeRootItem(tile); categories.insert(category, item); } } - for (const TileData &tile : tileContainer) + for (const TileData& tile : tileContainer) { QString category(QString::fromStdString(tile.category)); - QTreeWidgetItem *root = categories.value(category); + QTreeWidgetItem* root = categories.value(category); root->addChild(newTreeItem(tile)); } @@ -242,7 +246,7 @@ bool TileDataUI::loadFile(const QString &fileName) //-------------------------------------------------------------------------------- -void TileDataUI::itemSelected(QTreeWidgetItem *current, QTreeWidgetItem *previous) +void TileDataUI::itemSelected(QTreeWidgetItem* current, QTreeWidgetItem* previous) { // store current form values into previous item if (previous && previous->data(0, Qt::UserRole).isValid()) @@ -265,16 +269,16 @@ void TileDataUI::itemSelected(QTreeWidgetItem *current, QTreeWidgetItem *previou previous->setData(0, Qt::UserRole, tileId); // if category changed, move item - QTreeWidgetItem *root = previous->parent(); + QTreeWidgetItem* root = previous->parent(); if (tileCategory != root->text(0)) { QSignalBlocker blocker(tree); // avoid recursive call of itemSelected // different from current when called from saveTileData() - QTreeWidgetItem *currentItem = tree->currentItem(); + QTreeWidgetItem* currentItem = tree->currentItem(); int idx = root->indexOfChild(previous); - QTreeWidgetItem *item = root->takeChild(idx); + QTreeWidgetItem* item = root->takeChild(idx); if (root->childCount() == 0) { if (current == root) @@ -296,7 +300,7 @@ void TileDataUI::itemSelected(QTreeWidgetItem *current, QTreeWidgetItem *previou if (item) // only if no toplevel category node found - create a new one { - QTreeWidgetItem *root = newTreeRootItem(tile); + QTreeWidgetItem* root = newTreeRootItem(tile); root->addChild(item); } @@ -315,7 +319,7 @@ void TileDataUI::itemSelected(QTreeWidgetItem *current, QTreeWidgetItem *previou //-------------------------------------------------------------------------------- -void TileDataUI::ensureUniqueId(TileData &tile) +void TileDataUI::ensureUniqueId(TileData& tile) { if (tile.category.empty()) tile.category = "unknown category"; @@ -346,7 +350,7 @@ void TileDataUI::ensureUniqueId(TileData &tile) //-------------------------------------------------------------------------------- -void TileDataUI::writeToTileData(TileData &tile) +void TileDataUI::writeToTileData(TileData& tile) { tile.id = ui.id->text().toStdString(); tile.category = ui.category->text().toStdString(); @@ -369,10 +373,10 @@ void TileDataUI::writeToTileData(TileData &tile) tile.placeOnWater = ui.placeOnWater->checkState(); tile.RequiredTiles.height = static_cast(ui.requiredTilesHeight->value()); tile.RequiredTiles.width = static_cast(ui.requiredTilesWidth->value()); - + + tile.zones = ZonesEnumVectorFromButtons(); + commaSeperatedStringToVector(ui.tags->text().toStdString(), tile.tags, ","); - - tile.zones = ZonesEnumVectorFromString(ui.zones->text()); readTileSetDataWidget(tilesSet, tile.tiles); readTileSetDataWidget(cornerSet, tile.shoreTiles); @@ -384,7 +388,7 @@ void TileDataUI::writeToTileData(TileData &tile) //-------------------------------------------------------------------------------- -void TileDataUI::readFromTileData(const TileData &tile) +void TileDataUI::readFromTileData(const TileData& tile) { ui.id->setText(QString::fromStdString(tile.id)); ui.category->setText(QString::fromStdString(tile.category)); @@ -409,13 +413,15 @@ void TileDataUI::readFromTileData(const TileData &tile) ui.requiredTilesHeight->setValue(tile.RequiredTiles.height); ui.requiredTilesWidth->setValue(tile.RequiredTiles.width); - ui.zones->setText(QString::fromStdString(ZonesEnumVectorToString(tile.zones))); // present tags as a comma seperated string ui.tags->setText(QString::fromStdString(commaSeperateVector(tile.tags, ","))); fillTileSetDataWidget(tilesSet, tile.tiles); fillTileSetDataWidget(cornerSet, tile.shoreTiles); fillTileSetDataWidget(slopeSet, tile.slopeTiles); + + toggleActiveZoneButtons(tile.zones); + } //------------------------ Zones ------------------------------------------------- @@ -433,7 +439,7 @@ std::string TileDataUI::ZonesEnumVectorToString(const std::vector& data) std::vector TileDataUI::ZonesEnumVectorFromString(QString zones) { - std::vector zoneNames; + std::vector zoneNames; commaSeperatedStringToVector(zones.toStdString(), zoneNames); std::vector result; for (const std::string& zoneName : zoneNames) @@ -443,10 +449,56 @@ std::vector TileDataUI::ZonesEnumVectorFromString(QString zones) return result; } +std::vector TileDataUI::ZonesEnumVectorFromButtons() +{ + std::vector result; + + for (int i = 0; i < ui.zoneButtonsHorizontalLayout->count(); i++) + { + QPushButton* myButton = dynamic_cast(ui.zoneButtonsHorizontalLayout->itemAt(i)->widget()); + + if (myButton->isChecked()) + { + result.push_back(Zones::_from_string_nocase(myButton->objectName().toStdString().c_str())); + } + } + return result; +} + +//-------------------------------------------------------------------------------- +void TileDataUI::createZoneButtons() +{ + std::vector myZones = { "NONE","RESIDENTIAL", "INDUSTRIAL", "COMMERCIAL","AGRICULTURAL" }; + for (const auto zone : myZones) + { + QPushButton* button = new QPushButton(QString::fromStdString(zone)); + button->setCheckable(true); + button->setObjectName(QString::fromStdString(zone)); + ui.zoneButtonsHorizontalLayout->addWidget(button); + } +} + +void TileDataUI::toggleActiveZoneButtons(const std::vector& data) +{ + for (int i = 0; i < ui.zoneButtonsHorizontalLayout->count(); i++) + { + QPushButton* myButton = dynamic_cast(ui.zoneButtonsHorizontalLayout->itemAt(i)->widget()); + myButton->setChecked(false); // reset button + + for (const Zones& zone : data) + { + if (myButton->objectName().toStdString().find(zone._to_string()) != std::string::npos) + { + myButton->setChecked(true); + qInfo() << myButton->objectName() << " and " << zone._to_string(); + } + } + } +} //-------------------------------------------------------------------------------- -void TileDataUI::fillTileSetDataWidget(const Ui_TileSetDataUi &ui, const TileSetData &data) +void TileDataUI::fillTileSetDataWidget(const Ui_TileSetDataUi& ui, const TileSetData& data) { ui.fileName->setText(QString::fromStdString(data.fileName)); QPixmap pix(QString::fromStdString(data.fileName)); @@ -464,7 +516,7 @@ void TileDataUI::fillTileSetDataWidget(const Ui_TileSetDataUi &ui, const TileSet //-------------------------------------------------------------------------------- -void TileDataUI::readTileSetDataWidget(const Ui_TileSetDataUi &ui, TileSetData &data) +void TileDataUI::readTileSetDataWidget(const Ui_TileSetDataUi& ui, TileSetData& data) { data.fileName = ui.fileName->text().toStdString(); data.clippingWidth = ui.width->value(); @@ -484,9 +536,9 @@ void TileDataUI::saveTileData() //-------------------------------------------------------------------------------- -QTreeWidgetItem *TileDataUI::newTreeRootItem(const TileData &tile) +QTreeWidgetItem* TileDataUI::newTreeRootItem(const TileData& tile) { - QTreeWidgetItem *root = new QTreeWidgetItem(tree); + QTreeWidgetItem* root = new QTreeWidgetItem(tree); root->setIcon(0, QIcon::fromTheme("folder")); root->setText(0, QString::fromStdString(tile.category)); root->setExpanded(true); @@ -496,9 +548,9 @@ QTreeWidgetItem *TileDataUI::newTreeRootItem(const TileData &tile) //-------------------------------------------------------------------------------- -QTreeWidgetItem *TileDataUI::newTreeItem(const TileData &tile) +QTreeWidgetItem* TileDataUI::newTreeItem(const TileData& tile) { - QTreeWidgetItem *item = new QTreeWidgetItem; + QTreeWidgetItem* item = new QTreeWidgetItem; item->setIcon(0, QIcon::fromTheme("text-x-generic")); item->setText(0, QString::fromStdString(tile.title)); item->setData(0, Qt::UserRole, QString::fromStdString(tile.id)); @@ -536,12 +588,12 @@ void TileDataUI::newItem() //-------------------------------------------------------------------------------- -void TileDataUI::addItem(const TileData &tile) +void TileDataUI::addItem(const TileData& tile) { tileContainer.addTileData(tile); // show in tree - QTreeWidgetItem *root = nullptr; + QTreeWidgetItem* root = nullptr; for (int i = 0; i < tree->topLevelItemCount(); i++) { if (tree->topLevelItem(i)->text(0) == QString::fromStdString(tile.category)) // new parent found @@ -554,7 +606,7 @@ void TileDataUI::addItem(const TileData &tile) if (!root) root = newTreeRootItem(tile); - QTreeWidgetItem *item = newTreeItem(tile); + QTreeWidgetItem* item = newTreeItem(tile); root->addChild(item); tree->setCurrentItem(item); } @@ -570,15 +622,15 @@ void TileDataUI::deleteItem() TileData tile = tileContainer.getTileData(id); QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Delete Item"), - tr("Shall the item '%1/%2' be deleted?") - .arg(QString::fromStdString(tile.category)) - .arg(QString::fromStdString(tile.title))); + tr("Shall the item '%1/%2' be deleted?") + .arg(QString::fromStdString(tile.category)) + .arg(QString::fromStdString(tile.title))); if (ret == QMessageBox::No) return; tileContainer.removeTileData(id); - QTreeWidgetItem *root = tree->currentItem()->parent(); + QTreeWidgetItem* root = tree->currentItem()->parent(); delete tree->currentItem(); tree->setCurrentItem(nullptr); // and select nothing diff --git a/src/TileDataUI.hxx b/src/TileDataUI.hxx index a46252b..a7b2d9c 100644 --- a/src/TileDataUI.hxx +++ b/src/TileDataUI.hxx @@ -35,6 +35,8 @@ private slots: private: // methods void setup(Ui_TileSetDataUi &ui); void createActions(); + void createZoneButtons(); + void toggleActiveZoneButtons(const std::vector& data); QTreeWidgetItem *newTreeRootItem(const TileData &tile); QTreeWidgetItem *newTreeItem(const TileData &tile); void addItem(const TileData &tile); @@ -42,6 +44,7 @@ private: // methods void writeToTileData(TileData &tile); void readFromTileData(const TileData& tile); std::vector ZonesEnumVectorFromString(QString zones); + std::vector TileDataUI::ZonesEnumVectorFromButtons(); std::string ZonesEnumVectorToString(const std::vector& data); void fillTileSetDataWidget(const Ui_TileSetDataUi &ui, const TileSetData &data); void readTileSetDataWidget(const Ui_TileSetDataUi &ui, TileSetData &data); From cc5389d50a1213f02cf5c70c4599dfa0bd49fb38 Mon Sep 17 00:00:00 2001 From: SimplyLiz Date: Sat, 23 Jan 2021 21:36:23 +0100 Subject: [PATCH 07/25] create buttons from actual enum string values --- src/TileDataUI.cxx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/TileDataUI.cxx b/src/TileDataUI.cxx index 1fc2efb..15b1591 100644 --- a/src/TileDataUI.cxx +++ b/src/TileDataUI.cxx @@ -468,8 +468,8 @@ std::vector TileDataUI::ZonesEnumVectorFromButtons() //-------------------------------------------------------------------------------- void TileDataUI::createZoneButtons() { - std::vector myZones = { "NONE","RESIDENTIAL", "INDUSTRIAL", "COMMERCIAL","AGRICULTURAL" }; - for (const auto zone : myZones) + // Iterate over all Enum values as strings + for (const auto zone : Zones::_names()) { QPushButton* button = new QPushButton(QString::fromStdString(zone)); button->setCheckable(true); @@ -480,17 +480,19 @@ void TileDataUI::createZoneButtons() void TileDataUI::toggleActiveZoneButtons(const std::vector& data) { + // iterate over all buttons for (int i = 0; i < ui.zoneButtonsHorizontalLayout->count(); i++) { + // grab buttons from the horizontal layout they are located at. QPushButton* myButton = dynamic_cast(ui.zoneButtonsHorizontalLayout->itemAt(i)->widget()); myButton->setChecked(false); // reset button - + // iterate over all active zones for this tile for (const Zones& zone : data) { if (myButton->objectName().toStdString().find(zone._to_string()) != std::string::npos) { + // if it matches, check the button myButton->setChecked(true); - qInfo() << myButton->objectName() << " and " << zone._to_string(); } } } From 6bb269df50afecbb2e41629c0f7983d9027ea9cb Mon Sep 17 00:00:00 2001 From: SimplyLiz Date: Sat, 23 Jan 2021 22:01:57 +0100 Subject: [PATCH 08/25] read style property from json --- src/TileDataContainer.cxx | 32 +++++++++++++++++++---- src/TileDataContainer.hxx | 2 ++ src/TileDataUI.cxx | 55 ++++++++++++++++++++++++++++++++++++--- src/TileDataUI.hxx | 10 ++++--- 4 files changed, 88 insertions(+), 11 deletions(-) diff --git a/src/TileDataContainer.cxx b/src/TileDataContainer.cxx index edcd46f..18085a0 100644 --- a/src/TileDataContainer.cxx +++ b/src/TileDataContainer.cxx @@ -66,6 +66,7 @@ QString TileDataContainer::loadFile(const QString& theFileName) tagsFromJson(tile, obj.value("tags")); zonesFromJson(tile.zones, obj.value("zones")); + stylesFromJson(tile.style, obj.value("style")); tileSetDataFromJson(tile.tiles, obj.value("tiles")); tileSetDataFromJson(tile.shoreTiles, obj.value("shoreTiles")); @@ -109,9 +110,18 @@ void TileDataContainer::tagsFromJson(TileData& data, const QJsonValue& value) void TileDataContainer::zonesFromJson(std::vector& data, const QJsonValue& value) { QJsonObject obj = value.toObject(); - for (const QJsonValue& tag : value.toArray()) + for (const QJsonValue& zone : value.toArray()) { - data.push_back( Zones::_from_string_nocase(tag.toString().toStdString().c_str())); + data.push_back( Zones::_from_string_nocase(zone.toString().toStdString().c_str())); + } +} + +void TileDataContainer::stylesFromJson(std::vector