~aleteoryx/muditaos

ref: 5ac386b43170f717f09ef489495a4dde10d38cc4 muditaos/module-apps/application-bell-settings/models/TimeUnitsModel.cpp -rw-r--r-- 4.5 KiB
5ac386b4 — Mateusz Piesta [BH-794] Add temperature display 4 years 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "TimeUnitsModel.hpp"
#include "widgets/TimeFormatSetListItem.hpp"
#include "widgets/TimeSetListItem.hpp"
#include "widgets/TemperatureUnitListItem.hpp"

#include <gui/widgets/ListViewEngine.hpp>
#include <gui/widgets/Style.hpp>
#include <gui/widgets/Text.hpp>
#include <service-time/Constants.hpp>
#include <service-time/api/TimeSettingsApi.hpp>
#include <service-time/service-time/TimeMessage.hpp>
#include <widgets/TimeSetFmtSpinner.hpp>

#include <ctime>

namespace app::bell_settings
{
    TimeUnitsModel::TimeUnitsModel(app::Application *app) : application(app)
    {}

    TimeUnitsModel::~TimeUnitsModel()
    {
        clearData();
    }

    auto TimeUnitsModel::requestRecordsCount() -> unsigned int
    {
        return internalData.size();
    }

    auto TimeUnitsModel::getMinimalItemSpaceRequired() const -> unsigned int
    {
        return style::sidelistview::list_item::w;
    }

    auto TimeUnitsModel::getItem(gui::Order order) -> gui::ListItem *
    {
        return getRecord(order);
    }

    void TimeUnitsModel::createData()
    {

        timeFmtSetListItem =
            new gui::TimeFormatSetListItem(0,
                                           0,
                                           0,
                                           0,
                                           utils::translate("app_bell_settings_time_units_time_fmt_top_message"),
                                           utils::translate("app_bell_settings_time_units_time_fmt_bottom_message"));
        internalData.push_back(timeFmtSetListItem);

        timeSetListItem =
            new gui::TimeSetListItem(0U, 0U, 0, 0, utils::translate("app_bell_settings_time_units_time_message"));
        internalData.push_back(timeSetListItem);

        timeFmtSetListItem->onNextCallback = [this](gui::Item &) {
            timeSetListItem->timeSetFmtSpinner->setTimeFormat(timeFmtSetListItem->getTimeFmt());
        };

        temperatureUnitListItem =
            new gui::TemperatureUnitListItem(utils::translate("app_bell_settings_advanced_temp_scale"));
        internalData.push_back(temperatureUnitListItem);

        for (auto item : internalData) {
            item->deleteByList = false;
        }
    }

    void TimeUnitsModel::clearData()
    {
        eraseInternalData();
    }

    void TimeUnitsModel::saveData()
    {
        const auto now     = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
        const auto newTime = std::localtime(&now);
        newTime->tm_hour   = timeSetListItem->timeSetFmtSpinner->getHour();
        newTime->tm_min    = timeSetListItem->timeSetFmtSpinner->getMinute();
        const auto newFmt  = timeFmtSetListItem->getTimeFmt();
        LOG_INFO("Setting new time: %d:%d fmt: %s",
                 newTime->tm_hour,
                 newTime->tm_min,
                 utils::time::Locale::format(newFmt).c_str());
        sendRtcUpdateTimeMessage(std::mktime(newTime));
        sendTimeFmtUpdateMessage(newFmt);
    }

    void TimeUnitsModel::loadData()
    {
        const auto now        = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
        const auto time       = std::localtime(&now);
        const auto timeFormat = stm::api::timeFormat();
        timeSetListItem->timeSetFmtSpinner->setHour(time->tm_hour);
        timeSetListItem->timeSetFmtSpinner->setMinute(time->tm_min);
        timeSetListItem->timeSetFmtSpinner->setTimeFormat(timeFormat);
        timeFmtSetListItem->setTimeFmt(timeFormat);
    }

    auto TimeUnitsModel::requestRecords(uint32_t offset, uint32_t limit) -> void
    {
        setupModel(offset, limit);
        list->onProviderDataUpdate();
    }

    void TimeUnitsModel::sendRtcUpdateTimeMessage(time_t newTime)
    {
        auto msg = std::make_shared<stm::message::TimeChangeRequestMessage>(newTime);
        application->bus.sendUnicast(std::move(msg), service::name::service_time);
    }

    void TimeUnitsModel::sendTimeFmtUpdateMessage(utils::time::Locale::TimeFormat newFmt)
    {
        auto msg = std::make_shared<stm::message::SetTimeFormatRequest>(newFmt);
        application->bus.sendUnicast(std::move(msg), service::name::service_time);
    }

    auto TimeUnitsModel::getTemperatureUnit() -> utils::temperature::Temperature::Unit
    {
        return *utils::temperature::strToUnit(temperatureUnitListItem->getUnitAsStr());
    }
} // namespace app::bell_settings