From 867ad8ee3c65ac5160244a81c41b536c4173a8a7 Mon Sep 17 00:00:00 2001 From: Cyril Anisimov Date: Sun, 29 Dec 2024 00:33:05 +0100 Subject: [PATCH] fix focus movement on dynamic delegates in listView --- client/ui/controllers/focusController.cpp | 7 ++++--- client/ui/controllers/listViewFocusController.cpp | 9 +++++++-- client/ui/controllers/listViewFocusController.h | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/client/ui/controllers/focusController.cpp b/client/ui/controllers/focusController.cpp index dc5b95c04..c8ec7fbce 100644 --- a/client/ui/controllers/focusController.cpp +++ b/client/ui/controllers/focusController.cpp @@ -216,14 +216,14 @@ void FocusController::nextItem(Direction direction) void FocusController::focusNextListViewItem() { qDebug() << "===>> Calling < focusNextListViewItem >..."; - + m_lvfc->reloadFocusChain(); if (m_lvfc->isLastFocusItemInListView() || m_lvfc->isReturnNeeded()) { qDebug() << "===>> Last item in [ ListView ] was reached. Going to the NEXT element after [ ListView ]"; dropListView(); nextItem(Direction::Forward); return; } else if (m_lvfc->isLastFocusItemInDelegate()) { - qDebug() << "===>> End of delegate elements was reached. Going to the next delegate"; + qDebug() << "===>> End of delegate's elements was reached. Going to the next delegate"; m_lvfc->resetFocusChain(); m_lvfc->nextDelegate(); } @@ -234,13 +234,14 @@ void FocusController::focusNextListViewItem() void FocusController::focusPreviousListViewItem() { qDebug() << "===>> Calling < focusPreviousListViewItem >..."; - + m_lvfc->reloadFocusChain(); if (m_lvfc->isFirstFocusItemInListView() || m_lvfc->isReturnNeeded()) { qDebug() << "===>> First item in [ ListView ] was reached. Going to the PREVIOUS element after [ ListView ]"; dropListView(); nextItem(Direction::Backward); return; } else if (m_lvfc->isFirstFocusItemInDelegate()) { + qDebug() << "===>> End of delegate's elements was reached. Going to the previous delegate"; m_lvfc->resetFocusChain(); m_lvfc->previousDelegate(); } diff --git a/client/ui/controllers/listViewFocusController.cpp b/client/ui/controllers/listViewFocusController.cpp index 574b3c9cb..1af6d5b41 100644 --- a/client/ui/controllers/listViewFocusController.cpp +++ b/client/ui/controllers/listViewFocusController.cpp @@ -202,7 +202,7 @@ void ListViewFocusController::focusNextItem() return; } - m_focusChain = focusControl::getItemsChain(currentDelegate()); + reloadFocusChain(); if (m_focusChain.empty()) { qWarning() << "No elements found in the delegate. Going to next delegate..."; @@ -224,7 +224,7 @@ void ListViewFocusController::focusPreviousItem() if (m_focusChain.empty()) { qDebug() << "Empty focusChain with current delegate: " << currentDelegate() << "Scanning for elements..."; - m_focusChain = focusControl::getItemsChain(currentDelegate()); + reloadFocusChain(); } if (m_focusChain.empty()) { qWarning() << "No elements found in the delegate. Going to next delegate..."; @@ -248,6 +248,11 @@ void ListViewFocusController::resetFocusChain() m_focusedItemIndex = -1; } +void ListViewFocusController::reloadFocusChain() +{ + m_focusChain = focusControl::getItemsChain(currentDelegate()); +} + bool ListViewFocusController::isFirstFocusItemInDelegate() const { return m_focusedItem && (m_focusedItem == m_focusChain.first()); diff --git a/client/ui/controllers/listViewFocusController.h b/client/ui/controllers/listViewFocusController.h index b77edfd6a..a0d7d7883 100644 --- a/client/ui/controllers/listViewFocusController.h +++ b/client/ui/controllers/listViewFocusController.h @@ -28,6 +28,7 @@ class ListViewFocusController : public QObject void focusNextItem(); void focusPreviousItem(); void resetFocusChain(); + void reloadFocusChain(); bool isFirstFocusItemInListView() const; bool isFirstFocusItemInDelegate() const; bool isLastFocusItemInListView() const;