diff --git a/share/qtcreator/templates/wizards/classes/qtquickui/wizard.json b/share/qtcreator/templates/wizards/classes/qtquickui/wizard.json index ea912652f45..08de27a95e4 100644 --- a/share/qtcreator/templates/wizards/classes/qtquickui/wizard.json +++ b/share/qtcreator/templates/wizards/classes/qtquickui/wizard.json @@ -27,7 +27,10 @@ "trDisplayName": "Component name:", "mandatory": true, "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", "data": { "validator": "(?:[A-Z_][a-zA-Z_0-9]*|)", + "fixup": "%{JS: '%{INPUT}'.charAt(0).toUpperCase() + '%{INPUT}'.slice(1) }", "trText": "%{Class}Form" } }, diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index 23a899ba7d8..baa03b0d51f 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -45,7 +45,6 @@ #include #include #include -#include #include #include #include @@ -88,6 +87,45 @@ static JsonFieldPage::Field *createFieldData(const QString &type) 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: // -------------------------------------------------------------------- @@ -144,7 +182,7 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString void JsonFieldPage::Field::createWidget(JsonFieldPage *page) { - QWidget *w = widget(displayName); + QWidget *w = widget(displayName, page); w->setObjectName(name); QFormLayout *layout = page->layout(); @@ -200,9 +238,10 @@ bool JsonFieldPage::LabelField::parseData(const QVariant &data, QString *errorMe return true; } -QWidget *JsonFieldPage::LabelField::widget(const QString &displayName) +QWidget *JsonFieldPage::LabelField::widget(const QString &displayName, JsonFieldPage *page) { Q_UNUSED(displayName); + Q_UNUSED(page); QTC_ASSERT(!m_widget, return m_widget); QLabel *w = new QLabel(); @@ -246,9 +285,10 @@ bool JsonFieldPage::SpacerField::parseData(const QVariant &data, QString *errorM return true; } -QWidget *JsonFieldPage::SpacerField::widget(const QString &displayName) +QWidget *JsonFieldPage::SpacerField::widget(const QString &displayName, JsonFieldPage *page) { Q_UNUSED(displayName); + Q_UNUSED(page); QTC_ASSERT(!m_widget, return m_widget); int size = qApp->style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing) * m_factor; @@ -264,15 +304,9 @@ QWidget *JsonFieldPage::SpacerField::widget(const QString &displayName) // JsonFieldPage::LineEditFieldData: // -------------------------------------------------------------------- -JsonFieldPage::LineEditField::LineEditField() : - m_validatorRegExp(0), m_isModified(false) +JsonFieldPage::LineEditField::LineEditField() : m_isModified(false), m_isValidating(false) { } -JsonFieldPage::LineEditField::~LineEditField() -{ - delete m_validatorRegExp; -} - bool JsonFieldPage::LineEditField::parseData(const QVariant &data, QString *errorMessage) { 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()); QString pattern = tmp.value(QLatin1String("validator")).toString(); if (!pattern.isEmpty()) { - m_validatorRegExp = new QRegularExpression(pattern); - if (!m_validatorRegExp->isValid()) { + m_validatorRegExp = QRegularExpression(pattern); + if (!m_validatorRegExp.isValid()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "Invalid regular expression \"%1\" in \"validator\".") .arg(pattern); - delete m_validatorRegExp; - m_validatorRegExp = 0; + m_validatorRegExp = QRegularExpression(); return false; } } + m_fixupExpando = tmp.value(QLatin1String("fixup")).toString(); return true; } -QWidget *JsonFieldPage::LineEditField::widget(const QString &displayName) +QWidget *JsonFieldPage::LineEditField::widget(const QString &displayName, JsonFieldPage *page) { Q_UNUSED(displayName); QTC_ASSERT(!m_widget, return m_widget); QLineEdit *w = new QLineEdit; - connect(w, &QLineEdit::textEdited, [this](){ m_isModified = true; }); - if (m_validatorRegExp) - w->setValidator(new QRegularExpressionValidator(*m_validatorRegExp, w)); + if (m_validatorRegExp.isValid()) { + LineEditValidator *lv = new LineEditValidator(page->expander(), m_validatorRegExp, w); + lv->setFixupExpando(m_fixupExpando); + w->setValidator(lv); + } m_widget = w; return m_widget; @@ -323,25 +359,37 @@ void JsonFieldPage::LineEditField::setup(JsonFieldPage *page, const QString &nam { QLineEdit *w = static_cast(m_widget); 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) { Q_UNUSED(message); + if (m_isValidating) + return true; + + m_isValidating = true; + QLineEdit *w = static_cast(m_widget); - if (!m_isModified) { - w->setText(expander->expand(m_defaultText)); - } else if (!w->isEnabled() && !m_disabledText.isNull() && m_currentText.isNull()) { - m_currentText = w->text(); - w->setText(expander->expand(m_disabledText)); - } else if (w->isEnabled() && !m_currentText.isNull()) { - w->setText(m_currentText); - m_currentText.clear(); + if (w->isEnabled()) { + if (m_isModified) { + if (!m_currentText.isNull()) { + w->setText(m_currentText); + m_currentText.clear(); + } + } else { + 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(); } @@ -349,11 +397,12 @@ void JsonFieldPage::LineEditField::initializeData(MacroExpander *expander) { QTC_ASSERT(m_widget, return); - m_isModified = false; - QLineEdit *w = static_cast(m_widget); + m_isValidating = true; w->setText(expander->expand(m_defaultText)); 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; } -QWidget *JsonFieldPage::TextEditField::widget(const QString &displayName) +QWidget *JsonFieldPage::TextEditField::widget(const QString &displayName, JsonFieldPage *page) { // TODO: Set up modification monitoring... Q_UNUSED(displayName); + Q_UNUSED(page); QTC_ASSERT(!m_widget, return m_widget); QTextEdit *w = new QTextEdit; w->setAcceptRichText(m_acceptRichText); @@ -478,9 +528,10 @@ bool JsonFieldPage::PathChooserField::parseData(const QVariant &data, QString *e return true; } -QWidget *JsonFieldPage::PathChooserField::widget(const QString &displayName) +QWidget *JsonFieldPage::PathChooserField::widget(const QString &displayName, JsonFieldPage *page) { Q_UNUSED(displayName); + Q_UNUSED(page); QTC_ASSERT(!m_widget, return m_widget); m_widget = new PathChooser; return m_widget; @@ -556,8 +607,9 @@ bool JsonFieldPage::CheckBoxField::parseData(const QVariant &data, QString *erro 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); TextFieldCheckBox *w = new TextFieldCheckBox(displayName); m_widget = w; @@ -671,9 +723,10 @@ bool JsonFieldPage::ComboBoxField::parseData(const QVariant &data, QString *erro return true; } -QWidget *JsonFieldPage::ComboBoxField::widget(const QString &displayName) +QWidget *JsonFieldPage::ComboBoxField::widget(const QString &displayName, JsonFieldPage *page) { Q_UNUSED(displayName); + Q_UNUSED(page); QTC_ASSERT(!m_widget, return m_widget); m_widget = new TextFieldComboBox; return m_widget; diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h index 9219fe50d62..8c8c564da81 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h @@ -34,13 +34,13 @@ #include #include +#include #include QT_BEGIN_NAMESPACE class QFormLayout; class QLabel; class QLineEdit; -class QRegularExpression; class QTextEdit; QT_END_NAMESPACE @@ -90,7 +90,7 @@ public: virtual bool parseData(const QVariant &data, QString *errorMessage) = 0; 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) { Q_UNUSED(page); Q_UNUSED(name); } @@ -103,7 +103,7 @@ public: LabelField(); private: - QWidget *widget(const QString &displayName); + QWidget *widget(const QString &displayName, JsonFieldPage *page); bool parseData(const QVariant &data, QString *errorMessage); bool m_wordWrap; @@ -119,7 +119,7 @@ public: private: bool parseData(const QVariant &data, QString *errorMessage); - QWidget *widget(const QString &displayName); + QWidget *widget(const QString &displayName, JsonFieldPage *page); int m_factor; }; @@ -128,23 +128,23 @@ public: { public: LineEditField(); - ~LineEditField(); private: 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); bool validate(Utils::MacroExpander *expander, QString *message); void initializeData(Utils::MacroExpander *expander); + bool m_isModified; + bool m_isValidating; QString m_placeholderText; QString m_defaultText; QString m_disabledText; - QRegularExpression *m_validatorRegExp; - - bool m_isModified; + QRegularExpression m_validatorRegExp; + QString m_fixupExpando; mutable QString m_currentText; }; @@ -155,7 +155,7 @@ public: private: 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); @@ -177,7 +177,7 @@ public: private: bool parseData(const QVariant &data, QString *errorMessage); - QWidget *widget(const QString &displayName); + QWidget *widget(const QString &displayName, JsonFieldPage *page); void setEnabled(bool e); void setup(JsonFieldPage *page, const QString &name); @@ -202,7 +202,7 @@ public: private: 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); @@ -224,7 +224,7 @@ public: private: 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);