diff --git a/src/plugins/coreplugin/actionmanager/command.cpp b/src/plugins/coreplugin/actionmanager/command.cpp index 8a95b974653e0c8cd61d90921df79eacdc714e5c..5cb8ad0f398162f5f185a83bc32e6256d293f960 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 8e8f87255468bd65228586b4c75afc4537aec1b0..88651f6cd66b689969b030791d7ab4407a65ed8b 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 7a119ec2efbe040694846b1e44cb3f996a943120..aaf6da028b359c5e4a4723643556369201b150c8 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 d24cbe7918c172c017455c3c7a42773836f37ff1..a1c9801f308311105ebc88612a6e05f838fa0a0b 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 929618e9c59cb9953aeb1022fdd924a4d9fd6688..66631e99a49549fe8f17a6b681fb6808af58cf3e 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 51ccb8aca452fbe7095bb07f6de85e76a923488a..42c7906959657f5a4dc2f86b99f97dd02fbf77f1 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 ab0933c1e468d4d6b3c86bae4b76decdef4c0ed5..d9a816a63c67c2b46d2a54599443d7ab61b84c78 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 10d9a5a21dc5aa19876132a1ef35aaa593b35390..fd2b232562a0ac28eec9603005a04d6c50e1495c 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);