~aleteoryx/muditaos

muditaos/module-apps/application-special-input/models/SpecialInputModel.cpp -rw-r--r-- 2.7 KiB
a405cad6Aleteoryx trim readme 6 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// 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 <ListView.hpp>

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<char32_t> &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<gui::Carrier> 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<char32_t>{specialInputStyle::special_chars.begin(), specialInputStyle::special_chars.end()});
        break;
    case specialInputStyle::CharactersType::Emoji:
        create(std::vector<char32_t>{specialInputStyle::emojis.begin(), specialInputStyle::emojis.end()});
        break;
    }
}

void SpecialInputModel::clearData()
{
    list->reset();
    eraseInternalData();
}