forked from qt-creator/qt-creator
FakeVim: Re-organize ExCommand settings page setup
Change-Id: I085a86529fc840472aabf7ae62d6565f454256ae Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -568,12 +568,21 @@ public:
|
|||||||
|
|
||||||
enum { CommandRole = Qt::UserRole };
|
enum { CommandRole = Qt::UserRole };
|
||||||
|
|
||||||
class FakeVimExCommandsWidget : public CommandMappings
|
const char exCommandMapGroup[] = "FakeVimExCommand";
|
||||||
|
const char userCommandMapGroup[] = "FakeVimUserCommand";
|
||||||
|
const char reKey[] = "RegEx";
|
||||||
|
const char cmdKey[] = "Cmd";
|
||||||
|
const char idKey[] = "Command";
|
||||||
|
|
||||||
|
class FakeVimExCommandsMappings : public CommandMappings
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FakeVimExCommandsWidget();
|
FakeVimExCommandsMappings();
|
||||||
|
void apply();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
ExCommandMap exCommandMapFromWidget();
|
||||||
|
|
||||||
void commandChanged();
|
void commandChanged();
|
||||||
void resetToDefault();
|
void resetToDefault();
|
||||||
void defaultAction() override;
|
void defaultAction() override;
|
||||||
@@ -581,24 +590,18 @@ protected:
|
|||||||
void handleCurrentCommandChanged(QTreeWidgetItem *current);
|
void handleCurrentCommandChanged(QTreeWidgetItem *current);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize();
|
|
||||||
|
|
||||||
ExCommandMap exCommandMapFromWidget();
|
|
||||||
|
|
||||||
QGroupBox *m_commandBox;
|
QGroupBox *m_commandBox;
|
||||||
FancyLineEdit *m_commandEdit;
|
FancyLineEdit *m_commandEdit;
|
||||||
|
|
||||||
friend class FakeVimExCommandsPage; // allow the page accessing the ExCommandMaps
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FakeVimExCommandsWidget::FakeVimExCommandsWidget()
|
FakeVimExCommandsMappings::FakeVimExCommandsMappings()
|
||||||
{
|
{
|
||||||
setPageTitle(Tr::tr("Ex Command Mapping"));
|
setPageTitle(Tr::tr("Ex Command Mapping"));
|
||||||
setTargetHeader(Tr::tr("Ex Trigger Expression"));
|
setTargetHeader(Tr::tr("Ex Trigger Expression"));
|
||||||
setImportExportEnabled(false);
|
setImportExportEnabled(false);
|
||||||
|
|
||||||
connect(this, &FakeVimExCommandsWidget::currentCommandChanged,
|
connect(this, &FakeVimExCommandsMappings::currentCommandChanged,
|
||||||
this, &FakeVimExCommandsWidget::handleCurrentCommandChanged);
|
this, &FakeVimExCommandsMappings::handleCurrentCommandChanged);
|
||||||
|
|
||||||
m_commandBox = new QGroupBox(Tr::tr("Ex Command"), this);
|
m_commandBox = new QGroupBox(Tr::tr("Ex Command"), this);
|
||||||
m_commandBox->setEnabled(false);
|
m_commandBox->setEnabled(false);
|
||||||
@@ -607,87 +610,17 @@ FakeVimExCommandsWidget::FakeVimExCommandsWidget()
|
|||||||
m_commandEdit->setFiltering(true);
|
m_commandEdit->setFiltering(true);
|
||||||
m_commandEdit->setPlaceholderText(QString());
|
m_commandEdit->setPlaceholderText(QString());
|
||||||
connect(m_commandEdit, &FancyLineEdit::textChanged,
|
connect(m_commandEdit, &FancyLineEdit::textChanged,
|
||||||
this, &FakeVimExCommandsWidget::commandChanged);
|
this, &FakeVimExCommandsMappings::commandChanged);
|
||||||
auto resetButton = new QPushButton(Tr::tr("Reset"), m_commandBox);
|
auto resetButton = new QPushButton(Tr::tr("Reset"), m_commandBox);
|
||||||
resetButton->setToolTip(Tr::tr("Reset to default."));
|
resetButton->setToolTip(Tr::tr("Reset to default."));
|
||||||
connect(resetButton, &QPushButton::clicked,
|
connect(resetButton, &QPushButton::clicked,
|
||||||
this, &FakeVimExCommandsWidget::resetToDefault);
|
this, &FakeVimExCommandsMappings::resetToDefault);
|
||||||
boxLayout->addWidget(new QLabel(Tr::tr("Regular expression:")));
|
boxLayout->addWidget(new QLabel(Tr::tr("Regular expression:")));
|
||||||
boxLayout->addWidget(m_commandEdit);
|
boxLayout->addWidget(m_commandEdit);
|
||||||
boxLayout->addWidget(resetButton);
|
boxLayout->addWidget(resetButton);
|
||||||
|
|
||||||
layout()->addWidget(m_commandBox);
|
layout()->addWidget(m_commandBox);
|
||||||
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
class FakeVimExCommandsPage : public IOptionsPage
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FakeVimExCommandsPage()
|
|
||||||
{
|
|
||||||
setId(SETTINGS_EX_CMDS_ID);
|
|
||||||
setDisplayName(Tr::tr("Ex Command Mapping"));
|
|
||||||
setCategory(SETTINGS_CATEGORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget *widget() override
|
|
||||||
{
|
|
||||||
if (!m_widget)
|
|
||||||
m_widget = new FakeVimExCommandsWidget;
|
|
||||||
return m_widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
void apply() override;
|
|
||||||
void finish() override {}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QPointer<FakeVimExCommandsWidget> m_widget;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const char exCommandMapGroup[] = "FakeVimExCommand";
|
|
||||||
const char userCommandMapGroup[] = "FakeVimUserCommand";
|
|
||||||
const char reKey[] = "RegEx";
|
|
||||||
const char cmdKey[] = "Cmd";
|
|
||||||
const char idKey[] = "Command";
|
|
||||||
|
|
||||||
void FakeVimExCommandsPage::apply()
|
|
||||||
{
|
|
||||||
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 = dd->m_exCommandMap;
|
|
||||||
|
|
||||||
if (newMapping != globalCommandMapping) {
|
|
||||||
const ExCommandMap &defaultMap = dd->m_defaultExCommandMap;
|
|
||||||
QSettings *settings = ICore::settings();
|
|
||||||
settings->beginWriteArray(exCommandMapGroup);
|
|
||||||
int count = 0;
|
|
||||||
using Iterator = ExCommandMap::const_iterator;
|
|
||||||
const Iterator end = newMapping.constEnd();
|
|
||||||
for (Iterator it = newMapping.constBegin(); it != end; ++it) {
|
|
||||||
const QString id = it.key();
|
|
||||||
const QRegularExpression 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.insert(defaultMap);
|
|
||||||
globalCommandMapping.insert(newMapping);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FakeVimExCommandsWidget::initialize()
|
|
||||||
{
|
|
||||||
QMap<QString, QTreeWidgetItem *> sections;
|
QMap<QString, QTreeWidgetItem *> sections;
|
||||||
|
|
||||||
const QList<Command *> commands = ActionManager::commands();
|
const QList<Command *> commands = ActionManager::commands();
|
||||||
@@ -727,7 +660,28 @@ void FakeVimExCommandsWidget::initialize()
|
|||||||
handleCurrentCommandChanged(nullptr);
|
handleCurrentCommandChanged(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeVimExCommandsWidget::handleCurrentCommandChanged(QTreeWidgetItem *current)
|
ExCommandMap FakeVimExCommandsMappings::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();
|
||||||
|
const QString pattern = dd->m_defaultExCommandMap.value(name).pattern();
|
||||||
|
if ((regex.isEmpty() && pattern.isEmpty())
|
||||||
|
|| (!regex.isEmpty() && pattern == regex))
|
||||||
|
continue;
|
||||||
|
map[name] = QRegularExpression(regex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FakeVimExCommandsMappings::handleCurrentCommandChanged(QTreeWidgetItem *current)
|
||||||
{
|
{
|
||||||
if (current) {
|
if (current) {
|
||||||
m_commandEdit->setText(current->text(2));
|
m_commandEdit->setText(current->text(2));
|
||||||
@@ -738,7 +692,7 @@ void FakeVimExCommandsWidget::handleCurrentCommandChanged(QTreeWidgetItem *curre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeVimExCommandsWidget::commandChanged()
|
void FakeVimExCommandsMappings::commandChanged()
|
||||||
{
|
{
|
||||||
QTreeWidgetItem *current = commandList()->currentItem();
|
QTreeWidgetItem *current = commandList()->currentItem();
|
||||||
if (!current)
|
if (!current)
|
||||||
@@ -753,7 +707,7 @@ void FakeVimExCommandsWidget::commandChanged()
|
|||||||
setModified(current, regex != dd->m_defaultExCommandMap[name].pattern());
|
setModified(current, regex != dd->m_defaultExCommandMap[name].pattern());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeVimExCommandsWidget::resetToDefault()
|
void FakeVimExCommandsMappings::resetToDefault()
|
||||||
{
|
{
|
||||||
QTreeWidgetItem *current = commandList()->currentItem();
|
QTreeWidgetItem *current = commandList()->currentItem();
|
||||||
if (!current)
|
if (!current)
|
||||||
@@ -765,12 +719,12 @@ void FakeVimExCommandsWidget::resetToDefault()
|
|||||||
m_commandEdit->setText(regex);
|
m_commandEdit->setText(regex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeVimExCommandsWidget::defaultAction()
|
void FakeVimExCommandsMappings::defaultAction()
|
||||||
{
|
{
|
||||||
int n = commandList()->topLevelItemCount();
|
const int n = commandList()->topLevelItemCount();
|
||||||
for (int i = 0; i != n; ++i) {
|
for (int i = 0; i != n; ++i) {
|
||||||
QTreeWidgetItem *section = commandList()->topLevelItem(i);
|
QTreeWidgetItem *section = commandList()->topLevelItem(i);
|
||||||
int m = section->childCount();
|
const int m = section->childCount();
|
||||||
for (int j = 0; j != m; ++j) {
|
for (int j = 0; j != m; ++j) {
|
||||||
QTreeWidgetItem *item = section->child(j);
|
QTreeWidgetItem *item = section->child(j);
|
||||||
const QString name = item->data(0, CommandRole).toString();
|
const QString name = item->data(0, CommandRole).toString();
|
||||||
@@ -785,6 +739,66 @@ void FakeVimExCommandsWidget::defaultAction()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FakeVimExCommandsMappings::apply()
|
||||||
|
{
|
||||||
|
// now save the mappings if necessary
|
||||||
|
const ExCommandMap &newMapping = exCommandMapFromWidget();
|
||||||
|
ExCommandMap &globalCommandMapping = dd->m_exCommandMap;
|
||||||
|
|
||||||
|
if (newMapping != globalCommandMapping) {
|
||||||
|
const ExCommandMap &defaultMap = dd->m_defaultExCommandMap;
|
||||||
|
QSettings *settings = ICore::settings();
|
||||||
|
settings->beginWriteArray(exCommandMapGroup);
|
||||||
|
int count = 0;
|
||||||
|
using Iterator = ExCommandMap::const_iterator;
|
||||||
|
const Iterator end = newMapping.constEnd();
|
||||||
|
for (Iterator it = newMapping.constBegin(); it != end; ++it) {
|
||||||
|
const QString id = it.key();
|
||||||
|
const QRegularExpression 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.insert(defaultMap);
|
||||||
|
globalCommandMapping.insert(newMapping);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FakeVimExCommandsPageWidget : public IOptionsPageWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FakeVimExCommandsPageWidget()
|
||||||
|
{
|
||||||
|
m_exCommands = new FakeVimExCommandsMappings;
|
||||||
|
auto vbox = new QVBoxLayout(this);
|
||||||
|
vbox->addWidget(m_exCommands);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void apply() final { m_exCommands->apply(); }
|
||||||
|
|
||||||
|
FakeVimExCommandsMappings *m_exCommands;
|
||||||
|
};
|
||||||
|
|
||||||
|
class FakeVimExCommandsPage : public IOptionsPage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FakeVimExCommandsPage()
|
||||||
|
{
|
||||||
|
setId(SETTINGS_EX_CMDS_ID);
|
||||||
|
setDisplayName(Tr::tr("Ex Command Mapping"));
|
||||||
|
setCategory(SETTINGS_CATEGORY);
|
||||||
|
setWidgetCreator([] { return new FakeVimExCommandsPageWidget; });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// FakeVimUserCommandsPage
|
// FakeVimUserCommandsPage
|
||||||
@@ -2087,28 +2101,6 @@ void FakeVimPluginPrivate::switchToFile(int n)
|
|||||||
EditorManager::activateEditorForEntry(DocumentModel::entries().at(n));
|
EditorManager::activateEditorForEntry(DocumentModel::entries().at(n));
|
||||||
}
|
}
|
||||||
|
|
||||||
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();
|
|
||||||
const QString pattern = dd->m_defaultExCommandMap.value(name).pattern();
|
|
||||||
if ((regex.isEmpty() && pattern.isEmpty())
|
|
||||||
|| (!regex.isEmpty() && pattern == regex))
|
|
||||||
continue;
|
|
||||||
map[name] = QRegularExpression(regex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user