JsonWizard: Support fixup expandos for lineedits on FieldPages

The fixup expando will be applied before validating a string in a
lineedit. It uses the special "%{INPUT}" variable for its input and
any change will be applied to the LineEdit.

Change-Id: Ia496eacdbe541d418acb4a977c274527387896ca
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
This commit is contained in:
Tobias Hunger
2014-11-13 15:54:26 +01:00
parent 040b8855c4
commit 5e54037fc6
3 changed files with 106 additions and 49 deletions

View File

@@ -27,7 +27,10 @@
"trDisplayName": "Component name:", "trDisplayName": "Component name:",
"mandatory": true, "mandatory": true,
"type": "LineEdit", "type": "LineEdit",
"data": { "validator": "(?:[A-Z_][a-zA-Z_0-9]*|)" } "data": {
"validator": "(?:[A-Z_][a-zA-Z_0-9]*|)",
"fixup": "%{JS: '%{INPUT}'.charAt(0).toUpperCase() + '%{INPUT}'.slice(1) }"
}
}, },
{ {
@@ -42,6 +45,7 @@
"type": "LineEdit", "type": "LineEdit",
"data": { "data": {
"validator": "(?:[A-Z_][a-zA-Z_0-9]*|)", "validator": "(?:[A-Z_][a-zA-Z_0-9]*|)",
"fixup": "%{JS: '%{INPUT}'.charAt(0).toUpperCase() + '%{INPUT}'.slice(1) }",
"trText": "%{Class}Form" "trText": "%{Class}Form"
} }
}, },

View File

@@ -45,7 +45,6 @@
#include <QFormLayout> #include <QFormLayout>
#include <QLabel> #include <QLabel>
#include <QLineEdit> #include <QLineEdit>
#include <QRegularExpression>
#include <QRegularExpressionValidator> #include <QRegularExpressionValidator>
#include <QTextEdit> #include <QTextEdit>
#include <QVariant> #include <QVariant>
@@ -88,6 +87,45 @@ static JsonFieldPage::Field *createFieldData(const QString &type)
return 0; return 0;
} }
class LineEditValidator : public QRegularExpressionValidator
{
public:
LineEditValidator(MacroExpander *expander, const QRegularExpression &pattern, QObject *parent) :
QRegularExpressionValidator(pattern, parent)
{
m_expander.setDisplayName(tr("Line Edit Validator Expander"));
m_expander.setAccumulating(true);
m_expander.registerVariable("INPUT", tr("The text edit input to fix up."),
[this]() { return m_currentInput; });
m_expander.registerSubProvider([expander]() -> Utils::MacroExpander * { return expander; });
}
void setFixupExpando(const QString &expando)
{
m_fixupExpando = expando;
}
QValidator::State validate(QString &input, int &pos) const
{
fixup(input);
return QRegularExpressionValidator::validate(input, pos);
}
void fixup(QString &fixup) const
{
if (m_fixupExpando.isEmpty())
return;
m_currentInput = fixup;
fixup = m_expander.expand(m_fixupExpando);
}
private:
MacroExpander m_expander;
QString m_fixupExpando;
mutable QString m_currentInput;
};
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// JsonFieldPage::FieldData: // JsonFieldPage::FieldData:
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@@ -144,7 +182,7 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString
void JsonFieldPage::Field::createWidget(JsonFieldPage *page) void JsonFieldPage::Field::createWidget(JsonFieldPage *page)
{ {
QWidget *w = widget(displayName); QWidget *w = widget(displayName, page);
w->setObjectName(name); w->setObjectName(name);
QFormLayout *layout = page->layout(); QFormLayout *layout = page->layout();
@@ -200,9 +238,10 @@ bool JsonFieldPage::LabelField::parseData(const QVariant &data, QString *errorMe
return true; return true;
} }
QWidget *JsonFieldPage::LabelField::widget(const QString &displayName) QWidget *JsonFieldPage::LabelField::widget(const QString &displayName, JsonFieldPage *page)
{ {
Q_UNUSED(displayName); Q_UNUSED(displayName);
Q_UNUSED(page);
QTC_ASSERT(!m_widget, return m_widget); QTC_ASSERT(!m_widget, return m_widget);
QLabel *w = new QLabel(); QLabel *w = new QLabel();
@@ -246,9 +285,10 @@ bool JsonFieldPage::SpacerField::parseData(const QVariant &data, QString *errorM
return true; return true;
} }
QWidget *JsonFieldPage::SpacerField::widget(const QString &displayName) QWidget *JsonFieldPage::SpacerField::widget(const QString &displayName, JsonFieldPage *page)
{ {
Q_UNUSED(displayName); Q_UNUSED(displayName);
Q_UNUSED(page);
QTC_ASSERT(!m_widget, return m_widget); QTC_ASSERT(!m_widget, return m_widget);
int size = qApp->style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing) * m_factor; int size = qApp->style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing) * m_factor;
@@ -264,15 +304,9 @@ QWidget *JsonFieldPage::SpacerField::widget(const QString &displayName)
// JsonFieldPage::LineEditFieldData: // JsonFieldPage::LineEditFieldData:
// -------------------------------------------------------------------- // --------------------------------------------------------------------
JsonFieldPage::LineEditField::LineEditField() : JsonFieldPage::LineEditField::LineEditField() : m_isModified(false), m_isValidating(false)
m_validatorRegExp(0), m_isModified(false)
{ } { }
JsonFieldPage::LineEditField::~LineEditField()
{
delete m_validatorRegExp;
}
bool JsonFieldPage::LineEditField::parseData(const QVariant &data, QString *errorMessage) bool JsonFieldPage::LineEditField::parseData(const QVariant &data, QString *errorMessage)
{ {
if (data.isNull()) if (data.isNull())
@@ -291,29 +325,31 @@ bool JsonFieldPage::LineEditField::parseData(const QVariant &data, QString *erro
m_placeholderText = JsonWizardFactory::localizedString(tmp.value(QLatin1String("trPlaceholder")).toString()); m_placeholderText = JsonWizardFactory::localizedString(tmp.value(QLatin1String("trPlaceholder")).toString());
QString pattern = tmp.value(QLatin1String("validator")).toString(); QString pattern = tmp.value(QLatin1String("validator")).toString();
if (!pattern.isEmpty()) { if (!pattern.isEmpty()) {
m_validatorRegExp = new QRegularExpression(pattern); m_validatorRegExp = QRegularExpression(pattern);
if (!m_validatorRegExp->isValid()) { if (!m_validatorRegExp.isValid()) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage",
"Invalid regular expression \"%1\" in \"validator\".") "Invalid regular expression \"%1\" in \"validator\".")
.arg(pattern); .arg(pattern);
delete m_validatorRegExp; m_validatorRegExp = QRegularExpression();
m_validatorRegExp = 0;
return false; return false;
} }
} }
m_fixupExpando = tmp.value(QLatin1String("fixup")).toString();
return true; return true;
} }
QWidget *JsonFieldPage::LineEditField::widget(const QString &displayName) QWidget *JsonFieldPage::LineEditField::widget(const QString &displayName, JsonFieldPage *page)
{ {
Q_UNUSED(displayName); Q_UNUSED(displayName);
QTC_ASSERT(!m_widget, return m_widget); QTC_ASSERT(!m_widget, return m_widget);
QLineEdit *w = new QLineEdit; QLineEdit *w = new QLineEdit;
connect(w, &QLineEdit::textEdited, [this](){ m_isModified = true; });
if (m_validatorRegExp) if (m_validatorRegExp.isValid()) {
w->setValidator(new QRegularExpressionValidator(*m_validatorRegExp, w)); LineEditValidator *lv = new LineEditValidator(page->expander(), m_validatorRegExp, w);
lv->setFixupExpando(m_fixupExpando);
w->setValidator(lv);
}
m_widget = w; m_widget = w;
return m_widget; return m_widget;
@@ -323,25 +359,37 @@ void JsonFieldPage::LineEditField::setup(JsonFieldPage *page, const QString &nam
{ {
QLineEdit *w = static_cast<QLineEdit *>(m_widget); QLineEdit *w = static_cast<QLineEdit *>(m_widget);
page->registerFieldWithName(name, w); page->registerFieldWithName(name, w);
connect(w, &QLineEdit::textChanged, page, [page](QString) { page->completeChanged(); }); connect(w, &QLineEdit::textChanged,
page, [this, page]() -> void { m_isModified = true; emit page->completeChanged(); });
} }
bool JsonFieldPage::LineEditField::validate(MacroExpander *expander, QString *message) bool JsonFieldPage::LineEditField::validate(MacroExpander *expander, QString *message)
{ {
Q_UNUSED(message); Q_UNUSED(message);
if (m_isValidating)
return true;
m_isValidating = true;
QLineEdit *w = static_cast<QLineEdit *>(m_widget); QLineEdit *w = static_cast<QLineEdit *>(m_widget);
if (!m_isModified) { if (w->isEnabled()) {
w->setText(expander->expand(m_defaultText)); if (m_isModified) {
} else if (!w->isEnabled() && !m_disabledText.isNull() && m_currentText.isNull()) { if (!m_currentText.isNull()) {
m_currentText = w->text(); w->setText(m_currentText);
w->setText(expander->expand(m_disabledText)); m_currentText.clear();
} else if (w->isEnabled() && !m_currentText.isNull()) { }
w->setText(m_currentText); } else {
m_currentText.clear(); w->setText(expander->expand(m_defaultText));
m_isModified = false;
}
} else {
if (!m_disabledText.isNull() && m_currentText.isNull())
m_currentText = w->text();
} }
// TODO: Add support for validators m_isValidating = false;
return !w->text().isEmpty(); return !w->text().isEmpty();
} }
@@ -349,11 +397,12 @@ void JsonFieldPage::LineEditField::initializeData(MacroExpander *expander)
{ {
QTC_ASSERT(m_widget, return); QTC_ASSERT(m_widget, return);
m_isModified = false;
QLineEdit *w = static_cast<QLineEdit *>(m_widget); QLineEdit *w = static_cast<QLineEdit *>(m_widget);
m_isValidating = true;
w->setText(expander->expand(m_defaultText)); w->setText(expander->expand(m_defaultText));
w->setPlaceholderText(m_placeholderText); w->setPlaceholderText(m_placeholderText);
m_isModified = false;
m_isValidating = false;
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@@ -385,10 +434,11 @@ bool JsonFieldPage::TextEditField::parseData(const QVariant &data, QString *erro
return true; return true;
} }
QWidget *JsonFieldPage::TextEditField::widget(const QString &displayName) QWidget *JsonFieldPage::TextEditField::widget(const QString &displayName, JsonFieldPage *page)
{ {
// TODO: Set up modification monitoring... // TODO: Set up modification monitoring...
Q_UNUSED(displayName); Q_UNUSED(displayName);
Q_UNUSED(page);
QTC_ASSERT(!m_widget, return m_widget); QTC_ASSERT(!m_widget, return m_widget);
QTextEdit *w = new QTextEdit; QTextEdit *w = new QTextEdit;
w->setAcceptRichText(m_acceptRichText); w->setAcceptRichText(m_acceptRichText);
@@ -478,9 +528,10 @@ bool JsonFieldPage::PathChooserField::parseData(const QVariant &data, QString *e
return true; return true;
} }
QWidget *JsonFieldPage::PathChooserField::widget(const QString &displayName) QWidget *JsonFieldPage::PathChooserField::widget(const QString &displayName, JsonFieldPage *page)
{ {
Q_UNUSED(displayName); Q_UNUSED(displayName);
Q_UNUSED(page);
QTC_ASSERT(!m_widget, return m_widget); QTC_ASSERT(!m_widget, return m_widget);
m_widget = new PathChooser; m_widget = new PathChooser;
return m_widget; return m_widget;
@@ -556,8 +607,9 @@ bool JsonFieldPage::CheckBoxField::parseData(const QVariant &data, QString *erro
return true; return true;
} }
QWidget *JsonFieldPage::CheckBoxField::widget(const QString &displayName) QWidget *JsonFieldPage::CheckBoxField::widget(const QString &displayName, JsonFieldPage *page)
{ {
Q_UNUSED(page);
QTC_ASSERT(!m_widget, return m_widget); QTC_ASSERT(!m_widget, return m_widget);
TextFieldCheckBox *w = new TextFieldCheckBox(displayName); TextFieldCheckBox *w = new TextFieldCheckBox(displayName);
m_widget = w; m_widget = w;
@@ -671,9 +723,10 @@ bool JsonFieldPage::ComboBoxField::parseData(const QVariant &data, QString *erro
return true; return true;
} }
QWidget *JsonFieldPage::ComboBoxField::widget(const QString &displayName) QWidget *JsonFieldPage::ComboBoxField::widget(const QString &displayName, JsonFieldPage *page)
{ {
Q_UNUSED(displayName); Q_UNUSED(displayName);
Q_UNUSED(page);
QTC_ASSERT(!m_widget, return m_widget); QTC_ASSERT(!m_widget, return m_widget);
m_widget = new TextFieldComboBox; m_widget = new TextFieldComboBox;
return m_widget; return m_widget;

View File

@@ -34,13 +34,13 @@
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <utils/wizardpage.h> #include <utils/wizardpage.h>
#include <QRegularExpression>
#include <QVariant> #include <QVariant>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFormLayout; class QFormLayout;
class QLabel; class QLabel;
class QLineEdit; class QLineEdit;
class QRegularExpression;
class QTextEdit; class QTextEdit;
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -90,7 +90,7 @@ public:
virtual bool parseData(const QVariant &data, QString *errorMessage) = 0; virtual bool parseData(const QVariant &data, QString *errorMessage) = 0;
virtual void initializeData(Utils::MacroExpander *expander) { Q_UNUSED(expander); } virtual void initializeData(Utils::MacroExpander *expander) { Q_UNUSED(expander); }
virtual QWidget *widget(const QString &displayName) = 0; virtual QWidget *widget(const QString &displayName, JsonFieldPage *page) = 0;
virtual void setup(JsonFieldPage *page, const QString &name) virtual void setup(JsonFieldPage *page, const QString &name)
{ Q_UNUSED(page); Q_UNUSED(name); } { Q_UNUSED(page); Q_UNUSED(name); }
@@ -103,7 +103,7 @@ public:
LabelField(); LabelField();
private: private:
QWidget *widget(const QString &displayName); QWidget *widget(const QString &displayName, JsonFieldPage *page);
bool parseData(const QVariant &data, QString *errorMessage); bool parseData(const QVariant &data, QString *errorMessage);
bool m_wordWrap; bool m_wordWrap;
@@ -119,7 +119,7 @@ public:
private: private:
bool parseData(const QVariant &data, QString *errorMessage); bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName); QWidget *widget(const QString &displayName, JsonFieldPage *page);
int m_factor; int m_factor;
}; };
@@ -128,23 +128,23 @@ public:
{ {
public: public:
LineEditField(); LineEditField();
~LineEditField();
private: private:
bool parseData(const QVariant &data, QString *errorMessage); bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName); QWidget *widget(const QString &displayName, JsonFieldPage *page);
void setup(JsonFieldPage *page, const QString &name); void setup(JsonFieldPage *page, const QString &name);
bool validate(Utils::MacroExpander *expander, QString *message); bool validate(Utils::MacroExpander *expander, QString *message);
void initializeData(Utils::MacroExpander *expander); void initializeData(Utils::MacroExpander *expander);
bool m_isModified;
bool m_isValidating;
QString m_placeholderText; QString m_placeholderText;
QString m_defaultText; QString m_defaultText;
QString m_disabledText; QString m_disabledText;
QRegularExpression *m_validatorRegExp; QRegularExpression m_validatorRegExp;
QString m_fixupExpando;
bool m_isModified;
mutable QString m_currentText; mutable QString m_currentText;
}; };
@@ -155,7 +155,7 @@ public:
private: private:
bool parseData(const QVariant &data, QString *errorMessage); bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName); QWidget *widget(const QString &displayName, JsonFieldPage *page);
void setup(JsonFieldPage *page, const QString &name); void setup(JsonFieldPage *page, const QString &name);
@@ -177,7 +177,7 @@ public:
private: private:
bool parseData(const QVariant &data, QString *errorMessage); bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName); QWidget *widget(const QString &displayName, JsonFieldPage *page);
void setEnabled(bool e); void setEnabled(bool e);
void setup(JsonFieldPage *page, const QString &name); void setup(JsonFieldPage *page, const QString &name);
@@ -202,7 +202,7 @@ public:
private: private:
bool parseData(const QVariant &data, QString *errorMessage); bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName); QWidget *widget(const QString &displayName, JsonFieldPage *page);
void setup(JsonFieldPage *page, const QString &name); void setup(JsonFieldPage *page, const QString &name);
@@ -224,7 +224,7 @@ public:
private: private:
bool parseData(const QVariant &data, QString *errorMessage); bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName); QWidget *widget(const QString &displayName, JsonFieldPage *page);
void setup(JsonFieldPage *page, const QString &name); void setup(JsonFieldPage *page, const QString &name);