~aleteoryx/muditaos

ref: 1fff0a5115f78af1d5bccad88e366dd1d9663e36 muditaos/module-apps/application-alarm-clock/widgets/AlarmRRuleOptionsItem.cpp -rw-r--r-- 4.2 KiB
1fff0a51 — Lukasz Mastalerz [BH-1768] Snooze mode with deep pressed knob 2 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
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "AlarmRRuleOptionsItem.hpp"

#include <application-alarm-clock/widgets/AlarmClockStyle.hpp>

namespace gui
{
    AlarmRRuleOptionsItem::AlarmRRuleOptionsItem(app::ApplicationCommon *app,
                                                 const std::string &description,
                                                 std::shared_ptr<app::alarmClock::AlarmRRulePresenter> presenter,
                                                 std::function<void(const UTF8 &text)> navBarTemporaryMode,
                                                 std::function<void()> navBarRestoreFromTemporaryMode)
        : AlarmOptionsItem(description), AlarmRRuleItem(std::move(presenter)), app(app),
          navBarTemporaryMode(std::move(navBarTemporaryMode)),
          navBarRestoreFromTemporaryMode(std::move(navBarRestoreFromTemporaryMode))
    {
        printOptions();

        inputCallback = [&](gui::Item &item, const gui::InputEvent &event) {
            auto ret = optionSpinner->onInput(event);

            if (getRRuleOption(optionSpinner->getCurrentValue()) == RRule::Custom) {
                this->navBarTemporaryMode(utils::translate(style::strings::common::edit));
                if (event.isShortRelease(gui::KeyCode::KEY_LF)) {
                    this->app->switchWindow(style::alarmClock::window::name::customRepeat);
                }
            }
            else {
                this->navBarRestoreFromTemporaryMode();
            }

            return ret;
        };

        focusChangedCallback = [&](Item &item) {
            setFocusItem(focus ? optionSpinner : nullptr);

            if (focus && (getRRuleOption(optionSpinner->getCurrentValue()) == RRule::Custom)) {
                this->navBarTemporaryMode(utils::translate(style::strings::common::edit));
            }
            else {
                this->navBarRestoreFromTemporaryMode();
            }

            return true;
        };

        onSaveCallback = [&]([[maybe_unused]] std::shared_ptr<AlarmEventRecord> alarm) {
            if (getRRuleOption(optionSpinner->getCurrentValue()) != RRule::Custom) {
                getPresenter()->setOption(getRRuleOption(optionSpinner->getCurrentValue()));
            }
        };

        onLoadCallback = [&]([[maybe_unused]] std::shared_ptr<AlarmEventRecord> alarm) {
            checkCustomOption(getPresenter()->getDescription());
            optionSpinner->setCurrentValue(getPresenter()->getDescription());
            if (optionSpinner->focus && getRRuleOption(optionSpinner->getCurrentValue()) == RRule::Custom) {
                this->navBarTemporaryMode(utils::translate(style::strings::common::edit));
            }
            else {
                this->navBarRestoreFromTemporaryMode();
            }

        };
    }

    AlarmRRuleOptionsItem::RRule AlarmRRuleOptionsItem::getRRuleOption(const std::string &selectedOption)
    {
        for (auto const &option : rRuleOptions) {
            if (option.second == selectedOption) {
                return option.first;
            }
        }

        return AlarmRRuleOptionsItem::RRule::Never;
    }

    void AlarmRRuleOptionsItem::checkCustomOption(const std::string &selectedOption)
    {
        if (rRuleOptions.back().second != utils::translate("app_alarm_clock_repeat_custom")) {
            if (const auto days = getPresenter()->getCustomDays();
                std::none_of(days.cbegin(), days.cend(), [](const auto &day) { return day.second; })) {
                rRuleOptions.back().second = utils::translate("app_alarm_clock_repeat_custom");
                printOptions();
            }
        }

        for (auto const &option : rRuleOptions) {
            if (selectedOption.empty() || option.second == selectedOption) {
                return;
            }
        }

        // replace Custom with days options
        rRuleOptions.back().second = selectedOption;
        printOptions();
    }

    void AlarmRRuleOptionsItem::printOptions()
    {
        std::vector<UTF8> printOptions;
        for (auto const &option : rRuleOptions) {
            printOptions.push_back(option.second);
        }
        optionSpinner->setData({printOptions});
    }
} /* namespace gui */