Files
MuditaOS/module-apps/apps-common/widgets/ProgressTimerWithBarGraphAndCounter.cpp
Lefucjusz cc0fceaedf [BH-1826] Implement new countdown progress bar design
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.
2023-12-12 13:57:44 +01:00

82 lines
2.5 KiB
C++

// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "ProgressTimerWithBarGraphAndCounter.hpp"
#include <Text.hpp>
#include <ProgressBar.hpp>
#include <ApplicationCommon.hpp>
#include <apps-common/GuiTimer.hpp>
#include <gsl/assert>
namespace
{
constexpr auto increasingModePrefix = "-";
}
namespace app
{
void ProgressTimerWithBarGraphAndCounter::update()
{
updateText();
updateProgress();
updateTimeWidget();
ProgressTimer::update();
}
void ProgressTimerWithBarGraphAndCounter::updateText()
{
using utils::time::Duration;
if (text == nullptr) {
return;
}
const auto secondsRemaining = std::chrono::duration_cast<std::chrono::seconds>(duration - elapsed);
const Duration remainingDuration{secondsRemaining};
UTF8 timerText;
if ((countdownMode == ProgressCountdownMode::Increasing) &&
(secondsRemaining != std::chrono::seconds::zero())) {
timerText += increasingModePrefix;
}
timerText += remainingDuration.str(displayFormat);
text->setText(std::move(timerText));
}
void ProgressTimerWithBarGraphAndCounter::updateTimeWidget()
{
if (timeWidget == nullptr) {
return;
}
const auto secondsRemaining = std::chrono::duration_cast<std::chrono::seconds>(duration - elapsed);
timeWidget->setMinutesBox(secondsRemaining.count() / 60);
timeWidget->setSecondsBox(secondsRemaining.count() % 60);
}
void ProgressTimerWithBarGraphAndCounter::updateProgress()
{
if (progress != nullptr) {
const auto percentage =
static_cast<float>(std::chrono::duration_cast<std::chrono::seconds>(elapsed).count()) /
duration.count();
const auto currentStep = percentage * progress->getMaximum();
progress->setValue(std::ceil(currentStep));
}
}
void ProgressTimerWithBarGraphAndCounter::attach(gui::Progress *_progress)
{
Expects(_progress != nullptr);
progress = _progress;
}
void ProgressTimerWithBarGraphAndCounter::attach(gui::Text *_text)
{
Expects(_text != nullptr);
text = _text;
}
void ProgressTimerWithBarGraphAndCounter::attach(gui::TimeFixedWidget *_timeWidget)
{
Expects(_timeWidget != nullptr);
timeWidget = _timeWidget;
}
} // namespace app