// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "Image.hpp" #include "SideListView.hpp" #include "Style.hpp" namespace gui { SideListView::SideListView(Item *parent, unsigned int x, unsigned int y, unsigned int w, unsigned int h, std::shared_ptr prov) : Rect{parent, x, y, w, h} { setEdges(RectangleEdge::None); auto body = new VBox{this, x, y, w, h}; body->setEdges(RectangleEdge::None); progressbar = new HBarGraph(body, 0U, 0U, 0U); progressbar->setMargins(Margins(style::sidelistview::progress_bar::margin_left, style::sidelistview::progress_bar::margin_top, style::sidelistview::progress_bar::margin_right, style::sidelistview::progress_bar::margin_bottom)); progressbar->activeItem = false; progressbar->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); listItemBox = new gui::HBox(body, 0U, 0U, style::sidelistview::list_item::w, style::sidelistview::list_item::h); listItemBox->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); listItemBox->setEdges(gui::RectangleEdge::None); auto arrowsHBox = new HBox{this, style::sidelistview::arrows_hbox::x, style::sidelistview::arrows_hbox::y, style::sidelistview::arrows_hbox::w, style::sidelistview::arrows_hbox::h}; arrowsHBox->setEdges(gui::RectangleEdge::None); auto arrowLeft = new gui::Image(style::sidelistview::arrow_left_image); arrowLeft->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); arrowLeft->activeItem = false; arrowLeft->setEdges(RectangleEdge::None); arrowsHBox->addWidget(arrowLeft); auto arrowRight = new gui::Image(style::sidelistview::arrow_right_image); arrowRight->setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); arrowRight->activeItem = false; arrowRight->setEdges(RectangleEdge::None); auto rectFiller = new gui::Rect(arrowsHBox, 0U, 0U, arrowsHBox->getWidth() - arrowLeft->getWidth() - arrowRight->getWidth(), arrowsHBox->getHeight()); rectFiller->setMaximumSize(arrowsHBox->getWidth(), arrowsHBox->getHeight()); rectFiller->setEdges(RectangleEdge::None); arrowsHBox->addWidget(arrowRight); if (prov != nullptr) { provider = std::move(prov); provider->list = this; } type = gui::ItemType::LIST; progressbar->setMaximum(provider->requestRecordsCount()); progressbar->createGraph(); progressbar->setValue(progressbarStartValue); if (auto firstItem = provider->getItem(Order::Next)) { listItemBox->addWidget(firstItem); listItemBox->setFocusItem(firstItem); } } bool SideListView::onInput(const gui::InputEvent &inputEvent) { if (auto ret = listItemBox->onInput(inputEvent)) { return ret; } if (inputEvent.isShortRelease(KeyCode::KEY_ENTER)) { if (slide(Order::Next)) { progressbar->setValue(progressbar->getValue() + 1); return true; } } else if (inputEvent.isShortRelease(KeyCode::KEY_RF)) { if (slide(Order::Previous)) { progressbar->setValue(progressbar->getValue() - 1); return true; } } return false; } auto SideListView::slide(gui::Order order) -> bool { auto newItem = provider->getItem(order); clear(); if (newItem != nullptr) { listItemBox->addWidget(newItem); listItemBox->setFocusItem(newItem); return true; } return false; } SideListView::~SideListView() { clear(); } void SideListView::clear() { listItemBox->setFocusItem(nullptr); while (auto el = listItemBox->children.back()) { if (el->type == ItemType::LIST_ITEM) { if (!dynamic_cast(el)->deleteByList) { listItemBox->removeWidget(el); } else { listItemBox->erase(el); } } else { listItemBox->erase(el); } } } } /* namespace gui */