Allow saving/loading the color palette config to/from an external file

This commit is contained in:
Martchus 2021-09-17 00:22:32 +02:00
parent b16caee532
commit 836801fb39
3 changed files with 80 additions and 1 deletions

View File

@ -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})

View File

@ -3,10 +3,14 @@
#include "ui_paletteeditor.h"
#include <QFileDialog>
#include <QHeaderView>
#include <QLabel>
#include <QMessageBox>
#include <QMetaProperty>
#include <QPainter>
#include <QPushButton>
#include <QSettings>
#include <QStyle>
#include <QToolButton>
@ -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<QPalette>()) {
*errorMessage = PaletteEditor::tr("\"%1\" does not contain a valid palette.").arg(fileName);
return false;
}
*pal = settings.value(QStringLiteral("palette")).value<QPalette>();
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;

View File

@ -43,6 +43,8 @@ private Q_SLOTS:
void paletteChanged(const QPalette &palette);
void handleComputeRadioClicked();
void handleDetailsRadioClicked();
void load();
void save();
private:
void updatePreviewPalette();