// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include #include namespace app { template class InternalModel { protected: int modelIndex = 0; unsigned int internalOffset = 0; unsigned int internalLimit = 0; std::vector internalData; virtual ~InternalModel() { eraseInternalData(); } void eraseInternalData() { for (auto item : internalData) { delete item; } internalData.clear(); } void setupModel(const uint32_t offset, const uint32_t limit) { modelIndex = 0; internalOffset = offset; internalLimit = limit; } T getRecord(gui::Order order) { auto index = 0; if (order == gui::Order::Previous) { index = internalOffset + internalLimit - 1 + modelIndex; modelIndex--; } if (order == gui::Order::Next) { index = internalOffset + modelIndex; modelIndex++; } return getInternalDataElement(index, order); } [[nodiscard]] bool isIndexValid(unsigned int index, gui::Order order) const noexcept { return (index < internalData.size()) || (order == gui::Order::Previous && index < internalOffset); } void clearItemProperties(T Item) { Item->setFocus(false); Item->setVisible(true); Item->clearNavigationItem(gui::NavigationDirection::UP); Item->clearNavigationItem(gui::NavigationDirection::DOWN); } [[nodiscard]] T getInternalDataElement(unsigned int index, gui::Order order) { if (isIndexValid(index, order)) { clearItemProperties(internalData[index]); return internalData[index]; } else { return nullptr; } } }; } /* namespace app */