// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md #include "SpecialInputModel.hpp" #include "SpecialInputTableWidget.hpp" #include SpecialInputModel::SpecialInputModel(app::ApplicationCommon *app) : application(app) {} auto SpecialInputModel::requestRecordsCount() -> unsigned int { return internalData.size(); } auto SpecialInputModel::getMinimalItemSpaceRequired() const -> unsigned int { return specialInputStyle::specialCharacterTableWidget::window_grid_h; } void SpecialInputModel::requestRecords(const uint32_t offset, const uint32_t limit) { setupModel(offset, limit); list->onProviderDataUpdate(); } auto SpecialInputModel::getItem(gui::Order order) -> gui::ListItem * { return getRecord(order); } auto SpecialInputModel::getMaxGridElements() const -> ssize_t { return (specialInputStyle::specialCharacterTableWidget::window_grid_w / specialInputStyle::specialCharacterTableWidget::char_grid_w) * (specialInputStyle::specialCharacterTableWidget::window_grid_h / specialInputStyle::specialCharacterTableWidget::char_grid_h); } void SpecialInputModel::buildGrid(const std::vector &elements) { auto add_start = elements.begin(); while (add_start != elements.end()) { auto carrier_size = std::min(std::distance(add_start, elements.end()), getMaxGridElements()); std::list carriers; for (auto val : std::list(add_start, add_start + carrier_size)) { if (val == specialInputStyle::symbol_for_newline) { carriers.push_back(gui::generateNewLineSign()); } else { carriers.push_back(gui::generateCharSign(val)); } } add_start = add_start + carrier_size; internalData.push_back(new gui::SpecialInputTableWidget(application, std::move(carriers))); } } void SpecialInputModel::createData(specialInputStyle::CharactersType type) { auto create = [&](const auto &vector) { buildGrid(vector); for (auto &item : internalData) { item->deleteByList = false; } list->rebuildList(); }; switch (type) { case specialInputStyle::CharactersType::SpecialCharacters: create(std::vector{specialInputStyle::special_chars.begin(), specialInputStyle::special_chars.end()}); break; case specialInputStyle::CharactersType::Emoji: create(std::vector{specialInputStyle::emojis.begin(), specialInputStyle::emojis.end()}); break; } } void SpecialInputModel::clearData() { list->reset(); eraseInternalData(); }