// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "PhonebookListView.hpp" namespace gui { PhonebookListView::PhonebookListView( Item *parent, uint32_t x, uint32_t y, uint32_t w, uint32_t h, std::shared_ptr prov) : ListView(parent, x, y, w, h, prov) {} void PhonebookListView::addLabelMarker(gui::PhonebookItem *item) { if (direction == listview::Direction::Bottom) { if (!(labelMark == (item)->getLabelMarker())) { labelMark = (item)->getLabelMarker(); gui::PhonebookItem *phonebookLabel = new gui::PhonebookItem(); phonebookLabel->setMarkerItem(labelMark); body->addWidget(phonebookLabel); } } if (direction == listview::Direction::Top) { if (currentPageSize == 0) { labelMark = (item)->getLabelMarker(); return; } else if (!(labelMark == (item)->getLabelMarker())) { previousLabelMark = labelMark; labelMark = (item)->getLabelMarker(); gui::PhonebookItem *phonebookLabel = new gui::PhonebookItem(); phonebookLabel->setMarkerItem(previousLabelMark); body->removeWidget(item); body->addWidget(phonebookLabel); body->addWidget(item); previousItemIsLabel = true; } } } void PhonebookListView::addItemsOnPage() { currentPageSize = 0; ListItem *item = nullptr; ListItem *previousListItem = nullptr; labelMark = ""; previousLabelMark = ""; while ((item = provider->getItem(getOrderFromDirection())) != nullptr) { // if direction bot add label mark before adding item if (direction == listview::Direction::Bottom) { addLabelMarker(dynamic_cast(item)); } body->addWidget(item); // if added item is not visible -> page is full. if (item->visible != true) { // if page full and direction top remove last element and add floating label mark on top if there was no // one previously if (direction == listview::Direction::Top) { if (previousItemIsLabel) { break; } else { body->erase(item); body->erase(previousListItem); gui::PhonebookItem *phonebookLabel = new gui::PhonebookItem(); phonebookLabel->setMarkerItem(labelMark); body->addWidget(phonebookLabel); currentPageSize--; } } break; } // if direction top add label mark after adding item if (direction == listview::Direction::Top) { previousItemIsLabel = false; addLabelMarker(dynamic_cast(item)); } previousListItem = item; currentPageSize++; } recalculateStartIndex(); // Add element on top for first page purpose if (startIndex == 0 && direction == listview::Direction::Top) { auto *phonebookLabel = new gui::PhonebookItem(); phonebookLabel->setMarkerItem(labelMark); body->addWidget(phonebookLabel); } } } /* namespace gui */