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 493dcf2d4..7f8b11c17 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 051feee31..29cf69b0b 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 61300f40a..5552fb053 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 ca3da4921..986ea3ce2 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 7880d0d90..461ca4966 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 62089c08b..5637e4ce4 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 f584ef263..eff65af9a 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 3b397f4ce..c21f89767 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 a438fdf54..bf40f473a 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 9afe817d6..78c396d12 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 027c54557..b9e0b062b 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 9c299772f..227b9ec13 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 fa137084f..adb5819be 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 03232a79e..e5c7308b6 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 f108fa945..f7141abe9 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 0950171c0..2611a3b48 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;