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