From 79ac8b3c95eaaafc2bed030547f53e2d96091249 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Thu, 18 Aug 2022 22:18:01 -0400 Subject: [PATCH] Fix tabbing around database widget Fixes #8352 --- src/gui/DatabaseWidget.cpp | 51 ++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 712cab6a0..4cba23ce3 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -559,11 +559,7 @@ void DatabaseWidget::deleteEntries(QList selectedEntries, bool confirm) void DatabaseWidget::setFocus(Qt::FocusReason reason) { - if (reason == Qt::BacktabFocusReason) { - m_previewView->setFocus(); - } else { - m_groupView->setFocus(); - } + focusNextPrevChild(reason == Qt::TabFocusReason); } void DatabaseWidget::focusOnEntries(bool editIfFocused) @@ -1617,31 +1613,32 @@ void DatabaseWidget::showEvent(QShowEvent* event) bool DatabaseWidget::focusNextPrevChild(bool next) { // [parent] <-> GroupView <-> TagView <-> EntryView <-> EntryPreview <-> [parent] - if (next) { - if (m_groupView->hasFocus()) { - m_tagView->setFocus(); - return true; - } else if (m_tagView->hasFocus()) { - m_entryView->setFocus(); - return true; - } else if (m_entryView->hasFocus()) { - m_previewView->setFocus(); - return true; - } + QList sequence = {m_groupView, m_tagView, m_entryView, m_previewView}; + auto widget = qApp->focusWidget(); + + int idx; + do { + idx = sequence.indexOf(widget); + widget = widget->parentWidget(); + } while (idx == -1 && widget); + + if (idx == -1) { + idx = next ? 0 : sequence.size() - 1; } else { - if (m_previewView->hasFocus()) { - m_entryView->setFocus(); - return true; - } else if (m_entryView->hasFocus()) { - m_tagView->setFocus(); - return true; - } else if (m_tagView->hasFocus()) { - m_groupView->setFocus(); - return true; - } + idx = next ? idx + 1 : idx - 1; } - // Defer to the parent widget to make a decision + // Find the next visible element in the sequence and set the focus + while (idx >= 0 && idx < sequence.size()) { + widget = sequence[idx]; + if (widget->isVisible() && widget->height() > 0 && widget->width() > 0) { + widget->setFocus(); + return widget; + } + idx = next ? idx + 1 : idx - 1; + } + + // Ran out of options, defer to the parent widget return QStackedWidget::focusNextPrevChild(next); }