diff --git a/common/minifig.cpp b/common/minifig.cpp index a5824025..29dc33ee 100644 --- a/common/minifig.cpp +++ b/common/minifig.cpp @@ -227,20 +227,25 @@ void MinifigWizard::DeleteTemplate(const QString& TemplateName) mTemplates.erase(TemplateName); } -void MinifigWizard::LoadTemplates() +void MinifigWizard::AddTemplatesJson(const QByteArray& TemplateData) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) - QSettings Settings; - Settings.beginGroup("Minifig"); - QByteArray TemplateData = Settings.value("Templates").toByteArray(); - - mTemplates.clear(); - QJsonDocument Document = QJsonDocument::fromJson(TemplateData); QJsonObject RootObject = Document.object(); - for (QJsonObject::const_iterator ElementIt = RootObject.constBegin(); ElementIt != RootObject.constEnd(); ElementIt++) + int Version = RootObject["Version"].toInt(0); + QJsonObject TemplatesObject; + + if (Version > 0) + TemplatesObject = RootObject["Templates"].toObject(); + else + TemplatesObject = RootObject; + + for (QJsonObject::const_iterator ElementIt = TemplatesObject.constBegin(); ElementIt != TemplatesObject.constEnd(); ElementIt++) { + if (!ElementIt.value().isObject()) + continue; + QJsonObject TemplateObject = ElementIt.value().toObject(); lcMinifigTemplate Template; @@ -258,11 +263,16 @@ void MinifigWizard::LoadTemplates() #endif } -void MinifigWizard::SaveTemplates() +QByteArray MinifigWizard::GetTemplatesJson() const { + QByteArray TemplateData; + #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) QJsonObject RootObject; + RootObject["Version"] = 1; + QJsonObject TemplatesObject; + for (const auto& TemplateEntry : mTemplates) { const lcMinifigTemplate& Template = TemplateEntry.second; @@ -279,14 +289,33 @@ void MinifigWizard::SaveTemplates() TemplateObject[QLatin1String(mSectionNames[PartIdx])] = PartObject; } - RootObject[TemplateEntry.first] = TemplateObject; + TemplatesObject[TemplateEntry.first] = TemplateObject; } - QByteArray TemplateData = QJsonDocument(RootObject).toJson(QJsonDocument::Compact); + RootObject["Templates"] = TemplatesObject; + TemplateData = QJsonDocument(RootObject).toJson(); +#endif + + return TemplateData; +} + +void MinifigWizard::LoadTemplates() +{ + mTemplates.clear(); QSettings Settings; Settings.beginGroup("Minifig"); - Settings.setValue("Templates", TemplateData); + QByteArray TemplateData = Settings.value("Templates").toByteArray(); + + AddTemplatesJson(TemplateData); +} + +void MinifigWizard::SaveTemplates() +{ +#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) + QSettings Settings; + Settings.beginGroup("Minifig"); + Settings.setValue("Templates", GetTemplatesJson()); #endif } diff --git a/common/minifig.h b/common/minifig.h index 88ae88c1..e7398861 100644 --- a/common/minifig.h +++ b/common/minifig.h @@ -60,6 +60,8 @@ public: void SaveTemplate(const QString& TemplateName, const lcMinifigTemplate& Template); void DeleteTemplate(const QString& TemplateName); + void AddTemplatesJson(const QByteArray& TemplateData); + QByteArray GetTemplatesJson() const; void OnDraw(); void OnLeftButtonDown(); diff --git a/qt/lc_qminifigdialog.cpp b/qt/lc_qminifigdialog.cpp index 883ad55d..4b7ad50b 100644 --- a/qt/lc_qminifigdialog.cpp +++ b/qt/lc_qminifigdialog.cpp @@ -216,6 +216,46 @@ void lcQMinifigDialog::on_TemplateDeleteButton_clicked() UpdateTemplateCombo(); } +void lcQMinifigDialog::on_TemplateImportButton_clicked() +{ + QString FileName = QFileDialog::getOpenFileName(this, tr("Import Templates"), "", tr("Minifig Template Files (*.minifig);;All Files (*.*)")); + + if (FileName.isEmpty()) + return; + + QFile File(FileName); + + if (!File.open(QIODevice::ReadOnly)) + { + QMessageBox::warning(gMainWindow, tr("Error"), tr("Error reading file '%1':\n%2").arg(FileName, File.errorString())); + return; + } + + QByteArray FileData = File.readAll(); + mMinifigWidget->AddTemplatesJson(FileData); + + UpdateTemplateCombo(); +} + +void lcQMinifigDialog::on_TemplateExportButton_clicked() +{ + QString FileName = QFileDialog::getSaveFileName(this, tr("Export Templates"), "", tr("Minifig Template Files (*.minifig);;All Files (*.*)")); + + if (FileName.isEmpty()) + return; + + QFile File(FileName); + + if (!File.open(QIODevice::WriteOnly)) + { + QMessageBox::warning(gMainWindow, tr("Error"), tr("Error writing to file '%1':\n%2").arg(FileName, File.errorString())); + return; + } + + QByteArray Templates = mMinifigWidget->GetTemplatesJson(); + File.write(Templates); +} + void lcQMinifigDialog::typeChanged(int index) { mMinifigWidget->SetSelectionIndex(getTypeIndex(sender()), index); diff --git a/qt/lc_qminifigdialog.h b/qt/lc_qminifigdialog.h index e82c87c3..9a44ec3e 100644 --- a/qt/lc_qminifigdialog.h +++ b/qt/lc_qminifigdialog.h @@ -23,6 +23,8 @@ public slots: void on_TemplateComboBox_currentIndexChanged(const QString& TemplateName); void on_TemplateSaveButton_clicked(); void on_TemplateDeleteButton_clicked(); + void on_TemplateImportButton_clicked(); + void on_TemplateExportButton_clicked(); void typeChanged(int index); void colorChanged(int index); void angleChanged(double value); diff --git a/qt/lc_qminifigdialog.ui b/qt/lc_qminifigdialog.ui index 8abad24c..e5987abf 100644 --- a/qt/lc_qminifigdialog.ui +++ b/qt/lc_qminifigdialog.ui @@ -710,6 +710,20 @@ + + + + Import... + + + + + + + Export... + + +