From 7e1f9d9f859b0c7a0f9f3c89adbb8012a895b60f Mon Sep 17 00:00:00 2001 From: Daniel Molkentin <daniel.molkentin@nokia.com> Date: Mon, 29 Mar 2010 14:42:46 +0200 Subject: [PATCH] Highlight colliding shortcuts for imported keyboard schemes. --- .../coreplugin/actionmanager/command.cpp | 5 ++ .../coreplugin/actionmanager/command.h | 1 + .../coreplugin/actionmanager/command_p.h | 5 +- .../actionmanager/commandmappings.cpp | 10 +++ .../actionmanager/commandmappings.h | 4 +- .../coreplugin/dialogs/shortcutsettings.cpp | 80 +++++++++++++------ .../coreplugin/dialogs/shortcutsettings.h | 2 + src/plugins/fakevim/fakevimplugin.cpp | 31 ++----- 8 files changed, 86 insertions(+), 52 deletions(-) diff --git a/src/plugins/coreplugin/actionmanager/command.cpp b/src/plugins/coreplugin/actionmanager/command.cpp index 8a95b974653..5cb8ad0f398 100644 --- a/src/plugins/coreplugin/actionmanager/command.cpp +++ b/src/plugins/coreplugin/actionmanager/command.cpp @@ -238,6 +238,11 @@ QShortcut *CommandPrivate::shortcut() const return 0; } +QList<int> CommandPrivate::context() const +{ + return m_context; +} + void CommandPrivate::setAttribute(CommandAttribute attr) { m_attributes |= attr; diff --git a/src/plugins/coreplugin/actionmanager/command.h b/src/plugins/coreplugin/actionmanager/command.h index 8e8f8725546..88651f6cd66 100644 --- a/src/plugins/coreplugin/actionmanager/command.h +++ b/src/plugins/coreplugin/actionmanager/command.h @@ -65,6 +65,7 @@ public: virtual QAction *action() const = 0; virtual QShortcut *shortcut() const = 0; + virtual QList<int> context() const = 0; virtual void setAttribute(CommandAttribute attr) = 0; virtual void removeAttribute(CommandAttribute attr) = 0; diff --git a/src/plugins/coreplugin/actionmanager/command_p.h b/src/plugins/coreplugin/actionmanager/command_p.h index 7a119ec2efb..aaf6da028b3 100644 --- a/src/plugins/coreplugin/actionmanager/command_p.h +++ b/src/plugins/coreplugin/actionmanager/command_p.h @@ -60,6 +60,8 @@ public: QAction *action() const; QShortcut *shortcut() const; + QList<int> context() const; + void setAttribute(CommandAttribute attr); void removeAttribute(CommandAttribute attr); @@ -70,6 +72,7 @@ public: QString stringWithAppendedShortcut(const QString &str) const; protected: + QList<int> m_context; QString m_category; int m_attributes; int m_id; @@ -101,7 +104,6 @@ public: bool isActive() const; private: - QList<int> m_context; QShortcut *m_shortcut; QString m_defaultText; }; @@ -140,7 +142,6 @@ private: QString m_toolTip; QPointer<QAction> m_currentAction; - QList<int> m_context; QMap<int, QPointer<QAction> > m_contextActionMap; bool m_active; bool m_contextInitialized; diff --git a/src/plugins/coreplugin/actionmanager/commandmappings.cpp b/src/plugins/coreplugin/actionmanager/commandmappings.cpp index d24cbe7918c..a1c9801f308 100644 --- a/src/plugins/coreplugin/actionmanager/commandmappings.cpp +++ b/src/plugins/coreplugin/actionmanager/commandmappings.cpp @@ -191,3 +191,13 @@ bool CommandMappings::filter(const QString &f, const QTreeWidgetItem *item) } return !found; } + +void CommandMappings::setModified(QTreeWidgetItem *item , bool modified) +{ + QFont f = item->font(0); + f.setItalic(modified); + item->setFont(0, f); + item->setFont(1, f); + f.setBold(modified); + item->setFont(2, f); +} diff --git a/src/plugins/coreplugin/actionmanager/commandmappings.h b/src/plugins/coreplugin/actionmanager/commandmappings.h index 929618e9c59..66631e99a49 100644 --- a/src/plugins/coreplugin/actionmanager/commandmappings.h +++ b/src/plugins/coreplugin/actionmanager/commandmappings.h @@ -84,7 +84,9 @@ protected: void setTargetLabelText(const QString &s); void setTargetEditTitle(const QString &s); void setTargetHeader(const QString &s); - + void setModified(QTreeWidgetItem *item, bool modified); + virtual void markPossibleCollisions(QTreeWidgetItem *) {} + virtual void resetCollisionMarkers() {} private: Ui_CommandMappings *m_page; }; diff --git a/src/plugins/coreplugin/dialogs/shortcutsettings.cpp b/src/plugins/coreplugin/dialogs/shortcutsettings.cpp index 51ccb8aca45..42c79069596 100644 --- a/src/plugins/coreplugin/dialogs/shortcutsettings.cpp +++ b/src/plugins/coreplugin/dialogs/shortcutsettings.cpp @@ -36,6 +36,7 @@ #include "filemanager.h" #include "icore.h" #include "uniqueidmanager.h" + #include <utils/treewidgetcolumnstretcher.h> @@ -121,7 +122,8 @@ void ShortcutSettings::finish() bool ShortcutSettings::eventFilter(QObject *o, QEvent *e) { - Q_UNUSED(o); + Q_UNUSED(o) + if ( e->type() == QEvent::KeyPress ) { QKeyEvent *k = static_cast<QKeyEvent*>(e); handleKeyEvent(k); @@ -157,22 +159,12 @@ void ShortcutSettings::targetIdentifierChanged() if (current && current->data(0, Qt::UserRole).isValid()) { ShortcutItem *scitem = qVariantValue<ShortcutItem *>(current->data(0, Qt::UserRole)); scitem->m_key = QKeySequence(m_key[0], m_key[1], m_key[2], m_key[3]); - if (scitem->m_cmd->defaultKeySequence() != scitem->m_key) { - QFont f = current->font(0); - f.setItalic(true); - current->setFont(0, f); - current->setFont(1, f); - f.setBold(true); - current->setFont(2, f); - } else { - QFont f = current->font(0); - f.setItalic(false); - f.setBold(false); - current->setFont(0, f); - current->setFont(1, f); - current->setFont(2, f); - } + if (scitem->m_cmd->defaultKeySequence() != scitem->m_key) + setModified(current, true); + else + setModified(current, false); current->setText(2, scitem->m_key); + markPossibleCollisions(scitem); } } @@ -219,6 +211,13 @@ void ShortcutSettings::importAction() item->m_item->setText(2, item->m_key); if (item->m_item == commandList()->currentItem()) commandChanged(item->m_item); + + if (item->m_cmd->defaultKeySequence() != item->m_key) + setModified(item->m_item, true); + else + setModified(item->m_item, false); + + markPossibleCollisions(item); } } } @@ -229,8 +228,10 @@ void ShortcutSettings::defaultAction() foreach (ShortcutItem *item, m_scitems) { item->m_key = item->m_cmd->defaultKeySequence(); item->m_item->setText(2, item->m_key); + setModified(item->m_item, false); if (item->m_item == commandList()->currentItem()) commandChanged(item->m_item); + resetCollisionMarkers(); } } @@ -294,15 +295,8 @@ void ShortcutSettings::initialize() } item->setText(2, s->m_key); - if (s->m_cmd->defaultKeySequence() != s->m_key) { - QFont f = item->font(0); - f.setItalic(true); - item->setFont(0, f); - item->setFont(1, f); - f.setBold(true); - item->setFont(2, f); - - } + if (s->m_cmd->defaultKeySequence() != s->m_key) + setModified(item, true); item->setData(0, Qt::UserRole, qVariantFromValue(s)); } @@ -360,3 +354,39 @@ int ShortcutSettings::translateModifiers(Qt::KeyboardModifiers state, result |= Qt::ALT; return result; } + + + +void ShortcutSettings::markPossibleCollisions(ShortcutItem *item) +{ + if (item->m_key.isEmpty()) + return; + + foreach (ShortcutItem *currentItem, m_scitems) { + + if (currentItem->m_key.isEmpty() || item == currentItem || + item->m_key != currentItem->m_key) { + continue; + } + + foreach(int context, currentItem->m_cmd->context()) { + + // conflict if context is identical, OR if one + // of the contexts is the global context + if (item->m_cmd->context().contains(context) || + (item->m_cmd->context().contains(Constants::C_GLOBAL_ID) && + !currentItem->m_cmd->context().isEmpty()) || + (currentItem->m_cmd->context().contains(Constants::C_GLOBAL_ID) && + !item->m_cmd->context().isEmpty())) { + currentItem->m_item->setForeground(2, Qt::red); + item->m_item->setForeground(2, Qt::red); + } + } + } +} + +void ShortcutSettings::resetCollisionMarkers() +{ + foreach (ShortcutItem *item, m_scitems) + item->m_item->setForeground(2, commandList()->palette().foreground()); +} diff --git a/src/plugins/coreplugin/dialogs/shortcutsettings.h b/src/plugins/coreplugin/dialogs/shortcutsettings.h index ab0933c1e46..d9a816a63c6 100644 --- a/src/plugins/coreplugin/dialogs/shortcutsettings.h +++ b/src/plugins/coreplugin/dialogs/shortcutsettings.h @@ -92,6 +92,8 @@ private: void handleKeyEvent(QKeyEvent *e); int translateModifiers(Qt::KeyboardModifiers state, const QString &text); + void markPossibleCollisions(ShortcutItem *); + void resetCollisionMarkers(); QList<ShortcutItem *> m_scitems; int m_key[4], m_keyNum; diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 10d9a5a21dc..fd2b232562a 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -371,15 +371,8 @@ void FakeVimExCommandsPage::initialize() item->setText(2, ci->m_regex); item->setData(0, Qt::UserRole, qVariantFromValue(ci)); - if (ci->m_regex != s_defaultExCommandMap[name].pattern()) { - QFont f = item->font(0); - f.setItalic(true); - item->setFont(0, f); - item->setFont(1, f); - f.setBold(true); - item->setFont(2, f); - } - + if (ci->m_regex != s_defaultExCommandMap[name].pattern()) + setModified(item, true); } commandChanged(0); @@ -412,21 +405,10 @@ void FakeVimExCommandsPage::targetIdentifierChanged() s_exCommandMap[name] = QRegExp(citem->m_regex); } - if (citem->m_regex != s_defaultExCommandMap[name].pattern()) { - QFont f = current->font(0); - f.setItalic(true); - current->setFont(0, f); - current->setFont(1, f); - f.setBold(true); - current->setFont(2, f); - } else { - QFont f = current->font(0); - f.setItalic(false); - f.setBold(false); - current->setFont(0, f); - current->setFont(1, f); - current->setFont(2, f); - } + if (citem->m_regex != s_defaultExCommandMap[name].pattern()) + setModified(current, true); + else + setModified(current, false); } @@ -464,6 +446,7 @@ void FakeVimExCommandsPage::defaultAction() } else { item->m_regex.clear(); } + setModified(item->m_item, false); item->m_item->setText(2, item->m_regex); if (item->m_item == commandList()->currentItem()) commandChanged(item->m_item); -- GitLab