// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include #include #include #include #include namespace gui { class TimerProperty : public Rect { class State { static constexpr int counterMaxDigits = 2; static constexpr int minimalValue = 1; static constexpr int maximalValue = 99; bool resetValueOnNumeric = true; int timeInMinutes; public: [[nodiscard]] std::chrono::minutes getTime() const noexcept { return std::chrono::minutes{timeInMinutes}; } bool setTime(int value); void checkBounds() noexcept; void putNumericValue(int digit) noexcept; void delNumericValue() noexcept; void increment() noexcept; void decrement() noexcept; void onFocus() noexcept { resetValueOnNumeric = true; checkBounds(); } } state; public: using OnChangeCallback = std::function; TimerProperty( Item *parent, const std::uint32_t x, const std::uint32_t y, const std::uint32_t w, const std::uint32_t h); bool onFocus(bool isFocused) final; bool onInput(const InputEvent &inputEvent) final; [[nodiscard]] std::chrono::minutes getTime() noexcept; bool setTime(std::int32_t newValue); void setOnChangeCallback(OnChangeCallback callback); private: Circle *circle = nullptr; VBox *centerBody = nullptr; Label *timeLabel = nullptr; Rect *divRect = nullptr; Label *timeUnitLabel = nullptr; OnChangeCallback onChangeCallback; void build(); void setMeditationTime(); }; } // namespace gui