aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/aspects.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/utils/aspects.h')
-rw-r--r--src/libs/utils/aspects.h259
1 files changed, 151 insertions, 108 deletions
diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h
index 3c69306214..cc603edf54 100644
--- a/src/libs/utils/aspects.h
+++ b/src/libs/utils/aspects.h
@@ -51,12 +51,12 @@ public:
Id id() const;
void setId(Id id);
- QVariant value() const;
- void setValue(const QVariant &value);
- bool setValueQuietly(const QVariant &value);
+ virtual QVariant variantValue() const;
+ virtual void setVariantValue(const QVariant &value);
+ virtual void setVariantValueQuietly(const QVariant &value);
- QVariant defaultValue() const;
- void setDefaultValue(const QVariant &value);
+ virtual QVariant defaultVariantValue() const;
+ virtual void setDefaultVariantValue(const QVariant &value);
QString settingsKey() const;
void setSettingsKey(const QString &settingsKey);
@@ -100,10 +100,6 @@ public:
virtual void addToLayout(Layouting::LayoutItem &parent);
- virtual QVariant volatileValue() const;
- virtual void setVolatileValue(const QVariant &val);
- virtual void emitChangedValue() {}
-
virtual void readSettings(const QSettings *settings);
virtual void writeSettings(QSettings *settings) const;
@@ -114,9 +110,10 @@ public:
QVariant fromSettingsValue(const QVariant &val) const;
virtual void apply();
+ virtual bool silentApply();
virtual void cancel();
virtual void finish();
- virtual bool isDirty() const;
+ virtual bool isDirty();
bool hasAction() const;
class QTCREATOR_UTILS_EXPORT Data
@@ -164,9 +161,15 @@ public:
signals:
void changed();
+ void volatileValueChanged();
void labelLinkActivated(const QString &link);
protected:
+ virtual void internalToGui();
+ virtual void guiToInternal();
+ virtual bool internalToExternal();
+ virtual void externalToInternal();
+
QLabel *label() const;
void setupLabel();
void addLabeledItem(Layouting::LayoutItem &parent, QWidget *widget);
@@ -208,35 +211,125 @@ private:
QTCREATOR_UTILS_EXPORT void createItem(Layouting::LayoutItem *item, const BaseAspect &aspect);
QTCREATOR_UTILS_EXPORT void createItem(Layouting::LayoutItem *item, const BaseAspect *aspect);
-class QTCREATOR_UTILS_EXPORT BoolAspect : public BaseAspect
+template <typename ValueType>
+class TypedAspect : public BaseAspect
{
- Q_OBJECT
-
public:
- BoolAspect(AspectContainer *container = nullptr);
- ~BoolAspect() override;
+ TypedAspect(AspectContainer *container = nullptr)
+ : BaseAspect(container)
+ {
+ addDataExtractor(this, &TypedAspect::value, &Data::value);
+ }
struct Data : BaseAspect::Data
{
- bool value;
+ ValueType value;
};
+ ValueType operator()() const { return m_external; }
+ ValueType value() const { return m_external; }
+ ValueType defaultValue() const { return m_default; }
+
+ void setDefaultValue(const ValueType &value)
+ {
+ m_default = value;
+ setValue(value);
+ }
+
+ void setValue(const ValueType &value)
+ {
+ m_external = value;
+ if (isDirty()) {
+ externalToInternal();
+ internalToGui();
+ }
+ }
+
+ void setValueQuietly(const ValueType &value)
+ {
+ m_external = value;
+ if (isDirty()) {
+ externalToInternal();
+ internalToGui();
+ }
+ }
+
+ void setVolatileValue(const ValueType &value)
+ {
+ m_internal = value;
+ internalToGui();
+ }
+
+ ValueType volatileValue() const
+ {
+ const_cast<TypedAspect *>(this)->guiToInternal();
+ return m_internal;
+ }
+
+protected:
+ bool isDirty() override
+ {
+ guiToInternal();
+ return m_internal != m_external;
+ }
+
+ bool internalToExternal() override
+ {
+ if (m_external == m_internal)
+ return false;
+ m_external = m_internal;
+ return true;
+ }
+
+ void externalToInternal() override
+ {
+ m_internal = m_external;
+ }
+
+ QVariant variantValue() const override
+ {
+ return QVariant::fromValue<ValueType>(m_external);
+ }
+
+ void setVariantValue(const QVariant &value) override
+ {
+ setValue(value.value<ValueType>());
+ }
+
+ void setVariantValueQuietly(const QVariant &value) override
+ {
+ setValueQuietly(value.value<ValueType>());
+ }
+
+ QVariant defaultVariantValue() const override
+ {
+ return QVariant::fromValue<ValueType>(m_default);
+ }
+
+ void setDefaultVariantValue(const QVariant &value) override
+ {
+ m_default = value.value<ValueType>();
+ }
+
+ ValueType m_default{};
+ ValueType m_external{};
+ ValueType m_internal{};
+};
+
+class QTCREATOR_UTILS_EXPORT BoolAspect : public TypedAspect<bool>
+{
+ Q_OBJECT
+
+public:
+ BoolAspect(AspectContainer *container = nullptr);
+ ~BoolAspect() override;
+
void addToLayout(Layouting::LayoutItem &parent) override;
std::function<void(QObject *)> groupChecker();
Utils::CheckableDecider checkableDecider();
QAction *action() override;
- QVariant volatileValue() const override;
- void setVolatileValue(const QVariant &val) override;
- void emitChangedValue() override;
-
- bool operator()() const { return value(); }
- bool value() const;
- void setValue(bool val);
- bool defaultValue() const;
- void setDefaultValue(bool val);
-
enum class LabelPlacement { AtCheckBox, AtCheckBoxWithoutDummyLabel, InExtraLabel };
void setLabel(const QString &labelText,
LabelPlacement labelPlacement = LabelPlacement::InExtraLabel);
@@ -244,15 +337,14 @@ public:
void adoptButton(QAbstractButton *button);
-signals:
- void valueChanged(bool newValue);
- void volatileValueChanged(bool newValue);
-
private:
+ void internalToGui() override;
+ void guiToInternal() override;
+
std::unique_ptr<Internal::BoolAspectPrivate> d;
};
-class QTCREATOR_UTILS_EXPORT ColorAspect : public BaseAspect
+class QTCREATOR_UTILS_EXPORT ColorAspect : public TypedAspect<QColor>
{
Q_OBJECT
@@ -260,24 +352,16 @@ public:
ColorAspect(AspectContainer *container = nullptr);
~ColorAspect() override;
- struct Data : BaseAspect::Data
- {
- QColor value;
- };
-
void addToLayout(Layouting::LayoutItem &parent) override;
- QColor value() const;
- void setValue(const QColor &val);
-
- QVariant volatileValue() const override;
- void setVolatileValue(const QVariant &val) override;
-
private:
+ void internalToGui() override;
+ void guiToInternal() override;
+
std::unique_ptr<Internal::ColorAspectPrivate> d;
};
-class QTCREATOR_UTILS_EXPORT SelectionAspect : public BaseAspect
+class QTCREATOR_UTILS_EXPORT SelectionAspect : public TypedAspect<int>
{
Q_OBJECT
@@ -286,20 +370,13 @@ public:
~SelectionAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override;
- QVariant volatileValue() const override;
- void setVolatileValue(const QVariant &val) override;
void finish() override;
- int operator()() const { return value(); }
- int value() const;
- void setValue(int val);
-
QString stringValue() const;
void setStringValue(const QString &val);
- int defaultValue() const;
- void setDefaultValue(int val);
void setDefaultValue(const QString &val);
+ void setDefaultValue(int val);
QVariant itemValue() const;
@@ -325,14 +402,15 @@ public:
int indexForItemValue(const QVariant &value) const;
QVariant itemValueForIndex(int index) const;
-signals:
- void volatileValueChanged(int newValue);
+protected:
+ void internalToGui() override;
+ void guiToInternal() override;
private:
std::unique_ptr<Internal::SelectionAspectPrivate> d;
};
-class QTCREATOR_UTILS_EXPORT MultiSelectionAspect : public BaseAspect
+class QTCREATOR_UTILS_EXPORT MultiSelectionAspect : public TypedAspect<QStringList>
{
Q_OBJECT
@@ -345,17 +423,18 @@ public:
enum class DisplayStyle { ListView };
void setDisplayStyle(DisplayStyle style);
- QStringList value() const;
- void setValue(const QStringList &val);
-
QStringList allValues() const;
void setAllValues(const QStringList &val);
+protected:
+ void internalToGui() override;
+ void guiToInternal() override;
+
private:
std::unique_ptr<Internal::MultiSelectionAspectPrivate> d;
};
-class QTCREATOR_UTILS_EXPORT StringAspect : public BaseAspect
+class QTCREATOR_UTILS_EXPORT StringAspect : public TypedAspect<QString>
{
Q_OBJECT
@@ -371,21 +450,13 @@ public:
void addToLayout(Layouting::LayoutItem &parent) override;
- QVariant volatileValue() const override;
- void setVolatileValue(const QVariant &val) override;
- void emitChangedValue() override;
-
// Hook between UI and StringAspect:
using ValueAcceptor = std::function<std::optional<QString>(const QString &, const QString &)>;
void setValueAcceptor(ValueAcceptor &&acceptor);
- QString operator()() const { return value(); }
QString value() const;
void setValue(const QString &val);
- QString defaultValue() const;
- void setDefaultValue(const QString &val);
-
void setShowToolTipOnLabel(bool show);
void setDisplayFilter(const std::function<QString (const QString &)> &displayFilter);
@@ -438,10 +509,10 @@ public:
signals:
void checkedChanged();
- void valueChanged(const QString &newValue);
protected:
- void update();
+ void internalToGui() override;
+ void guiToInternal() override;
std::unique_ptr<Internal::StringAspectPrivate> d;
};
@@ -454,7 +525,7 @@ public:
FilePath operator()() const { return filePath(); }
};
-class QTCREATOR_UTILS_EXPORT IntegerAspect : public BaseAspect
+class QTCREATOR_UTILS_EXPORT IntegerAspect : public TypedAspect<qint64>
{
Q_OBJECT
@@ -464,16 +535,6 @@ public:
void addToLayout(Layouting::LayoutItem &parent) override;
- QVariant volatileValue() const override;
- void setVolatileValue(const QVariant &val) override;
-
- qint64 operator()() const { return value(); }
- qint64 value() const;
- void setValue(qint64 val);
-
- qint64 defaultValue() const;
- void setDefaultValue(qint64 defaultValue);
-
void setRange(qint64 min, qint64 max);
void setLabel(const QString &label); // FIXME: Use setLabelText
void setPrefix(const QString &prefix);
@@ -485,14 +546,15 @@ public:
struct Data : BaseAspect::Data { qint64 value = 0; };
-signals:
- void valueChanged(int newValue);
+protected:
+ void internalToGui() override;
+ void guiToInternal() override;
private:
std::unique_ptr<Internal::IntegerAspectPrivate> d;
};
-class QTCREATOR_UTILS_EXPORT DoubleAspect : public BaseAspect
+class QTCREATOR_UTILS_EXPORT DoubleAspect : public TypedAspect<double>
{
Q_OBJECT
@@ -502,22 +564,16 @@ public:
void addToLayout(Layouting::LayoutItem &parent) override;
- QVariant volatileValue() const override;
- void setVolatileValue(const QVariant &val) override;
-
- double operator()() const { return value(); }
- double value() const;
- void setValue(double val);
-
- double defaultValue() const;
- void setDefaultValue(double defaultValue);
-
void setRange(double min, double max);
void setPrefix(const QString &prefix);
void setSuffix(const QString &suffix);
void setSpecialValueText(const QString &specialText);
void setSingleStep(double step);
+protected:
+ void internalToGui() override;
+ void guiToInternal() override;
+
private:
std::unique_ptr<Internal::DoubleAspectPrivate> d;
};
@@ -532,6 +588,7 @@ public:
int toInt() const { return int(m_value); }
QVariant toVariant() const { return int(m_value); }
+ static TriState fromInt(int value);
static TriState fromVariant(const QVariant &variant);
static const TriState Enabled;
@@ -562,7 +619,7 @@ public:
void setDefaultValue(TriState setting);
};
-class QTCREATOR_UTILS_EXPORT StringListAspect : public BaseAspect
+class QTCREATOR_UTILS_EXPORT StringListAspect : public TypedAspect<QStringList>
{
Q_OBJECT
@@ -572,9 +629,6 @@ public:
void addToLayout(Layouting::LayoutItem &parent) override;
- QStringList value() const;
- void setValue(const QStringList &val);
-
void appendValue(const QString &value, bool allowDuplicates = true);
void removeValue(const QString &value);
void appendValues(const QStringList &values, bool allowDuplicates = true);
@@ -584,7 +638,7 @@ private:
std::unique_ptr<Internal::StringListAspectPrivate> d;
};
-class QTCREATOR_UTILS_EXPORT IntegersAspect : public BaseAspect
+class QTCREATOR_UTILS_EXPORT IntegersAspect : public TypedAspect<QList<int>>
{
Q_OBJECT
@@ -593,17 +647,6 @@ public:
~IntegersAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override;
- void emitChangedValue() override;
-
- QList<int> operator()() const { return value(); }
- QList<int> value() const;
- void setValue(const QList<int> &value);
-
- QList<int> defaultValue() const;
- void setDefaultValue(const QList<int> &value);
-
-signals:
- void valueChanged(const QList<int> &values);
};
class QTCREATOR_UTILS_EXPORT TextDisplay : public BaseAspect