From 0a322b878cb26c450064e5e3d9ec825415de241c Mon Sep 17 00:00:00 2001 From: Przemyslaw Brudny Date: Thu, 20 May 2021 14:44:20 +0200 Subject: [PATCH] [EGD-6770] ListView onPageElement rebuild page jump added ListView onPageElement rebuild page jump added. --- module-apps/options/OptionsModel.cpp | 2 +- module-gui/gui/widgets/ListView.cpp | 8 +++++--- module-gui/gui/widgets/ListView.hpp | 2 +- module-gui/test/test-google/test-gui-listview.cpp | 8 ++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/module-apps/options/OptionsModel.cpp b/module-apps/options/OptionsModel.cpp index 697ce16ce8a98d23b443283457786816c7df92c6..86d81de29ea4356bda2caea5af5062ff74904d22 100644 --- a/module-apps/options/OptionsModel.cpp +++ b/module-apps/options/OptionsModel.cpp @@ -14,7 +14,7 @@ auto OptionsModel::requestRecordsCount() -> unsigned int auto OptionsModel::getMinimalItemHeight() const -> unsigned int { - return style::window::label::big_h; + return style::window::label::big_h + gui::option::window::option_bottom_margin; } void OptionsModel::requestRecords(const uint32_t offset, const uint32_t limit) diff --git a/module-gui/gui/widgets/ListView.cpp b/module-gui/gui/widgets/ListView.cpp index 8a62b347860d68d83312ac3753c9c5c40f059586..2cc2d0a5f3ec027086f8a493fd6ef2e860942b2d 100644 --- a/module-gui/gui/widgets/ListView.cpp +++ b/module-gui/gui/widgets/ListView.cpp @@ -34,7 +34,7 @@ namespace gui void ListViewScroll::updateFixed(const ListViewScrollUpdateData &data) { - auto elementsOnPage = (parent->widgetArea.h - data.topMargin) / data.elementMinimalHeight; + auto elementsOnPage = parent->widgetArea.h / data.elementMinimalHeight; pagesCount = data.elementsCount % elementsOnPage == 0 ? data.elementsCount / elementsOnPage : data.elementsCount / elementsOnPage + 1; @@ -71,7 +71,7 @@ namespace gui storedStartIndex = data.startIndex; - auto scrollH = (parent->widgetArea.h - data.topMargin) / pagesCount; + auto scrollH = parent->widgetArea.h / pagesCount; auto scrollY = currentPage * scrollH > 0 ? currentPage * scrollH : data.topMargin; setArea(BoundingBox( @@ -295,7 +295,8 @@ namespace gui void ListView::prepareOnPageElementRebuild(unsigned int dataOffset) { - storedFocusIndex = dataOffset; + startIndex = (dataOffset / calculateMaxItemsOnPage()) * calculateMaxItemsOnPage(); + storedFocusIndex = dataOffset % calculateMaxItemsOnPage(); } void ListView::setup(listview::RebuildType rebuildType, unsigned int dataOffset) @@ -317,6 +318,7 @@ namespace gui if (prepareRebuildCallback) { prepareRebuildCallback(); + setElementsCount(provider->requestRecordsCount()); } lastRebuildRequest = {rebuildType, dataOffset}; diff --git a/module-gui/gui/widgets/ListView.hpp b/module-gui/gui/widgets/ListView.hpp index 39e465fdf4f199ed0f9dec8c1257bc66cf257805..171783a97d431dadf2fea0849adee77273e6c1fe 100644 --- a/module-gui/gui/widgets/ListView.hpp +++ b/module-gui/gui/widgets/ListView.hpp @@ -37,7 +37,7 @@ namespace gui { Full, ///< Full rebuild - resets lists to all initial conditions and request data from beginning. InPlace, ///< InPlace rebuild - stores currently focused part of list and rebuild from that part. - OnPageElement, ///< OnPageElement rebuild - same page but focus changed on provided element index. + OnPageElement, ///< OnPageElement rebuild - focus on provided element index and calculated page. OnOffset ///< OnOffset rebuild - resets lists to all initial conditions and request data from provided ///< offset. }; diff --git a/module-gui/test/test-google/test-gui-listview.cpp b/module-gui/test/test-google/test-gui-listview.cpp index 97bf7b2112ccdb42552ce763b20558f0e2956aca..1da9bfffd90170a900e199edec520c2f352eff4a 100644 --- a/module-gui/test/test-google/test-gui-listview.cpp +++ b/module-gui/test/test-google/test-gui-listview.cpp @@ -394,10 +394,10 @@ TEST_F(ListViewTesting, Rebuild_Type_Test) ASSERT_EQ(1, dynamic_cast(testListView->body->getFocusItem())->ID) << "Check if item 1 has focus"; - // Do on page element rebuild on index outside Page scope (should focus on last possible) - testListView->rebuildList(gui::listview::RebuildType::OnPageElement, 10); + // Do on page element rebuild on index outside Page scope. Page should change and proper element should be focused. + testListView->rebuildList(gui::listview::RebuildType::OnPageElement, 8); // Check if focused item did not change - ASSERT_EQ(5, dynamic_cast(testListView->body->getFocusItem())->ID) - << "Check if item 5 has focus"; + ASSERT_EQ(8, dynamic_cast(testListView->body->getFocusItem())->ID) + << "Check if item 8 has focus"; }