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 <tim.jenssen@qt.io>
This commit is contained in:
Tim Jenssen
2017-09-26 11:00:21 +02:00
parent defcb6a55a
commit 7dbd399a97
3 changed files with 56 additions and 11 deletions

View File

@@ -31,9 +31,44 @@
#include <QString>
#include <QWizardPage>
#include <functional>
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 <class T, typename... Arguments>
static ObjectToFieldWidgetConverter *create(T *sender, void (T::*member)(Arguments...), const std::function<QString()> &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<QString()> 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<class T, typename... Arguments>
void registerObjectAsFieldWithName(const QString &name, T *sender, void (T::*changeSignal)(Arguments...),
const std::function<QString()> &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);

View File

@@ -33,7 +33,6 @@
#include <utils/fancylineedit.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <utils/textfieldcheckbox.h>
#include <utils/textfieldcombobox.h>
#include <utils/theme/theme.h>
@@ -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<TextFieldCheckBox *>(widget());
auto w = qobject_cast<QCheckBox *>(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<QCheckBox>(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<TextFieldCheckBox *>(widget());
auto w = qobject_cast<QCheckBox *>(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<TextFieldCheckBox *>(widget());
auto w = qobject_cast<QCheckBox *>(widget());
QTC_ASSERT(widget(), return);
w->setTrueText(expander->expand(m_checkedValue));
w->setFalseText(expander->expand(m_uncheckedValue));
w->setChecked(JsonWizard::boolFromVariant(m_checkedExpression, expander));
}

View File

@@ -42,7 +42,6 @@ QT_END_NAMESPACE
namespace Utils {
class MacroExpander;
class TextFieldCheckBox;
class TextFieldComboBox;
} // namespace Utils