// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include #include "Arc.hpp" #include "Circle.hpp" #include "Rect.hpp" namespace gui { class Progress { public: virtual ~Progress() noexcept = default; virtual void setMaximum(unsigned int value) = 0; virtual auto setValue(unsigned int value) -> bool = 0; virtual void setPercentageValue(unsigned int value) = 0; [[nodiscard]] virtual int getMaximum() const = 0; }; class ProgressBar : public Rect, public Progress { public: [[deprecated]] ProgressBar(Item *parent, std::uint32_t x, std::uint32_t y, std::uint32_t w, std::uint32_t h); void setMaximum(unsigned int value) noexcept override; auto setValue(unsigned int value) noexcept -> bool override; void setPercentageValue(unsigned int value) noexcept override; [[nodiscard]] int getMaximum() const noexcept override; void buildDrawListImplementation(std::list &commands) override; bool onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) override; private: void createWidgets(); unsigned int maxValue = 0U; unsigned int currentValue = 0U; gui::Rect *fillRect = nullptr; }; class CircularProgressBar : public Circle, public Progress { public: CircularProgressBar(Item *parent, const Circle::ShapeParams &shape); void setMaximum(unsigned int value) noexcept override; auto setValue(unsigned int value) noexcept -> bool override; void setPercentageValue(unsigned int value) noexcept override; [[nodiscard]] int getMaximum() const noexcept override; void buildDrawListImplementation(std::list &commands) override; auto onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) -> bool override; private: void createWidgets(); auto calculateProgressIndicatorCenter() const -> Point; auto getPercentageValue() const -> float; unsigned int maxValue = 0U; unsigned int currentValue = 0U; Arc *progressArc = nullptr; Circle *progressIndicator = nullptr; }; class ArcProgressBar : public Arc, public Progress { public: enum class ProgressDirection { Clockwise, CounterClockwise }; ArcProgressBar(Item *parent, const Arc::ShapeParams &shape, ProgressDirection direction = ProgressDirection::Clockwise); void setMaximum(unsigned int value) noexcept override; auto setValue(unsigned int value) noexcept -> bool override; void setPercentageValue(unsigned int value) noexcept override; [[nodiscard]] int getMaximum() const noexcept override; void buildDrawListImplementation(std::list &commands) override; auto onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) -> bool override; private: void createWidgets(); auto calculateStartIndicatorCenter() const -> Point; auto calculateEndIndicatorCenter() const -> Point; auto getPercentageValue() const -> float; unsigned int maxValue = 0U; unsigned int currentValue = 0U; Arc *progressArc = nullptr; Arc *progressStartIndicator = nullptr; Arc *progressEndIndicator = nullptr; ProgressDirection direction = ProgressDirection::Clockwise; }; } // namespace gui