@@ 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()