From 19d6468e30978f3214546e8a3237db3be00b87cc Mon Sep 17 00:00:00 2001 From: Przemyslaw Brudny Date: Fri, 14 Jan 2022 14:00:46 +0100 Subject: [PATCH] [EGD-8035] Fixed looped lists and applied to all Pure lists Fixed looped lists bugs and applied to all Pure lists. --- .../windows/AlarmClockMainWindow.cpp | 3 ++- .../windows/CallLogMainWindow.cpp | 4 +-- .../windows/MessagesMainWindow.cpp | 8 +++--- .../windows/MusicPlayerAllSongsWindow.cpp | 3 ++- .../windows/NoteMainWindow.cpp | 3 ++- .../windows/SearchResultsWindow.cpp | 3 ++- .../windows/PhonebookContactDetails.cpp | 2 +- .../windows/PhonebookMainWindow.cpp | 3 ++- .../windows/PhonebookNewContact.cpp | 3 ++- .../windows/PhonebookSearchResults.cpp | 3 ++- module-apps/apps-common/InternalModel.hpp | 11 +++++--- .../apps-common/windows/OptionWindow.cpp | 4 +-- module-gui/gui/widgets/ListView.cpp | 19 +++++++++++--- module-gui/gui/widgets/ListView.hpp | 3 ++- module-gui/gui/widgets/ListViewEngine.cpp | 26 ++++++++++++++----- module-gui/gui/widgets/ListViewEngine.hpp | 11 +++++++- 16 files changed, 78 insertions(+), 31 deletions(-) diff --git a/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp b/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp index 493dcf2d4154d49ede27a1aa0baf335f2d1fefb5..7f8b11c17eadb68b383f7d6e9ef657ae4dedfb3f 100644 --- a/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp +++ b/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "AlarmClockMainWindow.hpp" @@ -47,6 +47,7 @@ namespace app::alarmClock style::alarmClock::window::listView_h, presenter->getAlarmsItemProvider(), gui::listview::ScrollBarType::Fixed); + alarmsList->setBoundaries(gui::Boundaries::Continuous); alarmsList->focusChangedCallback = [this](gui::Item &) { onListFilled(); diff --git a/module-apps/application-calllog/windows/CallLogMainWindow.cpp b/module-apps/application-calllog/windows/CallLogMainWindow.cpp index 051feee31585ebcf479452de035005310bbb2216..29cf69b0baaada540b360524618f13c35a3769b2 100644 --- a/module-apps/application-calllog/windows/CallLogMainWindow.cpp +++ b/module-apps/application-calllog/windows/CallLogMainWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "CallLogMainWindow.hpp" @@ -56,7 +56,7 @@ namespace gui mainWindow::h, calllogModel, gui::listview::ScrollBarType::Fixed); - + list->setBoundaries(Boundaries::Continuous); setFocusItem(list); buildInterfaceForEmptyState(); diff --git a/module-apps/application-messages/windows/MessagesMainWindow.cpp b/module-apps/application-messages/windows/MessagesMainWindow.cpp index 61300f40a90145b4e2e5735c29e6bf9a8e063485..5552fb05319254f6f70688ef3f0f3fe0b635fe27 100644 --- a/module-apps/application-messages/windows/MessagesMainWindow.cpp +++ b/module-apps/application-messages/windows/MessagesMainWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ApplicationMessages.hpp" @@ -53,8 +53,8 @@ namespace gui msgThreadStyle::listHeight, threadsModel, listview::ScrollBarType::Fixed); + list->setBoundaries(Boundaries::Continuous); list->setScrollTopMargin(style::margins::small); - list->rebuildList(); navBar->setActive(nav_bar::Side::Left, true); navBar->setActive(nav_bar::Side::Center, true); @@ -112,7 +112,7 @@ namespace gui using db::query::ThreadGetByNumberResult; auto primaryNumber = pdata->result->numbers[0].number; auto query = std::make_unique(primaryNumber); - auto task = app::AsyncQuery::createFromQuery(std::move(query), db::Interface::Name::Contact); + auto task = app::AsyncQuery::createFromQuery(std::move(query), db::Interface::Name::Contact); task->setCallback([app = application](auto response) { if (const auto result = dynamic_cast(response); result != nullptr) { if (auto thread = result->getThread(); thread.isValid()) { @@ -132,7 +132,7 @@ namespace gui db::Interface::Name::Notifications, std::make_unique(NotificationsRecord::Key::Sms)); - list->rebuildList(); + list->rebuildList(listview::RebuildType::InPlace); } bool MessagesMainWindow::onInput(const InputEvent &inputEvent) diff --git a/module-apps/application-music-player/windows/MusicPlayerAllSongsWindow.cpp b/module-apps/application-music-player/windows/MusicPlayerAllSongsWindow.cpp index ca3da4921c5a7f48ad7b0390ab8abc4303c2d76a..986ea3ce2aa3cf7159fec911a348b7367196c338 100644 --- a/module-apps/application-music-player/windows/MusicPlayerAllSongsWindow.cpp +++ b/module-apps/application-music-player/windows/MusicPlayerAllSongsWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "MusicPlayerAllSongsWindow.hpp" @@ -37,6 +37,7 @@ namespace gui musicPlayerStyle::allSongsWindow::h, presenter->getMusicPlayerModelInterface(), listview::ScrollBarType::Fixed); + songsList->setBoundaries(Boundaries::Continuous); emptyListIcon = new gui::Icon(this, style::window::default_left_margin, diff --git a/module-apps/application-notes/windows/NoteMainWindow.cpp b/module-apps/application-notes/windows/NoteMainWindow.cpp index 7880d0d90f08053100b8b582f2129c0615487ede..461ca4966b922c549e9fbb506d5f9b8739ad1b23 100644 --- a/module-apps/application-notes/windows/NoteMainWindow.cpp +++ b/module-apps/application-notes/windows/NoteMainWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "NoteMainWindow.hpp" @@ -61,6 +61,7 @@ namespace app::notes listStyle::Height, presenter->getNotesItemProvider(), gui::listview::ScrollBarType::Fixed); + list->setBoundaries(gui::Boundaries::Continuous); list->setPenWidth(listStyle::PenWidth); list->setPenFocusWidth(listStyle::FocusedPenWidth); list->focusChangedCallback = [this]([[maybe_unused]] gui::Item &item) { diff --git a/module-apps/application-notes/windows/SearchResultsWindow.cpp b/module-apps/application-notes/windows/SearchResultsWindow.cpp index 62089c08b168c7f22199e1ed487f884b640fbc55..5637e4ce4b14606ca7c1f1160e42444bf6f34145 100644 --- a/module-apps/application-notes/windows/SearchResultsWindow.cpp +++ b/module-apps/application-notes/windows/SearchResultsWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "SearchResultsWindow.hpp" @@ -41,6 +41,7 @@ namespace app::notes style::list::Height, presenter->getNotesItemProvider(), gui::listview::ScrollBarType::Fixed); + list->setBoundaries(gui::Boundaries::Continuous); list->setScrollTopMargin(::style::margins::small); list->emptyListCallback = [&]() { onNothingFound(presenter->getSearchText()); }; setFocusItem(list); diff --git a/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp b/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp index f584ef26363c728a94fe5517bbb46a7fcfe8bf8e..eff65af9a3670768ab2e64e19901d62e91151e52 100644 --- a/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp +++ b/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "PhonebookContactDetails.hpp" diff --git a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp index 3b397f4cee828e10b2bafba10cb5ae42908bd870..c21f897670024e9cb942d42da2a1df86e47da348 100644 --- a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +++ b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "PhonebookMainWindow.hpp" @@ -46,6 +46,7 @@ namespace gui phonebookStyle::mainWindow::contactsList::w, phonebookStyle::mainWindow::contactsList::h, phonebookModel); + contactsList->setBoundaries(Boundaries::Continuous); setFocusItem(contactsList); emptyListIcon = diff --git a/module-apps/application-phonebook/windows/PhonebookNewContact.cpp b/module-apps/application-phonebook/windows/PhonebookNewContact.cpp index a438fdf54f7661a4d68068d4c41de3221037748e..bf40f473a65795877fb710e611abee0b7fccb44b 100644 --- a/module-apps/application-phonebook/windows/PhonebookNewContact.cpp +++ b/module-apps/application-phonebook/windows/PhonebookNewContact.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "PhonebookNewContact.hpp" @@ -41,6 +41,7 @@ namespace gui phonebookStyle::newContactWindow::newContactsList::h, newContactModel, listview::ScrollBarType::PreRendered); + list->setBoundaries(Boundaries::Continuous); setFocusItem(list); } diff --git a/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp b/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp index 9afe817d633df223742368a548bcf8885a453ce7..78c396d12cd5a3c3b66f0108c38f78f78fbe7b05 100644 --- a/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp +++ b/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "PhonebookSearchResults.hpp" @@ -34,6 +34,7 @@ namespace gui phonebookStyle::searchResultsWindow::searchResultList::w, phonebookStyle::searchResultsWindow::searchResultList::h, searchResultsModel); + searchResultList->setBoundaries(Boundaries::Continuous); setFocusItem(searchResultList); navBar->setActive(nav_bar::Side::Center, true); diff --git a/module-apps/apps-common/InternalModel.hpp b/module-apps/apps-common/InternalModel.hpp index 027c54557279470885989158049468a3c5d602f4..b9e0b062b349d980bada7bc0ad7e7884dc5f151e 100644 --- a/module-apps/apps-common/InternalModel.hpp +++ b/module-apps/apps-common/InternalModel.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -42,8 +42,11 @@ namespace app { auto index = 0; if (order == gui::Order::Previous) { - index = internalOffset + internalLimit - 1 + modelIndex; + auto calculatedIndex = internalOffset + internalLimit >= internalData.size() + ? internalData.size() + : internalOffset + internalLimit; + index = calculatedIndex - 1 + modelIndex; modelIndex--; } if (order == gui::Order::Next) { @@ -57,7 +60,9 @@ namespace app [[nodiscard]] bool isIndexValid(unsigned int index, gui::Order order) const noexcept { - return (index < internalData.size()) || (order == gui::Order::Previous && index < internalOffset); + return (order == gui::Order::Next && index < internalData.size()) || + (order == gui::Order::Previous && static_cast(index) >= 0 && index < internalData.size() && + index >= internalOffset); } void clearItemProperties(T Item) diff --git a/module-apps/apps-common/windows/OptionWindow.cpp b/module-apps/apps-common/windows/OptionWindow.cpp index 9c299772fd17742d44aa0840119a5cf56993f019..227b9ec1319dc14f2affadadf11794dae3a4f8a2 100644 --- a/module-apps/apps-common/windows/OptionWindow.cpp +++ b/module-apps/apps-common/windows/OptionWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "OptionWindow.hpp" @@ -43,7 +43,7 @@ namespace gui option::window::optionsListH, optionsModel, listview::ScrollBarType::None); - + optionsList->setBoundaries(Boundaries::Continuous); optionsList->prepareRebuildCallback = [this]() { recreateOptions(); }; optionsModel->createData(options); diff --git a/module-gui/gui/widgets/ListView.cpp b/module-gui/gui/widgets/ListView.cpp index fa137084fe7dee3a16eb7daf2ce9636197d3314a..adb5819becb23e3e985c1422c919a140bd2c92b2 100644 --- a/module-gui/gui/widgets/ListView.cpp +++ b/module-gui/gui/widgets/ListView.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ListView.hpp" @@ -179,7 +179,7 @@ namespace gui style::listview::scroll::h, scrollBarType); } - + determineFetchType(scrollBarType); applyScrollCallbacks(); type = gui::ItemType::LIST; @@ -209,6 +209,20 @@ namespace gui }; } + void ListView::determineFetchType(listview::ScrollBarType scrollType) + { + switch (scrollType) { + case listview::ScrollBarType::None: + case listview::ScrollBarType::Fixed: + fetchType = listview::FetchType::Fixed; + break; + case listview::ScrollBarType::Proportional: + case listview::ScrollBarType::PreRendered: + fetchType = listview::FetchType::Filled; + break; + } + } + void ListView::clear() { if (scroll) { @@ -262,5 +276,4 @@ namespace gui { return Size(request_w, request_h); } - } /* namespace gui */ diff --git a/module-gui/gui/widgets/ListView.hpp b/module-gui/gui/widgets/ListView.hpp index 03232a79e4591a5f30d90b66d270c12463901b81..e5c7308b60099e65ccfb0ed9a06e2a0e8d4fc205 100644 --- a/module-gui/gui/widgets/ListView.hpp +++ b/module-gui/gui/widgets/ListView.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -39,6 +39,7 @@ namespace gui protected: ListViewScroll *scroll = nullptr; void applyScrollCallbacks(); + void determineFetchType(listview::ScrollBarType scrollType); void setFocus() override; public: diff --git a/module-gui/gui/widgets/ListViewEngine.cpp b/module-gui/gui/widgets/ListViewEngine.cpp index f108fa945af1d001fa0a466b280cd0fc63fa94f9..f7141abe9caec06f88eb29fbcebe499890b6b2e0 100644 --- a/module-gui/gui/widgets/ListViewEngine.cpp +++ b/module-gui/gui/widgets/ListViewEngine.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ListViewEngine.hpp" @@ -275,7 +275,7 @@ namespace gui void ListViewEngine::fillFirstPage() { - // Check if first page is filled with items. If not reload page to be filed with items. Check for both + // Check if first page is filled with items. If not reload page to be filled with items. Check for both // Orientations. if (orientation == listview::Orientation::TopBottom && direction == listview::Direction::Top && startIndex == 0) { @@ -465,10 +465,12 @@ namespace gui { auto minLimit = (2 * currentPageSize > calculateMaxItemsOnPage() ? 2 * currentPageSize : calculateMaxItemsOnPage()); - if (value == listview::Direction::Bottom) + if (value == listview::Direction::Bottom) { return (minLimit + startIndex <= elementsCount ? minLimit : elementsCount - startIndex); - else + } + else { return minLimit < startIndex ? minLimit : startIndex; + } } bool ListViewEngine::requestNextPage() @@ -503,9 +505,18 @@ namespace gui if (startIndex == 0 && boundaries == Boundaries::Continuous) { - startIndex = elementsCount; - topFetchIndex = elementsCount - calculateLimit(listview::Direction::Top); - limit = calculateLimit(listview::Direction::Top); + startIndex = elementsCount; + if (elementsCount > currentPageSize && fetchType == listview::FetchType::Fixed) { + + auto calculateFixedFill = + elementsCount % currentPageSize != 0 ? elementsCount % currentPageSize : currentPageSize; + topFetchIndex = elementsCount - calculateFixedFill; + } + else { + topFetchIndex = elementsCount - calculateLimit(listview::Direction::Top); + } + + limit = calculateLimit(listview::Direction::Top); } else if (startIndex == 0 && boundaries == Boundaries::Fixed) { @@ -523,6 +534,7 @@ namespace gui body->setReverseOrder(true); pageLoaded = false; storedFocusIndex = listview::nPos; + provider->requestRecords(topFetchIndex, limit); return true; diff --git a/module-gui/gui/widgets/ListViewEngine.hpp b/module-gui/gui/widgets/ListViewEngine.hpp index 0950171c0f2a8cf8b283e788f833e29436971002..2611a3b48e3d6ee15b314ceadcab80b43ea80d0d 100644 --- a/module-gui/gui/widgets/ListViewEngine.hpp +++ b/module-gui/gui/widgets/ListViewEngine.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -42,6 +42,13 @@ namespace gui ///< context and can be time consuming. }; + /// Possible page fill types + enum class FetchType + { + Filled, ///< Filled - list always fetch object from provider as long it has space. + Fixed ///< Fixed - lists fetches objects from provider accordinly to fixed pages sizes. + }; + enum class Orientation { TopBottom, @@ -150,6 +157,8 @@ namespace gui listview::Direction direction = listview::Direction::Bottom; /// List orientation (from which end element will start to load) listview::Orientation orientation = listview::Orientation::TopBottom; + /// List fill type + listview::FetchType fetchType = listview::FetchType::Filled; /// Flag to indicate full data request completed bool requestCompleteData = false;