# HG changeset patch # User Yuya Nishihara # Date 1659685273 -32400 # Fri Aug 05 16:41:13 2022 +0900 # Node ID ba2fd341ff57f0d535a6fc64a7c37d401794be3c # Parent a7320337c8d295cfc8578ba950d52bf1d1e48b39 mainwindow: add helper to find next in circular list diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -39,6 +39,17 @@ } } +template T *nextInCircularList(const std::vector &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 @@ std::vector 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()