mainwindow: add helper to find next in circular list
1 files changed, 15 insertions(+), 9 deletions(-)

M app/mainwindow.cpp
M app/mainwindow.cpp +15 -9
@@ 39,6 39,17 @@ template <class T> void collectSplitterC
     }
 }
 
+template <class T> T *nextInCircularList(const std::vector<T *> &panels, const T *current)
+{
+    if (panels.empty() || !current)
+        return nullptr;
+    auto p = std::find(panels.begin(), panels.end(), current);
+    if (p == panels.end())
+        return nullptr;
+    std::advance(p, 1);
+    return p == panels.end() ? panels.front() : *p;
+}
+
 /// Finds the outermost widget which is a descendant of the given splitter.
 QWidget *findAncestorSplitterChild(QWidget *widget, const QSplitter *splitter)
 {

          
@@ 256,18 267,13 @@ void MainWindow::selectOtherPanel()
     std::vector<QWidget *> panels;
     collectSplitterChildren(panels, mainSplitter_);
     Q_ASSERT(!panels.empty());
-    const auto *w = findAncestorSplitterChild(focusWidget(), mainSplitter_);
-    if (!w) {
+    auto *w = nextInCircularList(panels, findAncestorSplitterChild(focusWidget(), mainSplitter_));
+    if (w) {
+        w->setFocus();
+    } else {
         // no panel selected, move to the first
         panels.front()->setFocus();
-        return;
     }
-    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()