mainwindow: on select other panel, look up ancestor panel widget first
1 files changed, 26 insertions(+), 11 deletions(-)

M app/mainwindow.cpp
M app/mainwindow.cpp +26 -11
@@ 39,6 39,21 @@ void collectSplitterChildren(std::vector
         }
     }
 }
+
+/// Finds the outermost widget which is a descendant of the given splitter.
+QWidget *findAncestorSplitterChild(QWidget *widget, const QSplitter *splitter)
+{
+    if (!widget)
+        return nullptr;
+    for (auto *p = widget->parentWidget(); p; p = p->parentWidget()) {
+        if (p == splitter)
+            return widget;
+        if (qobject_cast<QSplitter *>(p))
+            continue;  // intermediate splitter
+        widget = p;
+    }
+    return nullptr;
+}
 }  // namespace
 
 MainWindow::MainWindow(QWidget *parent)

          
@@ 241,19 256,19 @@ void MainWindow::selectOtherPanel()
 {
     std::vector<QWidget *> panels;
     collectSplitterChildren(panels, mainSplitter_);
-    for (const auto *w = focusWidget(); w; w = w->parentWidget()) {
-        auto p = std::find(panels.begin(), panels.end(), w);
-        if (p == panels.end())
-            continue;
-        std::advance(p, 1);
-        if (p == panels.end())
-            p = panels.begin();
-        (*p)->setFocus();
+    Q_ASSERT(!panels.empty());
+    const auto *w = findAncestorSplitterChild(focusWidget(), mainSplitter_);
+    if (!w) {
+        // no panel selected, move to the first
+        panels.front()->setFocus();
         return;
     }
-
-    // no panel selected, move to the first
-    panels.front()->setFocus();
+    auto p = std::find(panels.begin(), panels.end(), w);
+    Q_ASSERT(p != panels.end());
+    std::advance(p, 1);
+    if (p == panels.end())
+        p = panels.begin();
+    (*p)->setFocus();
 }
 
 void MainWindow::splitRevisionPanel()