diff options
author | Christian Stenger <christian.stenger@qt.io> | 2018-01-18 15:49:12 +0100 |
---|---|---|
committer | Christian Stenger <christian.stenger@qt.io> | 2018-01-23 06:12:58 +0000 |
commit | 8dae0c4613005e7c398d3c5ef65d49a584b48d7a (patch) | |
tree | de243389577f50fdc590da2a0d191135feca520d /src/plugins/fakevim/fakevimplugin.cpp | |
parent | 22b0d3b6aab5798009550e2b4d2a4e196ed36f33 (diff) | |
download | qt-creator-8dae0c4613005e7c398d3c5ef65d49a584b48d7a.tar.gz |
FakeVim: Correct handling of settings
Fix handling of restoring default values. If the user
restores default values ensure that these changes are
taken into account as well, otherwise the user would
restore the old settings (instead of default settings)
when restarting QC.
When changing command mappings for FakeVim write the
changes immediately to the settings if the user leaves
the options without canceling.
Change-Id: I81ee47af6a208823d4afecb71cbaddcf2d571750
Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/plugins/fakevim/fakevimplugin.cpp')
-rw-r--r-- | src/plugins/fakevim/fakevimplugin.cpp | 180 |
1 files changed, 114 insertions, 66 deletions
diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 0ec944f92e..d8c92a13eb 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -548,10 +548,13 @@ private: ExCommandMap &exCommandMap(); ExCommandMap &defaultExCommandMap(); + ExCommandMap exCommandMapFromWidget(); FakeVimPluginPrivate *m_q; QGroupBox *m_commandBox; FancyLineEdit *m_commandEdit; + + friend class FakeVimExCommandsPage; // allow the page accessing the ExCommandMaps }; FakeVimExCommandsWidget::FakeVimExCommandsWidget(FakeVimPluginPrivate *q, QWidget *parent) @@ -601,12 +604,12 @@ public: } QWidget *widget() override; - void apply() override {} - void finish() override; + void apply() override; + void finish() override {} private: FakeVimPluginPrivate *m_q; - QPointer<QWidget> m_widget; + QPointer<FakeVimExCommandsWidget> m_widget; }; QWidget *FakeVimExCommandsPage::widget() @@ -616,9 +619,44 @@ QWidget *FakeVimExCommandsPage::widget() return m_widget; } -void FakeVimExCommandsPage::finish() +const char exCommandMapGroup[] = "FakeVimExCommand"; +const char userCommandMapGroup[] = "FakeVimUserCommand"; +const char reKey[] = "RegEx"; +const char cmdKey[] = "Cmd"; +const char idKey[] = "Command"; + +void FakeVimExCommandsPage::apply() { - delete m_widget; + if (!m_widget) // page has not been shown at all + return; + // now save the mappings if necessary + const ExCommandMap &newMapping = m_widget->exCommandMapFromWidget(); + ExCommandMap &globalCommandMapping = m_widget->exCommandMap(); + + if (newMapping != globalCommandMapping) { + const ExCommandMap &defaultMap = m_widget->defaultExCommandMap(); + QSettings *settings = ICore::settings(); + settings->beginWriteArray(exCommandMapGroup); + int count = 0; + typedef ExCommandMap::const_iterator Iterator; + const Iterator end = newMapping.constEnd(); + for (Iterator it = newMapping.constBegin(); it != end; ++it) { + const QString id = it.key(); + const QRegExp re = it.value(); + + if ((defaultMap.contains(id) && defaultMap[id] != re) + || (!defaultMap.contains(id) && !re.pattern().isEmpty())) { + settings->setArrayIndex(count); + settings->setValue(idKey, id); + settings->setValue(reKey, re.pattern()); + ++count; + } + } + settings->endArray(); + globalCommandMapping.clear(); + globalCommandMapping.unite(defaultMap); + globalCommandMapping.unite(newMapping); + } } void FakeVimExCommandsWidget::initialize() @@ -658,7 +696,7 @@ void FakeVimExCommandsWidget::initialize() setModified(item, true); } - handleCurrentCommandChanged(0); + handleCurrentCommandChanged(nullptr); } void FakeVimExCommandsWidget::handleCurrentCommandChanged(QTreeWidgetItem *current) @@ -681,10 +719,8 @@ void FakeVimExCommandsWidget::commandChanged() const QString name = current->data(0, CommandRole).toString(); const QString regex = m_commandEdit->text(); - if (current->data(0, Qt::UserRole).isValid()) { + if (current->data(0, Qt::UserRole).isValid()) current->setText(2, regex); - exCommandMap()[name] = QRegExp(regex); - } setModified(current, regex != defaultExCommandMap()[name].pattern()); } @@ -734,6 +770,8 @@ public: FakeVimUserCommandsModel(FakeVimPluginPrivate *q) : m_q(q) {} ~FakeVimUserCommandsModel() {} + void initCommandMap(const UserCommandMap &commandMap) { m_commandMap = commandMap; } + UserCommandMap commandMap() const { return m_commandMap; } int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; @@ -743,6 +781,7 @@ public: private: FakeVimPluginPrivate *m_q; + UserCommandMap m_commandMap; }; int FakeVimUserCommandsModel::rowCount(const QModelIndex &parent) const @@ -814,17 +853,19 @@ public: setCategoryIcon(Utils::Icon(SETTINGS_CATEGORY_FAKEVIM_ICON)); } - void apply(); - void finish() {} + void apply() override; + void finish() override {} QWidget *widget(); void initialize() {} UserCommandMap &userCommandMap(); UserCommandMap &defaultUserCommandMap(); + UserCommandMap currentCommandMap(); private: FakeVimPluginPrivate *m_q; QPointer<QWidget> m_widget; + FakeVimUserCommandsModel *m_model; }; QWidget *FakeVimUserCommandsPage::widget() @@ -832,10 +873,11 @@ QWidget *FakeVimUserCommandsPage::widget() if (!m_widget) { m_widget = new QWidget; - auto model = new FakeVimUserCommandsModel(m_q); + m_model = new FakeVimUserCommandsModel(m_q); + m_model->initCommandMap(userCommandMap()); auto widget = new QTreeView; - model->setParent(widget); - widget->setModel(model); + m_model->setParent(widget); + widget->setModel(m_model); widget->resizeColumnToContents(0); auto delegate = new FakeVimUserCommandsDelegate(widget); @@ -850,8 +892,37 @@ QWidget *FakeVimUserCommandsPage::widget() void FakeVimUserCommandsPage::apply() { - //m_q->writeSettings(); - delete m_widget; + if (!m_widget) // page has not been shown at all + return; + + // now save the mappings if necessary + const UserCommandMap ¤t = currentCommandMap(); + UserCommandMap &userMap = userCommandMap(); + + if (current != userMap) { + QSettings *settings = ICore::settings(); + settings->beginWriteArray(userCommandMapGroup); + int count = 0; + typedef UserCommandMap::const_iterator Iterator; + const Iterator end = current.constEnd(); + for (Iterator it = current.constBegin(); it != end; ++it) { + const int key = it.key(); + const QString cmd = it.value(); + + if ((defaultUserCommandMap().contains(key) + && defaultUserCommandMap()[key] != cmd) + || (!defaultUserCommandMap().contains(key) && !cmd.isEmpty())) { + settings->setArrayIndex(count); + settings->setValue(idKey, key); + settings->setValue(cmdKey, cmd); + ++count; + } + } + settings->endArray(); + userMap.clear(); + userMap.unite(defaultUserCommandMap()); + userMap.unite(current); + } } @@ -1125,7 +1196,7 @@ QVariant FakeVimUserCommandsModel::data(const QModelIndex &index, int role) cons case 0: // Action return Tr::tr("User command #%1").arg(index.row() + 1); case 1: // Command - return m_q->userCommandMap().value(index.row() + 1); + return m_commandMap.value(index.row() + 1); } } @@ -1137,7 +1208,7 @@ bool FakeVimUserCommandsModel::setData(const QModelIndex &index, { if (role == Qt::DisplayRole || role == Qt::EditRole) if (index.column() == 1) - m_q->userCommandMap()[index.row() + 1] = data.toString(); + m_commandMap[index.row() + 1] = data.toString(); return true; } @@ -1304,58 +1375,10 @@ void FakeVimPluginPrivate::createRelativeNumberWidget(IEditor *editor) } } -const char exCommandMapGroup[] = "FakeVimExCommand"; -const char userCommandMapGroup[] = "FakeVimUserCommand"; -const char reKey[] = "RegEx"; -const char cmdKey[] = "Cmd"; -const char idKey[] = "Command"; - void FakeVimPluginPrivate::writeSettings() { QSettings *settings = ICore::settings(); - theFakeVimSettings()->writeSettings(settings); - - { // block - settings->beginWriteArray(exCommandMapGroup); - int count = 0; - typedef ExCommandMap::const_iterator Iterator; - const Iterator end = exCommandMap().constEnd(); - for (Iterator it = exCommandMap().constBegin(); it != end; ++it) { - const QString id = it.key(); - const QRegExp re = it.value(); - - if ((defaultExCommandMap().contains(id) && defaultExCommandMap()[id] != re) - || (!defaultExCommandMap().contains(id) && !re.pattern().isEmpty())) { - settings->setArrayIndex(count); - settings->setValue(idKey, id); - settings->setValue(reKey, re.pattern()); - ++count; - } - } - settings->endArray(); - } // block - - { // block - settings->beginWriteArray(userCommandMapGroup); - int count = 0; - typedef UserCommandMap::const_iterator Iterator; - const Iterator end = userCommandMap().constEnd(); - for (Iterator it = userCommandMap().constBegin(); it != end; ++it) { - const int key = it.key(); - const QString cmd = it.value(); - - if ((defaultUserCommandMap().contains(key) - && defaultUserCommandMap()[key] != cmd) - || (!defaultUserCommandMap().contains(key) && !cmd.isEmpty())) { - settings->setArrayIndex(count); - settings->setValue(idKey, key); - settings->setValue(cmdKey, cmd); - ++count; - } - } - settings->endArray(); - } // block } void FakeVimPluginPrivate::readSettings() @@ -2211,6 +2234,26 @@ ExCommandMap &FakeVimExCommandsWidget::defaultExCommandMap() return m_q->defaultExCommandMap(); } +ExCommandMap FakeVimExCommandsWidget::exCommandMapFromWidget() +{ + ExCommandMap map; + int n = commandList()->topLevelItemCount(); + for (int i = 0; i != n; ++i) { + QTreeWidgetItem *section = commandList()->topLevelItem(i); + int m = section->childCount(); + for (int j = 0; j != m; ++j) { + QTreeWidgetItem *item = section->child(j); + const QString name = item->data(0, CommandRole).toString(); + const QString regex = item->data(2, Qt::DisplayRole).toString(); + if ((regex.isEmpty() && defaultExCommandMap().value(name).isEmpty()) + || (!regex.isEmpty() && defaultExCommandMap().value(name).pattern() == regex)) + continue; + map[name] = QRegExp(regex); + } + } + return map; +} + UserCommandMap &FakeVimUserCommandsPage::userCommandMap() { return m_q->userCommandMap(); @@ -2221,6 +2264,11 @@ UserCommandMap &FakeVimUserCommandsPage::defaultUserCommandMap() return m_q->defaultUserCommandMap(); } +UserCommandMap FakeVimUserCommandsPage::currentCommandMap() +{ + return m_model->commandMap(); +} + /////////////////////////////////////////////////////////////////////// // // FakeVimPlugin |