diff framework/MainWindowBase.cpp @ 390:3e5c8a03bcb7

Associate the mapper with the MainWindowBase object, and recreate it each time we scan all menus -- allowing us to call finaliseMenus more than once if menu actions have changed
author Chris Cannam
date Wed, 13 Aug 2014 09:52:46 +0100
parents 8cfc71c8ec4b
children 9e31759254fe
line wrap: on
line diff
--- a/framework/MainWindowBase.cpp	Wed Aug 13 09:09:16 2014 +0100
+++ b/framework/MainWindowBase.cpp	Wed Aug 13 09:52:46 2014 +0100
@@ -155,7 +155,8 @@
     m_lastPlayStatusSec(0),
     m_initialDarkBackground(false),
     m_defaultFfwdRwdStep(2, 0),
-    m_statusLabel(0)
+    m_statusLabel(0),
+    m_menuShortcutMapper(0)
 {
     Profiler profiler("MainWindowBase::MainWindowBase");
 
@@ -276,6 +277,9 @@
 void
 MainWindowBase::finaliseMenus()
 {
+    delete m_menuShortcutMapper;
+    m_menuShortcutMapper = 0;
+
     QMenuBar *mb = menuBar();
     QList<QMenu *> menus = mb->findChildren<QMenu *>();
     foreach (QMenu *menu, menus) {
@@ -323,9 +327,11 @@
     // "ambiguous shortcut" errors from the menu entry actions and
     // will need to update the code.)
 
-    QSignalMapper *mapper = new QSignalMapper(this);
-
-    connect(mapper, SIGNAL(mapped(QObject *)),
+    if (!m_menuShortcutMapper) {
+        m_menuShortcutMapper = new QSignalMapper(this);
+    }
+
+    connect(m_menuShortcutMapper, SIGNAL(mapped(QObject *)),
             this, SLOT(menuActionMapperInvoked(QObject *)));
 
     foreach (QAction *a, menu->actions()) {
@@ -341,9 +347,10 @@
         QKeySequence sc = a->shortcut();
         if (sc.count() == 1 && !(sc[0] & Qt::KeyboardModifierMask)) {
             QShortcut *newSc = new QShortcut(sc, a->parentWidget());
-            QObject::connect(newSc, SIGNAL(activated()), mapper, SLOT(map()));
+            QObject::connect(newSc, SIGNAL(activated()),
+                             m_menuShortcutMapper, SLOT(map()));
             cerr << "setting mapping for action " << a << ", name " << a->text() << endl;
-            mapper->setMapping(newSc, a);
+            m_menuShortcutMapper->setMapping(newSc, a);
         }
     }
 #endif