mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-01-03 19:38:44 -05:00
Implemented new countdown progress bar design, used in Relaxation, Meditation and Power Nap apps. New implementation shows progress bar as decrementing as the time passes instead of incrementing. Cleanups.
117 lines
3.9 KiB
C++
117 lines
3.9 KiB
C++
// 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 <cstdint>
|
|
|
|
#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<Command> &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<Command> &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
|
|
};
|
|
|
|
enum class ProgressChange
|
|
{
|
|
IncrementFromZero,
|
|
DecrementFromFull
|
|
};
|
|
|
|
ArcProgressBar(Item *parent,
|
|
const Arc::ShapeParams &shape,
|
|
ProgressDirection direction = ProgressDirection::Clockwise,
|
|
ProgressChange change = ProgressChange::IncrementFromZero);
|
|
|
|
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<Command> &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;
|
|
ProgressChange change = ProgressChange::IncrementFromZero;
|
|
};
|
|
} // namespace gui
|