diff options
Diffstat (limited to 'src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp')
-rw-r--r-- | src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp | 134 |
1 files changed, 131 insertions, 3 deletions
diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index 749c660e01..432a22fec1 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -29,6 +29,7 @@ #include "jsonwizard.h" #include "jsonwizardfactory.h" +#include <coreplugin/icore.h> #include <utils/algorithm.h> #include <utils/fancylineedit.h> #include <utils/qtcassert.h> @@ -57,6 +58,7 @@ const char NAME_KEY[] = "name"; const char DISPLAY_NAME_KEY[] = "trDisplayName"; const char TOOLTIP_KEY[] = "trToolTip"; const char MANDATORY_KEY[] = "mandatory"; +const char PERSISTENCE_KEY_KEY[] = "persistenceKey"; const char VISIBLE_KEY[] = "visible"; const char ENABLED_KEY[] = "enabled"; const char SPAN_KEY[] = "span"; @@ -153,6 +155,21 @@ QString JsonFieldPage::Field::type() return d->m_type; } +void JsonFieldPage::Field::setHasUserChanges() +{ + d->m_hasUserChanges = true; +} + +void JsonFieldPage::Field::fromSettings(const QVariant &value) +{ + Q_UNUSED(value); +} + +QVariant JsonFieldPage::Field::toSettings() const +{ + return {}; +} + JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString *errorMessage) { if (input.type() != QVariant::Map) { @@ -192,6 +209,7 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString data->setHasSpan(consumeValue(tmp, SPAN_KEY, false).toBool()); data->setIsCompleteExpando(consumeValue(tmp, IS_COMPLETE_KEY, true), consumeValue(tmp, IS_COMPLETE_MESSAGE_KEY).toString()); + data->setPersistenceKey(consumeValue(tmp, PERSISTENCE_KEY_KEY).toString()); QVariant dataVal = consumeValue(tmp, DATA_KEY); if (!data->parseData(dataVal, errorMessage)) { @@ -295,6 +313,11 @@ QString JsonFieldPage::Field::toolTip() return d->m_toolTip; } +QString JsonFieldPage::Field::persistenceKey() const +{ + return d->m_persistenceKey; +} + bool JsonFieldPage::Field::isMandatory() { return d->m_isMandatory; @@ -305,6 +328,11 @@ bool JsonFieldPage::Field::hasSpan() return d->m_hasSpan; } +bool JsonFieldPage::Field::hasUserChanges() const +{ + return d->m_hasUserChanges; +} + QVariant JsonFieldPage::value(const QString &key) { QVariant v = property(key.toUtf8()); @@ -353,6 +381,11 @@ void JsonFieldPage::Field::setIsCompleteExpando(const QVariant &v, const QString d->m_isCompleteExpandoMessage = m; } +void JsonFieldPage::Field::setPersistenceKey(const QString &key) +{ + d->m_persistenceKey = key; +} + // -------------------------------------------------------------------- // LabelFieldData: // -------------------------------------------------------------------- @@ -494,6 +527,7 @@ QWidget *LineEditField::createWidget(const QString &displayName, JsonFieldPage * w->setHistoryCompleter(m_historyId, m_restoreLastHistoryItem); w->setEchoMode(m_isPassword ? QLineEdit::Password : QLineEdit::Normal); + QObject::connect(w, &FancyLineEdit::textEdited, [this] { setHasUserChanges(); }); return w; } @@ -551,6 +585,16 @@ void LineEditField::initializeData(MacroExpander *expander) m_isValidating = false; } +void LineEditField::fromSettings(const QVariant &value) +{ + m_defaultText = value.toString(); +} + +QVariant LineEditField::toSettings() const +{ + return qobject_cast<FancyLineEdit *>(widget())->text(); +} + // -------------------------------------------------------------------- // TextEditFieldData: // -------------------------------------------------------------------- @@ -585,6 +629,10 @@ QWidget *TextEditField::createWidget(const QString &displayName, JsonFieldPage * Q_UNUSED(page) auto w = new QTextEdit; w->setAcceptRichText(m_acceptRichText); + QObject::connect(w, &QTextEdit::textChanged, [this, w] { + if (w->toPlainText() != m_defaultText) + setHasUserChanges(); + }); return w; } @@ -622,6 +670,16 @@ void TextEditField::initializeData(MacroExpander *expander) w->setPlainText(expander->expand(m_defaultText)); } +void TextEditField::fromSettings(const QVariant &value) +{ + m_defaultText = value.toString(); +} + +QVariant TextEditField::toSettings() const +{ + return qobject_cast<QTextEdit *>(widget())->toPlainText(); +} + // -------------------------------------------------------------------- // PathChooserFieldData: // -------------------------------------------------------------------- @@ -678,6 +736,10 @@ QWidget *PathChooserField::createWidget(const QString &displayName, JsonFieldPag auto w = new PathChooser; if (!m_historyId.isEmpty()) w->setHistoryCompleter(m_historyId); + QObject::connect(w, &PathChooser::pathChanged, [this, w] { + if (w->path() != m_path) + setHasUserChanges(); + }); return w; } @@ -720,6 +782,16 @@ void PathChooserField::initializeData(MacroExpander *expander) w->setPath(m_currentPath); } +void PathChooserField::fromSettings(const QVariant &value) +{ + m_path = value.toString(); +} + +QVariant PathChooserField::toSettings() const +{ + return qobject_cast<PathChooser *>(widget())->path(); +} + // -------------------------------------------------------------------- // CheckBoxFieldData: // -------------------------------------------------------------------- @@ -770,6 +842,7 @@ void CheckBoxField::setup(JsonFieldPage *page, const QString &name) QObject::connect(w, &QCheckBox::stateChanged, page, [this, page]() { m_isModified = true; + setHasUserChanges(); emit page->completeChanged(); }); } @@ -795,6 +868,16 @@ void CheckBoxField::initializeData(MacroExpander *expander) w->setChecked(JsonWizard::boolFromVariant(m_checkedExpression, expander)); } +void CheckBoxField::fromSettings(const QVariant &value) +{ + m_checkedExpression = value; +} + +QVariant CheckBoxField::toSettings() const +{ + return qobject_cast<QCheckBox *>(widget())->isChecked(); +} + // -------------------------------------------------------------------- // ListFieldData: // -------------------------------------------------------------------- @@ -958,7 +1041,7 @@ QStandardItemModel *ListField::itemModel() return m_itemModel; } -QItemSelectionModel *ListField::selectionModel() +QItemSelectionModel *ListField::selectionModel() const { return m_selectionModel; } @@ -991,6 +1074,22 @@ void ListField::updateIndex() } } +void ListField::fromSettings(const QVariant &value) +{ + for (decltype(m_itemList)::size_type i = 0; i < m_itemList.size(); ++i) { + if (m_itemList.at(i)->data(ValueRole) == value) { + m_index = int(i); + break; + } + } +} + +QVariant ListField::toSettings() const +{ + const int idx = selectionModel()->currentIndex().row(); + return idx >= 0 ? m_itemList.at(idx)->data(ValueRole) : QVariant(); +} + void ComboBoxField::setup(JsonFieldPage *page, const QString &name) { auto w = qobject_cast<QComboBox*>(widget()); @@ -1030,7 +1129,10 @@ void ComboBoxField::setup(JsonFieldPage *page, const QString &name) QWidget *ComboBoxField::createWidget(const QString & /*displayName*/, JsonFieldPage * /*page*/) { - return new QComboBox; + const auto comboBox = new QComboBox; + QObject::connect(comboBox, QOverload<int>::of(&QComboBox::activated), + [this] { setHasUserChanges(); }); + return comboBox; } void ComboBoxField::initializeData(MacroExpander *expander) @@ -1068,7 +1170,10 @@ void IconListField::setup(JsonFieldPage *page, const QString &name) QWidget *IconListField::createWidget(const QString & /*displayName*/, JsonFieldPage * /*page*/) { - return new QListView; + const auto listView = new QListView; + QObject::connect(listView->selectionModel(), &QItemSelectionModel::currentChanged, + [this] { setHasUserChanges(); }); + return listView; } void IconListField::initializeData(MacroExpander *expander) @@ -1131,6 +1236,13 @@ bool JsonFieldPage::setup(const QVariant &data) if (!f) continue; f->createWidget(this); + if (!f->persistenceKey().isEmpty()) { + f->setPersistenceKey(m_expander->expand(f->persistenceKey())); + const QVariant value = Core::ICore::settings() + ->value(fullSettingsKey(f->persistenceKey())); + if (value.isValid()) + f->fromSettings(value); + } m_fields.append(f); } return true; @@ -1172,6 +1284,17 @@ void JsonFieldPage::cleanupPage() f->cleanup(m_expander); } +bool JsonFieldPage::validatePage() +{ + for (Field * const f : qAsConst(m_fields)) + if (!f->persistenceKey().isEmpty() && f->hasUserChanges()) { + const QVariant value = f->toSettings(); + if (value.isValid()) + Core::ICore::settings()->setValue(fullSettingsKey(f->persistenceKey()), value); + } + return true; +} + void JsonFieldPage::showError(const QString &m) const { m_errorLabel->setText(m); @@ -1199,4 +1322,9 @@ JsonFieldPage::Field *JsonFieldPage::createFieldData(const QString &type) return nullptr; } +QString JsonFieldPage::fullSettingsKey(const QString &fieldKey) +{ + return "Wizards/" + fieldKey; +} + } // namespace ProjectExplorer |