minimap creator: implement widget state syncing

This commit is contained in:
Skarn
2020-10-29 01:28:52 +03:00
parent 6afb115170
commit 4fd10d4ecd
3 changed files with 191 additions and 3 deletions

View File

@@ -3206,6 +3206,9 @@ void MapView::save(save_mode mode)
{
bool save = true;
// Save minimap creator model filters
minimapTool->saveFiltersToJSON();
if (AsyncLoader::instance().important_object_failed_loading())
{
save = false;

View File

@@ -5,6 +5,7 @@
#include <noggit/MapView.h>
#include <noggit/World.h>
#include <noggit/Log.h>
#include <util/qt/overload.hpp>
@@ -19,7 +20,10 @@
#include <QApplication>
#include <QComboBox>
#include <QProgressBar>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QByteArray>
namespace noggit
{
@@ -340,6 +344,8 @@ namespace noggit
lighting_layout->addRow("River dark color:", river_color_dark);
loadFiltersFromJSON();
// Connections
// Filter buttons
@@ -856,7 +862,7 @@ namespace noggit
}
void MinimapCreator::includeM2Model(std::string filename)
void MinimapCreator::includeM2Model(std::string filename, float size_cat)
{
bool already_added = false;
@@ -879,6 +885,7 @@ namespace noggit
_m2_model_filter_include->addItem(item);
auto entry_wgt = new MinimapM2ModelFilterEntry(this);
entry_wgt->setFileName(filename);
entry_wgt->setSizeCategory(size_cat);
item->setSizeHint(entry_wgt->minimumSizeHint());
_m2_model_filter_include->setItemWidget(item, entry_wgt);
}
@@ -1020,6 +1027,181 @@ namespace noggit
}
}
void MinimapCreator::loadFiltersFromJSON()
{
QSettings settings;
QString str = settings.value ("project/path").toString();
if (!(str.endsWith('\\') || str.endsWith('/')))
{
str += "/";
}
QFile json_file = QFile(str + "/noggit_mmap_filters.json");
if (!json_file.open(QIODevice::ReadOnly))
{
return;
}
QByteArray save_data = json_file.readAll();
QJsonDocument json_doc(QJsonDocument::fromJson(save_data));
if (json_doc.isObject())
{
QJsonObject doc_object = json_doc.object();
// M2 models
QJsonArray m2_models = doc_object["m2_models"].toArray();
for (const auto& m2_model_val : m2_models)
{
if (m2_model_val.isObject())
{
QJsonObject m2_model = m2_model_val.toObject();
QString filename = m2_model["filename"].toString();
double size_cat = m2_model["size_category"].toDouble();
includeM2Model(filename.toStdString(), static_cast<float>(size_cat));
}
}
// M2 instances
QJsonArray m2_instances = doc_object["m2_instances"].toArray();
for (const auto& m2_instance_val : m2_instances)
{
if (m2_instance_val.isObject())
{
QJsonObject m2_instance = m2_instance_val.toObject();
uint32_t uid = m2_instance["uid"].toInt();
includeM2Instance(uid);
}
}
// WMO models
QJsonArray wmo_models = doc_object["wmo_models"].toArray();
for (const auto& wmo_model_val : wmo_models)
{
if (wmo_model_val.isObject())
{
QJsonObject wmo_model = wmo_model_val.toObject();
QString filename = wmo_model["filename"].toString();
excludeWMOModel(filename.toStdString());
}
}
// WMO instances
QJsonArray wmo_instances = doc_object["wmo_instances"].toArray();
for (const auto& wmo_instance_val : wmo_instances)
{
if (wmo_instance_val.isObject())
{
QJsonObject wmo_instance = wmo_instance_val.toObject();
uint32_t uid = wmo_instance["uid"].toInt();
excludeWMOInstance(uid);
}
}
}
json_file.close();
}
void MinimapCreator::saveFiltersToJSON()
{
QSettings settings;
QString str = settings.value ("project/path").toString();
if (!(str.endsWith('\\') || str.endsWith('/')))
{
str += "/";
}
QJsonDocument json_doc;
QFile json_file = QFile(str + "/noggit_mmap_filters.json");
if (!json_file.open(QIODevice::WriteOnly | QIODevice::Text | QFile::Truncate))
{
LogError << "Unable to save minimap creator model filters to JSON document." << std::endl;
return;
}
json_doc = QJsonDocument();
QJsonObject json_root_obj = QJsonObject();
QJsonArray m2_models = QJsonArray();
QJsonArray m2_instances = QJsonArray();
QJsonArray wmo_models = QJsonArray();
QJsonArray wmo_instances = QJsonArray();
// m2 models
for (int i = 0; i < _m2_model_filter_include->count(); ++i)
{
auto item_wgt = reinterpret_cast<MinimapM2ModelFilterEntry*>(_m2_model_filter_include->itemWidget(
_m2_model_filter_include->item(i)));
QJsonObject item = QJsonObject();
item.insert("filename", QJsonValue(item_wgt->getFileName()));
item.insert("size_category", QJsonValue(static_cast<double>(item_wgt->getSizeCategory())));
m2_models.append(item);
}
// m2 instances
for (int i = 0; i < _m2_instance_filter_include->count(); ++i)
{
auto item_wgt = reinterpret_cast<MinimapInstanceFilterEntry*>(_m2_instance_filter_include->itemWidget(
_m2_instance_filter_include->item(i)));
QJsonObject item = QJsonObject();
item.insert("uid", QJsonValue(static_cast<int>(item_wgt->getUid())));
m2_instances.append(item);
}
// wmo models
for (int i = 0; i < _wmo_model_filter_exclude->count(); ++i)
{
auto item_wgt = reinterpret_cast<MinimapWMOModelFilterEntry*>(_wmo_model_filter_exclude->itemWidget(
_wmo_model_filter_exclude->item(i)));
QJsonObject item = QJsonObject();
item.insert("filename", QJsonValue(item_wgt->getFileName()));
wmo_models.append(item);
}
// wmo instances
for (int i = 0; i < _wmo_instance_filter_exclude->count(); ++i)
{
auto item_wgt = reinterpret_cast<MinimapInstanceFilterEntry*>(_wmo_instance_filter_exclude->itemWidget(
_wmo_instance_filter_exclude->item(i)));
QJsonObject item = QJsonObject();
item.insert("uid", QJsonValue(static_cast<int>(item_wgt->getUid())));
wmo_instances.append(item);
}
json_root_obj.insert("m2_models", m2_models);
json_root_obj.insert("m2_instances", m2_instances);
json_root_obj.insert("wmo_models", wmo_models);
json_root_obj.insert("wmo_instances", wmo_instances);
json_doc.setObject(json_root_obj);
json_file.write(json_doc.toJson());
json_file.close();
}
MinimapM2ModelFilterEntry::MinimapM2ModelFilterEntry(MinimapCreator* parent) : QWidget(parent)
{
auto layout = new QHBoxLayout(this);

View File

@@ -90,7 +90,7 @@ namespace noggit
void progressUpdate(int value) { _progress_bar->setValue(value); };
void includeM2Model(std::string filename);
void includeM2Model(std::string filename, float size_cat = 0.0f);
void unincludeM2Model(std::string filename);
void includeM2Instance(uint32_t uid);
void unincludeM2Instance(uint32_t uid);
@@ -100,6 +100,8 @@ namespace noggit
void excludeWMOInstance(uint32_t uid);
void unexcludeWMOInstance(uint32_t uid);
void loadFiltersFromJSON();
void saveFiltersToJSON();
private:
float _radius = 0.01f;
@@ -122,6 +124,7 @@ namespace noggit
QString getFileName() { return _filename->text(); };
void setFileName(const std::string& filename) { _filename->setText(QString(filename.c_str())); };
void setSizeCategory(float size_cat) {_size_category_spin->setValue(size_cat); };
float getSizeCategory() { return static_cast<float>(_size_category_spin->value()); };
private: