Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add file and color controller setting types #13669

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions src/controllers/legacycontrollersettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
#include <util/assert.h>

#include <QCheckBox>
#include <QColorDialog>
#include <QComboBox>
#include <QDoubleSpinBox>
#include <QFileDialog>
#include <QLabel>
#include <QLayout>
#include <QPushButton>
#include <QSpinBox>

#include "moc_legacycontrollersettings.cpp"
Expand Down Expand Up @@ -54,6 +57,8 @@ LegacyControllerSettingBuilder::LegacyControllerSettingBuilder() {
registerType<LegacyControllerIntegerSetting>();
registerType<LegacyControllerRealSetting>();
registerType<LegacyControllerEnumSetting>();
registerType<LegacyControllerColorSetting>();
registerType<LegacyControllerFileSetting>();
}

AbstractLegacyControllerSetting::AbstractLegacyControllerSetting(const QDomElement& element) {
Expand Down Expand Up @@ -274,3 +279,110 @@ QWidget* LegacyControllerEnumSetting::buildInputWidget(QWidget* pParent) {

return pComboBox;
}

LegacyControllerColorSetting::LegacyControllerColorSetting(
const QDomElement& element)
: AbstractLegacyControllerSetting(element) {
m_defaultValue = QColor(element.attribute("default"));
m_savedValue = m_defaultValue;
m_editedValue = m_defaultValue;
reset();
save();
}

bool LegacyControllerColorSetting::match(const QDomElement& element) {
return element.hasAttribute("type") &&
QString::compare(element.attribute("type"),
"color",
Qt::CaseInsensitive) == 0;
}

void LegacyControllerColorSetting::parse(const QString& in, bool* ok) {
if (ok != nullptr) {
*ok = false;
}
reset();
save();

m_savedValue = QColor(in);
if (!m_editedValue.isValid()) {
*ok = false;
return;
}
m_editedValue = m_savedValue;
}

QWidget* LegacyControllerColorSetting::buildInputWidget(QWidget* pParent) {
auto* pPushButton = new QPushButton(tr("Change color"), pParent);

// connect(this, &AbstractLegacyControllerSetting::valueReset, pComboBox, [this, pComboBox]() {
// pComboBox->setCurrentIndex(static_cast<int>(m_editedValue));
// });

connect(pPushButton, &QPushButton::clicked, this, [this, pPushButton](bool) {
auto color = QColorDialog::getColor(m_editedValue, pPushButton, tr("Choose a new color"));
if (color.isValid()) {
m_editedValue = color;
emit changed();
}
});

return pPushButton;
}

LegacyControllerFileSetting::LegacyControllerFileSetting(
const QDomElement& element)
: AbstractLegacyControllerSetting(element) {
m_defaultValue = QFileInfo(element.attribute("default"));
m_fileFilter = element.attribute("pattern");
m_savedValue = m_defaultValue;
m_editedValue = m_defaultValue;
reset();
save();
}

bool LegacyControllerFileSetting::match(const QDomElement& element) {
return element.hasAttribute("type") &&
QString::compare(element.attribute("type"),
"file",
Qt::CaseInsensitive) == 0;
}

void LegacyControllerFileSetting::parse(const QString& in, bool* ok) {
if (ok != nullptr) {
*ok = false;
}
reset();
save();

m_editedValue = QFileInfo(in);
if (!m_editedValue.exists()) {
*ok = false;
return;
}
m_savedValue = m_editedValue;
}

QWidget* LegacyControllerFileSetting::buildInputWidget(QWidget* pParent) {
auto* pPushButton = new QPushButton(tr("Change file"), pParent);

// connect(this, &AbstractLegacyControllerSetting::valueReset, pComboBox, [this, pComboBox]() {
// pComboBox->setCurrentIndex(static_cast<int>(m_editedValue));
// });

connect(pPushButton,
&QPushButton::clicked,
this,
[this, pPushButton](bool) {
auto file = QFileInfo(QFileDialog::getOpenFileName(pPushButton,
tr("Select a file"),
QString(),
m_fileFilter));
if (file.exists()) {
m_editedValue = file;
emit changed();
}
});

return pPushButton;
}
137 changes: 137 additions & 0 deletions src/controllers/legacycontrollersettings.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#pragma once

#include <QColor>
#include <QFileInfo>
#include <QJSValue>

#include "controllers/legacycontrollersettingsfactory.h"
Expand Down Expand Up @@ -423,6 +425,141 @@
friend class ControllerS4MK3SettingTest_ensureLibrarySettingValueAndEnumEquals;
};

class LegacyControllerColorSetting
: public LegacyControllerSettingFactory<LegacyControllerColorSetting>,
public AbstractLegacyControllerSetting {
public:
LegacyControllerColorSetting(const QDomElement& element);

virtual ~LegacyControllerColorSetting() = default;

QJSValue value() const override {
return QJSValue(stringify());
}

QString stringify() const override {
return m_savedValue.name(QColor::HexRgb);
}
void parse(const QString& in, bool* ok) override;
bool isDefault() const override {
return m_savedValue == m_defaultValue;
}
bool isDirty() const override {
return m_savedValue != m_editedValue;
}

virtual void save() override {
m_savedValue = m_editedValue;
}

virtual void reset() override {
m_editedValue = m_defaultValue;
emit valueReset();
}

/// @brief Whether or not this setting definition and its current state are
/// valid. Validity scope includes a known default/current/dirty option.
/// @return true if valid
bool valid() const override {
return AbstractLegacyControllerSetting::valid() &&
m_defaultValue.isValid() &&
m_savedValue.isValid();
}

static AbstractLegacyControllerSetting* createFrom(const QDomElement& element) {
return new LegacyControllerColorSetting(element);
}
static inline bool match(const QDomElement& element);

protected:
LegacyControllerColorSetting(const QDomElement& element,
QColor currentValue,
QColor defaultValue)
: AbstractLegacyControllerSetting(element),
m_savedValue(currentValue),
m_defaultValue(defaultValue) {
}

virtual QWidget* buildInputWidget(QWidget* parent) override;

private:
QColor m_savedValue;
QColor m_defaultValue;

QColor m_editedValue;

friend class LegacyControllerMappingSettingsTest_enumSettingEditing_Test;
friend class ControllerS4MK3SettingTest_ensureLibrarySettingValueAndEnumEquals;
};

class LegacyControllerFileSetting
: public LegacyControllerSettingFactory<LegacyControllerFileSetting>,
public AbstractLegacyControllerSetting {
public:
LegacyControllerFileSetting(const QDomElement& element);

virtual ~LegacyControllerFileSetting() = default;

QJSValue value() const override {
return QJSValue(stringify());
}

QString stringify() const override {
return m_savedValue.absoluteFilePath();
}
void parse(const QString& in, bool* ok) override;
bool isDefault() const override {
return m_savedValue == m_defaultValue;
}
bool isDirty() const override {
return m_savedValue != m_editedValue;
}

virtual void save() override {
m_savedValue = m_editedValue;
}

virtual void reset() override {
m_editedValue = m_defaultValue;
emit valueReset();
}

/// @brief Whether or not this setting definition and its current state are
/// valid. Validity scope includes a known default/current/dirty option.
/// @return true if valid
bool valid() const override {
return AbstractLegacyControllerSetting::valid() &&
(m_defaultValue == m_savedValue || m_savedValue.exists());
}

static AbstractLegacyControllerSetting* createFrom(const QDomElement& element) {
return new LegacyControllerFileSetting(element);
}
static inline bool match(const QDomElement& element);

protected:
LegacyControllerFileSetting(const QDomElement& element,
QFileInfo currentValue,

Check failure on line 542 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]

Check failure on line 542 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]

Check failure on line 542 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]

Check failure on line 542 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]

Check failure on line 542 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]
QFileInfo defaultValue)

Check failure on line 543 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]

Check failure on line 543 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]

Check failure on line 543 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]

Check failure on line 543 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]

Check failure on line 543 in src/controllers/legacycontrollersettings.h

View workflow job for this annotation

GitHub Actions / clazy

Missing reference on non-trivial type (class QFileInfo) [-Wclazy-function-args-by-ref]
: AbstractLegacyControllerSetting(element),
m_savedValue(currentValue),
m_defaultValue(defaultValue) {
}

virtual QWidget* buildInputWidget(QWidget* parent) override;

private:
QFileInfo m_savedValue;
QFileInfo m_defaultValue;

QString m_fileFilter;

QFileInfo m_editedValue;

friend class LegacyControllerMappingSettingsTest_enumSettingEditing_Test;
friend class ControllerS4MK3SettingTest_ensureLibrarySettingValueAndEnumEquals;
};

template<>
inline bool matchSetting<int>(const QDomElement& element) {
return element.hasAttribute("type") &&
Expand Down
Loading