diff main/MainWindow.cpp @ 1794:2f828631c9be

Update pane and layer menu shortcuts so that the waveform/spectrogram/etc shortcuts (Shift+G etc) always refer to the source model that is in the currently selected pane. This is a potentially confusing backward-incompatible change, but is also quite clearly how it ought to work...
author Chris Cannam
date Thu, 26 Apr 2018 15:09:52 +0100
parents 07bd0eaa8114
children bea6e7bced25
line wrap: on
line diff
--- a/main/MainWindow.cpp	Thu Apr 26 09:27:24 2018 +0100
+++ b/main/MainWindow.cpp	Thu Apr 26 15:09:52 2018 +0100
@@ -1141,6 +1141,63 @@
 #endif
 }
 
+QString
+MainWindow::shortcutFor(LayerFactory::LayerType layer, bool isPaneMenu)
+{
+    QString shortcutText;
+    
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-Wswitch-enum"
+#endif
+    
+    switch (layer) {
+    case LayerFactory::Waveform:
+        if (isPaneMenu) {
+            shortcutText = tr("W");
+        } else {
+            shortcutText = tr("Shift+W");
+        }
+        break;
+                
+    case LayerFactory::Spectrogram:
+        if (isPaneMenu) {
+            shortcutText = tr("G");
+        } else {
+            shortcutText = tr("Shift+G");
+        }
+        break;
+                
+    case LayerFactory::MelodicRangeSpectrogram:
+        if (isPaneMenu) {
+            shortcutText = tr("M");
+        } else {
+            shortcutText = tr("Shift+M");
+        }
+        break;
+                
+    case LayerFactory::PeakFrequencySpectrogram:
+        if (isPaneMenu) {
+            shortcutText = tr("K");
+        } else {
+            shortcutText = tr("Shift+K");
+        }
+        break;
+                
+    case LayerFactory::Spectrum:
+        if (isPaneMenu) {
+            shortcutText = tr("U");
+        } else {
+            shortcutText = tr("Shift+U");
+        }
+        break;
+
+    default:
+        break;
+    }
+
+    return shortcutText;
+}
+
 void
 MainWindow::setupPaneAndLayerMenus()
 {
@@ -1187,8 +1244,6 @@
 
     menu = m_layerMenu;
 
-//    menu->addSeparator();
-
     LayerFactory::LayerTypeSet emptyLayerTypes =
         LayerFactory::getInstance()->getValidEmptyLayerTypes();
 
@@ -1251,10 +1306,12 @@
             QMenu *submenu = 0;
 
             QIcon icon;
-            QString mainText, shortcutText, tipText, channelText;
+            QString mainText, tipText, channelText;
             LayerFactory::LayerType type = backgroundTypes[i];
             bool mono = true;
 
+            QString shortcutText = shortcutFor(type, menuType == paneMenuType);
+
 // Avoid warnings/errors with -Wextra because we aren't explicitly
 // handling all layer types (-Wall is OK with this because of the
 // default but the stricter level insists)
@@ -1268,10 +1325,8 @@
                 icon = il.load("waveform");
                 mainText = tr("Add &Waveform");
                 if (menuType == paneMenuType) {
-                    shortcutText = tr("W");
                     tipText = tr("Add a new pane showing a waveform view");
                 } else {
-                    shortcutText = tr("Shift+W");
                     tipText = tr("Add a new layer showing a waveform view");
                 }
                 mono = false;
@@ -1281,10 +1336,8 @@
                 icon = il.load("spectrogram");
                 mainText = tr("Add Spectro&gram");
                 if (menuType == paneMenuType) {
-                    shortcutText = tr("G");
                     tipText = tr("Add a new pane showing a spectrogram");
                 } else {
-                    shortcutText = tr("Shift+G");
                     tipText = tr("Add a new layer showing a spectrogram");
                 }
                 break;
@@ -1293,10 +1346,8 @@
                 icon = il.load("spectrogram");
                 mainText = tr("Add &Melodic Range Spectrogram");
                 if (menuType == paneMenuType) {
-                    shortcutText = tr("M");
                     tipText = tr("Add a new pane showing a spectrogram set up for an overview of note pitches");
                 } else {
-                    shortcutText = tr("Shift+M");
                     tipText = tr("Add a new layer showing a spectrogram set up for an overview of note pitches");
                 }
                 break;
@@ -1305,10 +1356,8 @@
                 icon = il.load("spectrogram");
                 mainText = tr("Add Pea&k Frequency Spectrogram");
                 if (menuType == paneMenuType) {
-                    shortcutText = tr("K");
                     tipText = tr("Add a new pane showing a spectrogram set up for tracking frequencies");
                 } else {
-                    shortcutText = tr("Shift+K");
                     tipText = tr("Add a new layer showing a spectrogram set up for tracking frequencies");
                 }
                 break;
@@ -1317,10 +1366,8 @@
                 icon = il.load("spectrum");
                 mainText = tr("Add Spectr&um");
                 if (menuType == paneMenuType) {
-                    shortcutText = tr("U");
                     tipText = tr("Add a new pane showing a frequency spectrum");
                 } else {
-                    shortcutText = tr("Shift+U");
                     tipText = tr("Add a new layer showing a frequency spectrum");
                 }
                 break;
@@ -1559,6 +1606,34 @@
 }
 
 void
+MainWindow::updateLayerShortcutsFor(Model *model)
+{
+    set<LayerFactory::LayerType> seen;
+    
+    for (auto &a : m_paneActions) {
+        auto type = a.second.layer;
+        if (a.second.sourceModel == model && seen.find(type) == seen.end()) {
+            a.first->setShortcut(shortcutFor(type, true));
+            seen.insert(type);
+        } else {
+            a.first->setShortcut(QString());
+        }
+    }
+
+    seen.clear();
+    
+    for (auto &a : m_layerActions) {
+        auto type = a.second.layer;
+        if (a.second.sourceModel == model && seen.find(type) == seen.end()) {
+            a.first->setShortcut(shortcutFor(type, false));
+            seen.insert(type);
+        } else {
+            a.first->setShortcut(QString());
+        }
+    }
+}
+
+void
 MainWindow::setupTransformsMenu()
 {
     if (m_transformsMenu) {
@@ -4227,24 +4302,29 @@
         }
     }
 
-    if (containsMainModel) {
-        m_panLayer->setModel(getMainModel());
-        return;
-    }
-
+    bool panLayerSet = false;
+    
     for (int i = pane->getLayerCount(); i > 0; ) {
         --i;
         Layer *layer = pane->getLayer(i);
-        if (LayerFactory::getInstance()->getLayerType(layer) ==
-            LayerFactory::Waveform) {
-            RangeSummarisableTimeValueModel *tvm = 
-                dynamic_cast<RangeSummarisableTimeValueModel *>(layer->getModel());
-            if (tvm) {
+        RangeSummarisableTimeValueModel *tvm = 
+            qobject_cast<RangeSummarisableTimeValueModel *>(layer->getModel());
+        if (tvm) {
+            auto type = LayerFactory::getInstance()->getLayerType(layer);
+            if (type != LayerFactory::TimeRuler) {
+                updateLayerShortcutsFor(tvm);
+            }
+            if (type == LayerFactory::Waveform) {
                 m_panLayer->setModel(tvm);
-                return;
+                panLayerSet = true;
+                break;
             }
         }
     }
+
+    if (containsMainModel && !panLayerSet) {
+        m_panLayer->setModel(getMainModel());
+    }
 }
 
 void