From 7dbd399a97b10190447e1c93cd7e5110b1306dc3 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 26 Sep 2017 11:00:21 +0200 Subject: [PATCH] Wizards: introduce ObjectToFieldWidgetConverter With it as a wrapper we can register any QObject to use widget based field mechanism from QWizard. It also helps to avoid the necessity for inheritance to just adjust the text property of a widget. Can not remove the TextCheckBox, because it is used in some old C++ wizards. Change-Id: I85a85a834714a4b38b501c13357fa8c8bb02b5bd Reviewed-by: Tim Jenssen --- src/libs/utils/wizardpage.h | 42 +++++++++++++++++++ .../jsonwizard/jsonfieldpage.cpp | 24 ++++++----- .../jsonwizard/jsonfieldpage.h | 1 - 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/src/libs/utils/wizardpage.h b/src/libs/utils/wizardpage.h index 16944668ea1..87fac3ba8db 100644 --- a/src/libs/utils/wizardpage.h +++ b/src/libs/utils/wizardpage.h @@ -31,9 +31,44 @@ #include #include +#include + namespace Utils { class Wizard; +namespace Internal { + +class QTCREATOR_UTILS_EXPORT ObjectToFieldWidgetConverter : public QWidget +{ + Q_OBJECT + Q_PROPERTY(QString text READ text NOTIFY textChanged) + +public: + template + static ObjectToFieldWidgetConverter *create(T *sender, void (T::*member)(Arguments...), const std::function &toTextFunction) + { + auto widget = new ObjectToFieldWidgetConverter(); + widget->toTextFunction = toTextFunction; + connect(sender, &QObject::destroyed, widget, &QObject::deleteLater); + connect(sender, member, widget, [widget] () { + emit widget->textChanged(widget->text()); + }); + return widget; + } + +signals: + void textChanged(const QString&); + +private: + ObjectToFieldWidgetConverter () = default; + + // is used by the property text + QString text() {return toTextFunction();} + std::function toTextFunction; +}; + +} // Internal + class QTCREATOR_UTILS_EXPORT WizardPage : public QWizardPage { Q_OBJECT @@ -43,6 +78,13 @@ public: virtual void pageWasAdded(); // called when this page was added to a Utils::Wizard + template + void registerObjectAsFieldWithName(const QString &name, T *sender, void (T::*changeSignal)(Arguments...), + const std::function &senderToString) + { + registerFieldWithName(name, Internal::ObjectToFieldWidgetConverter::create(sender, changeSignal, senderToString), "text", SIGNAL(textChanged(QString))); + } + void registerFieldWithName(const QString &name, QWidget *widget, const char *property = 0, const char *changedSignal = 0); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index a207e1863ca..bb625cf889a 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -702,16 +701,23 @@ bool CheckBoxField::parseData(const QVariant &data, QString *errorMessage) QWidget *CheckBoxField::createWidget(const QString &displayName, JsonFieldPage *page) { Q_UNUSED(page); - return new TextFieldCheckBox(displayName); + return new QCheckBox(displayName); } void CheckBoxField::setup(JsonFieldPage *page, const QString &name) { - auto w = qobject_cast(widget()); + auto w = qobject_cast(widget()); QTC_ASSERT(w, return); - QObject::connect(w, &TextFieldCheckBox::clicked, - page, [this, page]() { m_isModified = true; page->completeChanged();}); - page->registerFieldWithName(name, w, "compareText", SIGNAL(textChanged(QString))); + page->registerObjectAsFieldWithName(name, w, &QCheckBox::stateChanged, [this, page, w] () -> QString { + if (w->checkState() == Qt::Checked) + return page->expander()->expand(m_checkedValue); + return page->expander()->expand(m_uncheckedValue); + }); + + QObject::connect(w, &QCheckBox::stateChanged, page, [this, page]() { + m_isModified = true; + emit page->completeChanged(); + }); } bool CheckBoxField::validate(MacroExpander *expander, QString *message) @@ -720,7 +726,7 @@ bool CheckBoxField::validate(MacroExpander *expander, QString *message) return false; if (!m_isModified) { - auto w = qobject_cast(widget()); + auto w = qobject_cast(widget()); QTC_ASSERT(w, return false); w->setChecked(JsonWizard::boolFromVariant(m_checkedExpression, expander)); } @@ -729,10 +735,8 @@ bool CheckBoxField::validate(MacroExpander *expander, QString *message) void CheckBoxField::initializeData(MacroExpander *expander) { - auto w = qobject_cast(widget()); + auto w = qobject_cast(widget()); QTC_ASSERT(widget(), return); - w->setTrueText(expander->expand(m_checkedValue)); - w->setFalseText(expander->expand(m_uncheckedValue)); w->setChecked(JsonWizard::boolFromVariant(m_checkedExpression, expander)); } diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h index b9eb6692a14..f21d3a7d466 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h @@ -42,7 +42,6 @@ QT_END_NAMESPACE namespace Utils { class MacroExpander; -class TextFieldCheckBox; class TextFieldComboBox; } // namespace Utils