diff --git a/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp b/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp index 342c08cfe..3edeecf6d 100644 --- a/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp +++ b/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp @@ -113,6 +113,7 @@ namespace app::alarmClock emptyListIcon->setVisible(true); bottomBar->setActive(gui::BottomBar::Side::LEFT, false); bottomBar->setActive(gui::BottomBar::Side::CENTER, false); + application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP); } void AlarmClockMainWindow::onListFilled() @@ -120,5 +121,6 @@ namespace app::alarmClock emptyListIcon->setVisible(false); bottomBar->setActive(gui::BottomBar::Side::LEFT, true); bottomBar->setActive(gui::BottomBar::Side::CENTER, true); + application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP); } } // namespace app::alarmClock diff --git a/module-apps/application-calllog/windows/CallLogMainWindow.cpp b/module-apps/application-calllog/windows/CallLogMainWindow.cpp index 5492e8ca4..a67a75168 100644 --- a/module-apps/application-calllog/windows/CallLogMainWindow.cpp +++ b/module-apps/application-calllog/windows/CallLogMainWindow.cpp @@ -104,6 +104,7 @@ namespace gui bottomBar->setActive(gui::BottomBar::Side::LEFT, false); bottomBar->setActive(gui::BottomBar::Side::CENTER, false); emptyListIcon->setVisible(true); + application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP); } void CallLogMainWindow::onListFilled() @@ -111,5 +112,6 @@ namespace gui bottomBar->setActive(gui::BottomBar::Side::LEFT, true); bottomBar->setActive(gui::BottomBar::Side::CENTER, true); emptyListIcon->setVisible(false); + application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP); } } /* namespace gui */ diff --git a/module-apps/application-messages/windows/MessagesMainWindow.cpp b/module-apps/application-messages/windows/MessagesMainWindow.cpp index 37d9cc3f3..89199d8e2 100644 --- a/module-apps/application-messages/windows/MessagesMainWindow.cpp +++ b/module-apps/application-messages/windows/MessagesMainWindow.cpp @@ -88,12 +88,14 @@ namespace gui emptyListIcon->setVisible(true); bottomBar->setActive(BottomBar::Side::LEFT, false); bottomBar->setActive(BottomBar::Side::CENTER, false); + application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP); }; list->notEmptyListCallback = [this]() { emptyListIcon->setVisible(false); bottomBar->setActive(BottomBar::Side::LEFT, true); bottomBar->setActive(BottomBar::Side::CENTER, true); + application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP); }; setFocusItem(list); diff --git a/module-apps/application-notes/windows/NoteMainWindow.cpp b/module-apps/application-notes/windows/NoteMainWindow.cpp index 9874a0c57..8a6e88f59 100644 --- a/module-apps/application-notes/windows/NoteMainWindow.cpp +++ b/module-apps/application-notes/windows/NoteMainWindow.cpp @@ -98,6 +98,7 @@ namespace app::notes bottomBar->setActive(gui::BottomBar::Side::CENTER, false); emptyListIcon->setVisible(true); header->navigationIndicatorRemove(gui::header::BoxSelection::Right); + application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP); } void NoteMainWindow::onListFilled() @@ -106,6 +107,7 @@ namespace app::notes bottomBar->setActive(gui::BottomBar::Side::CENTER, true); emptyListIcon->setVisible(false); header->navigationIndicatorAdd(new gui::header::SearchAction(), gui::header::BoxSelection::Right); + application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP); } bool NoteMainWindow::onInput(const gui::InputEvent &inputEvent) diff --git a/module-apps/application-phonebook/data/ContactsMap.hpp b/module-apps/application-phonebook/data/ContactsMap.hpp index fef4a35dd..67d4a3ea8 100644 --- a/module-apps/application-phonebook/data/ContactsMap.hpp +++ b/module-apps/application-phonebook/data/ContactsMap.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -33,5 +33,5 @@ struct ContactsMapData { std::map firstLetterDictionary; std::uint32_t favouritesCount; - std::uint32_t itemCount; + std::uint32_t itemCount = 0; }; diff --git a/module-apps/application-phonebook/models/PhonebookModel.cpp b/module-apps/application-phonebook/models/PhonebookModel.cpp index 2cdf5385b..91a442032 100644 --- a/module-apps/application-phonebook/models/PhonebookModel.cpp +++ b/module-apps/application-phonebook/models/PhonebookModel.cpp @@ -35,7 +35,9 @@ auto PhonebookModel::requestRecordsCount() -> unsigned int auto dispMode = static_cast(getDisplayMode()); if (dispMode == ContactDisplayMode::SortedByLetter) { - return letterMap.itemCount; + letterMap = requestLetterMap(); + recordsCount = letterMap.itemCount; + return recordsCount; } auto [code, msg] = DBServiceAPI::GetQueryWithReply( diff --git a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp index 3b2dbf94f..be62b1163 100644 --- a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +++ b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp @@ -60,7 +60,6 @@ namespace gui contactsList->emptyListCallback = [this]() { onEmptyList(); }; contactsList->notEmptyListCallback = [this]() { onListFilled(); }; - phonebookModel->letterMap = phonebookModel->requestLetterMap(); phonebookModel->setDisplayMode(static_cast(ContactDisplayMode::SortedByLetter)); contactsList->rebuildList(gui::listview::RebuildType::Full); @@ -176,6 +175,7 @@ namespace gui bottomBar->setActive(gui::BottomBar::Side::CENTER, false); emptyListIcon->setVisible(true); header->navigationIndicatorRemove(gui::header::BoxSelection::Right); + application->refreshWindow(RefreshModes::GUI_REFRESH_DEEP); } void PhonebookMainWindow::onListFilled() @@ -184,5 +184,6 @@ namespace gui bottomBar->setActive(gui::BottomBar::Side::CENTER, true); emptyListIcon->setVisible(false); header->navigationIndicatorAdd(new gui::header::SearchAction(), gui::header::BoxSelection::Right); + application->refreshWindow(RefreshModes::GUI_REFRESH_DEEP); } } /* namespace gui */ diff --git a/module-gui/gui/widgets/ListViewEngine.cpp b/module-gui/gui/widgets/ListViewEngine.cpp index de6216cf0..c619d7106 100644 --- a/module-gui/gui/widgets/ListViewEngine.cpp +++ b/module-gui/gui/widgets/ListViewEngine.cpp @@ -21,8 +21,7 @@ namespace gui void ListViewEngine::setElementsCount(unsigned int count) { if (elementsCount != count || elementsCount == 0) { - elementsCount = count; - onElementsCountChanged(); + onElementsCountChanged(count); } } @@ -201,6 +200,7 @@ namespace gui } clear(); + checkEmptyListCallbacks(); addItemsOnPage(); @@ -401,22 +401,34 @@ namespace gui } } - void ListViewEngine::onElementsCountChanged() + void ListViewEngine::onElementsCountChanged(unsigned int count) { - if (isEmpty()) { - if (emptyListCallback) { - emptyListCallback(); - } - } - else if (notEmptyListCallback) { - notEmptyListCallback(); + if (elementsCount == 0 || count == 0) { + shouldCallEmptyListCallbacks = true; } + elementsCount = count; + if (checkFullRenderRequirementCallback) { checkFullRenderRequirementCallback(); } } + void ListViewEngine::checkEmptyListCallbacks() + { + if (shouldCallEmptyListCallbacks) { + if (isEmpty()) { + if (emptyListCallback) { + emptyListCallback(); + } + } + else if (notEmptyListCallback) { + notEmptyListCallback(); + } + shouldCallEmptyListCallbacks = false; + } + } + void ListViewEngine::recalculateOnBoxRequestedResize() { if (currentPageSize != body->getVisibleChildrenCount()) { diff --git a/module-gui/gui/widgets/ListViewEngine.hpp b/module-gui/gui/widgets/ListViewEngine.hpp index 936e013fe..0950171c0 100644 --- a/module-gui/gui/widgets/ListViewEngine.hpp +++ b/module-gui/gui/widgets/ListViewEngine.hpp @@ -104,7 +104,9 @@ namespace gui /// Total provider elements count unsigned int elementsCount = 0; void setElementsCount(unsigned int count); - void onElementsCountChanged(); + void onElementsCountChanged(unsigned int count); + bool shouldCallEmptyListCallbacks = false; + void checkEmptyListCallbacks(); /// Data model provider std::shared_ptr provider = nullptr;