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