From 836801fb3967a25e6366b0dd380b205458477e94 Mon Sep 17 00:00:00 2001 From: Martchus Date: Fri, 17 Sep 2021 00:22:32 +0200 Subject: [PATCH] Allow saving/loading the color palette config to/from an external file --- CMakeLists.txt | 2 +- paletteeditor/paletteeditor.cpp | 77 +++++++++++++++++++++++++++++++++ paletteeditor/paletteeditor.h | 2 + 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9bd4cf5..6d7c807 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ set(META_APP_DESCRIPTION "Common Qt related C++ classes and routines used by my applications such as dialogs, widgets and models") set(META_VERSION_MAJOR 6) set(META_VERSION_MINOR 5) -set(META_VERSION_PATCH 0) +set(META_VERSION_PATCH 1) set(META_APP_VERSION ${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}) project(${META_PROJECT_NAME}) diff --git a/paletteeditor/paletteeditor.cpp b/paletteeditor/paletteeditor.cpp index 965cd67..ad3d00c 100644 --- a/paletteeditor/paletteeditor.cpp +++ b/paletteeditor/paletteeditor.cpp @@ -3,10 +3,14 @@ #include "ui_paletteeditor.h" +#include #include #include +#include #include #include +#include +#include #include #include @@ -38,6 +42,11 @@ PaletteEditor::PaletteEditor(QWidget *parent) m_ui->paletteView->setColumnHidden(2, true); m_ui->paletteView->setColumnHidden(3, true); + auto saveButton = m_ui->buttonBox->addButton(tr("Save…"), QDialogButtonBox::ActionRole); + connect(saveButton, &QPushButton::clicked, this, &PaletteEditor::save); + auto loadButton = m_ui->buttonBox->addButton(tr("Load…"), QDialogButtonBox::ActionRole); + connect(loadButton, &QPushButton::clicked, this, &PaletteEditor::load); + connect(m_paletteModel, &PaletteModel::paletteChanged, this, &PaletteEditor::paletteChanged); connect(m_ui->buildButton, &ColorButton::colorChanged, this, &PaletteEditor::buildPalette); connect(m_ui->computeRadio, &QRadioButton::clicked, this, &PaletteEditor::handleComputeRadioClicked); @@ -124,6 +133,74 @@ void PaletteEditor::handleDetailsRadioClicked() m_paletteModel->setCompute(false); } +static inline QString paletteSuffix() +{ + return QStringLiteral("ini"); +} + +static inline QString paletteFilter() +{ + return PaletteEditor::tr("Color palette configuration (*.ini)"); +} + +static bool loadPalette(const QString &fileName, QPalette *pal, QString *errorMessage) +{ + const auto settings = QSettings(fileName, QSettings::IniFormat); + if (settings.status() != QSettings::NoError) { + *errorMessage = PaletteEditor::tr("Unable to load \"%1\".").arg(fileName); + return false; + } + const auto value = settings.value(QStringLiteral("palette")); + if (!value.isValid() || !value.canConvert()) { + *errorMessage = PaletteEditor::tr("\"%1\" does not contain a valid palette.").arg(fileName); + return false; + } + *pal = settings.value(QStringLiteral("palette")).value(); + return true; +} + +static bool savePalette(const QString &fileName, const QPalette &pal, QString *errorMessage) +{ + auto settings = QSettings(fileName, QSettings::IniFormat); + settings.setValue(QStringLiteral("palette"), QVariant(pal)); + settings.sync(); + if (settings.status() != QSettings::NoError) { + *errorMessage = PaletteEditor::tr("Unable to write \"%1\".").arg(fileName); + return false; + } + return true; +} + +void PaletteEditor::load() +{ + auto dialog = QFileDialog(this, tr("Load palette"), QString(), paletteFilter()); + dialog.setAcceptMode(QFileDialog::AcceptOpen); + if (dialog.exec() != QDialog::Accepted) { + return; + } + auto pal = QPalette(); + auto errorMessage = QString(); + if (loadPalette(dialog.selectedFiles().constFirst(), &pal, &errorMessage)) { + setPalette(pal); + } else { + QMessageBox::warning(this, tr("Error reading palette"), errorMessage); + } +} + +void PaletteEditor::save() +{ + auto dialog = QFileDialog(this, tr("Save palette"), QString(), paletteFilter()); + dialog.setAcceptMode(QFileDialog::AcceptSave); + dialog.setDefaultSuffix(paletteSuffix()); + if (dialog.exec() != QDialog::Accepted) { + return; + } + auto errorMessage = QString(); + if (!savePalette(dialog.selectedFiles().constFirst(), palette(), &errorMessage)) { + QMessageBox::warning(this, tr("Error writing palette"), errorMessage); + } +} + void PaletteEditor::paletteChanged(const QPalette &palette) { m_modelUpdated = true; diff --git a/paletteeditor/paletteeditor.h b/paletteeditor/paletteeditor.h index a78190e..2e04ffa 100644 --- a/paletteeditor/paletteeditor.h +++ b/paletteeditor/paletteeditor.h @@ -43,6 +43,8 @@ private Q_SLOTS: void paletteChanged(const QPalette &palette); void handleComputeRadioClicked(); void handleDetailsRadioClicked(); + void load(); + void save(); private: void updatePreviewPalette();