mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 18:21:16 +02:00
Merge pull request #15793 from sethalves/fix-qobject-template
BUGZ-742: Q_OBJECT and template classes don't mix
This commit is contained in:
commit
50e9325d64
1 changed files with 81 additions and 36 deletions
|
@ -115,48 +115,39 @@ protected:
|
||||||
const Lambda _triggerHandler;
|
const Lambda _triggerHandler;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class BoolPreference : public Preference {
|
||||||
template <typename T>
|
|
||||||
class TypedPreference : public Preference {
|
|
||||||
public:
|
|
||||||
using Getter = std::function<T()>;
|
|
||||||
using Setter = std::function<void(const T&)>;
|
|
||||||
|
|
||||||
TypedPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
|
||||||
: Preference(category, name), _getter(getter), _setter(setter) { }
|
|
||||||
|
|
||||||
T getValue() const { return _value; }
|
|
||||||
void setValue(const T& value) { if (_value != value) { _value = value; emitValueChanged(); } }
|
|
||||||
void load() override { _value = _getter(); }
|
|
||||||
void save() const override {
|
|
||||||
T oldValue = _getter();
|
|
||||||
if (_value != oldValue) {
|
|
||||||
_setter(_value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
T _value;
|
|
||||||
const Getter _getter;
|
|
||||||
const Setter _setter;
|
|
||||||
};
|
|
||||||
|
|
||||||
class BoolPreference : public TypedPreference<bool> {
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(bool value READ getValue WRITE setValue NOTIFY valueChanged)
|
Q_PROPERTY(bool value READ getValue WRITE setValue NOTIFY valueChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
using Getter = std::function<bool()>;
|
||||||
|
using Setter = std::function<void(const bool&)>;
|
||||||
|
|
||||||
BoolPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
BoolPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
||||||
: TypedPreference(category, name, getter, setter) { }
|
: Preference(category, name), _getter(getter), _setter(setter) { }
|
||||||
|
|
||||||
|
bool getValue() const { return _value; }
|
||||||
|
void setValue(const bool& value) { if (_value != value) { _value = value; emitValueChanged(); } }
|
||||||
|
void load() override { _value = _getter(); }
|
||||||
|
void save() const override {
|
||||||
|
bool oldValue = _getter();
|
||||||
|
if (_value != oldValue) {
|
||||||
|
_setter(_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void valueChanged();
|
void valueChanged();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool _value;
|
||||||
|
const Getter _getter;
|
||||||
|
const Setter _setter;
|
||||||
|
|
||||||
void emitValueChanged() override { emit valueChanged(); }
|
void emitValueChanged() override { emit valueChanged(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
class FloatPreference : public TypedPreference<float> {
|
class FloatPreference : public Preference {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(float value READ getValue WRITE setValue NOTIFY valueChanged)
|
Q_PROPERTY(float value READ getValue WRITE setValue NOTIFY valueChanged)
|
||||||
Q_PROPERTY(float min READ getMin CONSTANT)
|
Q_PROPERTY(float min READ getMin CONSTANT)
|
||||||
|
@ -165,8 +156,21 @@ class FloatPreference : public TypedPreference<float> {
|
||||||
Q_PROPERTY(float decimals READ getDecimals CONSTANT)
|
Q_PROPERTY(float decimals READ getDecimals CONSTANT)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
using Getter = std::function<float()>;
|
||||||
|
using Setter = std::function<void(const float&)>;
|
||||||
|
|
||||||
FloatPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
FloatPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
||||||
: TypedPreference(category, name, getter, setter) { }
|
: Preference(category, name), _getter(getter), _setter(setter) { }
|
||||||
|
|
||||||
|
float getValue() const { return _value; }
|
||||||
|
void setValue(const float& value) { if (_value != value) { _value = value; emitValueChanged(); } }
|
||||||
|
void load() override { _value = _getter(); }
|
||||||
|
void save() const override {
|
||||||
|
float oldValue = _getter();
|
||||||
|
if (_value != oldValue) {
|
||||||
|
_setter(_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float getMin() const { return _min; }
|
float getMin() const { return _min; }
|
||||||
void setMin(float min) { _min = min; };
|
void setMin(float min) { _min = min; };
|
||||||
|
@ -186,14 +190,17 @@ signals:
|
||||||
protected:
|
protected:
|
||||||
void emitValueChanged() override { emit valueChanged(); }
|
void emitValueChanged() override { emit valueChanged(); }
|
||||||
|
|
||||||
|
float _value;
|
||||||
|
const Getter _getter;
|
||||||
|
const Setter _setter;
|
||||||
|
|
||||||
float _decimals { 0 };
|
float _decimals { 0 };
|
||||||
float _min { 0 };
|
float _min { 0 };
|
||||||
float _max { 1 };
|
float _max { 1 };
|
||||||
float _step { 0.1f };
|
float _step { 0.1f };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class IntPreference : public Preference {
|
||||||
class IntPreference : public TypedPreference<int> {
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(float value READ getValue WRITE setValue NOTIFY valueChanged)
|
Q_PROPERTY(float value READ getValue WRITE setValue NOTIFY valueChanged)
|
||||||
Q_PROPERTY(float min READ getMin CONSTANT)
|
Q_PROPERTY(float min READ getMin CONSTANT)
|
||||||
|
@ -202,8 +209,21 @@ class IntPreference : public TypedPreference<int> {
|
||||||
Q_PROPERTY(int decimals READ getDecimals CONSTANT)
|
Q_PROPERTY(int decimals READ getDecimals CONSTANT)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
using Getter = std::function<int()>;
|
||||||
|
using Setter = std::function<void(const int&)>;
|
||||||
|
|
||||||
IntPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
IntPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
||||||
: TypedPreference(category, name, getter, setter) { }
|
: Preference(category, name), _getter(getter), _setter(setter) { }
|
||||||
|
|
||||||
|
int getValue() const { return _value; }
|
||||||
|
void setValue(const int& value) { if (_value != value) { _value = value; emitValueChanged(); } }
|
||||||
|
void load() override { _value = _getter(); }
|
||||||
|
void save() const override {
|
||||||
|
int oldValue = _getter();
|
||||||
|
if (_value != oldValue) {
|
||||||
|
_setter(_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float getMin() const { return _min; }
|
float getMin() const { return _min; }
|
||||||
void setMin(float min) { _min = min; };
|
void setMin(float min) { _min = min; };
|
||||||
|
@ -221,6 +241,10 @@ signals:
|
||||||
void valueChanged();
|
void valueChanged();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
int _value;
|
||||||
|
const Getter _getter;
|
||||||
|
const Setter _setter;
|
||||||
|
|
||||||
void emitValueChanged() override { emit valueChanged(); }
|
void emitValueChanged() override { emit valueChanged(); }
|
||||||
|
|
||||||
int _min { std::numeric_limits<int>::min() };
|
int _min { std::numeric_limits<int>::min() };
|
||||||
|
@ -229,19 +253,37 @@ protected:
|
||||||
int _decimals { 0 };
|
int _decimals { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
class StringPreference : public TypedPreference<QString> {
|
class StringPreference : public Preference {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(QString value READ getValue WRITE setValue NOTIFY valueChanged)
|
Q_PROPERTY(QString value READ getValue WRITE setValue NOTIFY valueChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
using Getter = std::function<QString()>;
|
||||||
|
using Setter = std::function<void(const QString&)>;
|
||||||
|
|
||||||
StringPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
StringPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
||||||
: TypedPreference(category, name, getter, setter) { }
|
: Preference(category, name), _getter(getter), _setter(setter) { }
|
||||||
|
|
||||||
|
|
||||||
|
QString getValue() const { return _value; }
|
||||||
|
void setValue(const QString& value) { if (_value != value) { _value = value; emitValueChanged(); } }
|
||||||
|
void load() override { _value = _getter(); }
|
||||||
|
void save() const override {
|
||||||
|
QString oldValue = _getter();
|
||||||
|
if (_value != oldValue) {
|
||||||
|
_setter(_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void valueChanged();
|
void valueChanged();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void emitValueChanged() override { emit valueChanged(); }
|
void emitValueChanged() override { emit valueChanged(); }
|
||||||
|
|
||||||
|
QString _value;
|
||||||
|
const Getter _getter;
|
||||||
|
const Setter _setter;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SliderPreference : public FloatPreference {
|
class SliderPreference : public FloatPreference {
|
||||||
|
@ -303,7 +345,7 @@ public:
|
||||||
ComboBoxPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
ComboBoxPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
||||||
: EditPreference(category, name, getter, setter) { }
|
: EditPreference(category, name, getter, setter) { }
|
||||||
Type getType() override { return ComboBox; }
|
Type getType() override { return ComboBox; }
|
||||||
|
|
||||||
const QStringList& getItems() { return _items; }
|
const QStringList& getItems() { return _items; }
|
||||||
void setItems(const QStringList& items) { _items = items; }
|
void setItems(const QStringList& items) { _items = items; }
|
||||||
|
|
||||||
|
@ -342,6 +384,9 @@ class CheckPreference : public BoolPreference {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(bool indented READ getIndented CONSTANT)
|
Q_PROPERTY(bool indented READ getIndented CONSTANT)
|
||||||
public:
|
public:
|
||||||
|
using Getter = std::function<bool()>;
|
||||||
|
using Setter = std::function<void(const bool&)>;
|
||||||
|
|
||||||
CheckPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
CheckPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
||||||
: BoolPreference(category, name, getter, setter) { }
|
: BoolPreference(category, name, getter, setter) { }
|
||||||
Type getType() override { return Checkbox; }
|
Type getType() override { return Checkbox; }
|
||||||
|
|
Loading…
Reference in a new issue