summaryrefslogtreecommitdiff
path: root/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp')
-rw-r--r--src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp134
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