// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "Spinner.hpp"
#include <InputEvent.hpp>
#include <sstream>
#include <iomanip>
namespace gui
{
Spinner::Spinner(int minValue, int maxValue, int step, Boundaries boundaries)
: minValue(minValue), maxValue(maxValue), step(step), currentValue(minValue), boundaries(boundaries)
{
setEditMode(EditMode::Browse);
updateSpinner();
}
void Spinner::setCurrentValue(int newCurrentValue)
{
if (currentValue != newCurrentValue) {
currentValue = newCurrentValue;
updateSpinner();
}
}
void Spinner::setFixedFieldWidth(unsigned char newFixedFieldWidth)
{
fixedFieldWidth = newFixedFieldWidth;
}
int Spinner::getCurrentValue() const noexcept
{
return currentValue;
}
unsigned char Spinner::getFixedFieldWidth() const noexcept
{
return fixedFieldWidth;
}
void Spinner::stepUp()
{
currentValue += step;
if (currentValue > maxValue) {
if (boundaries == Boundaries::Continuous) {
currentValue = minValue;
}
else {
currentValue = maxValue;
}
}
updateSpinner();
}
void Spinner::stepDown()
{
currentValue -= step;
if (currentValue < minValue) {
if (boundaries == Boundaries::Continuous) {
currentValue = maxValue;
}
else {
currentValue = minValue;
}
}
updateSpinner();
}
bool Spinner::onInput(const InputEvent &inputEvent)
{
if (inputEvent.isShortRelease()) {
switch (inputEvent.getKeyCode()) {
case KeyCode::KEY_UP:
stepUp();
return true;
case KeyCode::KEY_DOWN:
stepDown();
return true;
default:
break;
}
}
return false;
}
bool Spinner::onFocus(bool state)
{
if (focus) {
setEdges(RectangleEdge::Top | RectangleEdge::Bottom);
}
else {
setEdges(RectangleEdge::None);
}
showCursor(state);
return true;
}
void Spinner::updateSpinner()
{
std::stringstream outStream;
if (fixedFieldWidth > 0) {
outStream << std::setw(fixedFieldWidth) << std::setfill('0');
}
outStream << currentValue;
setText(outStream.str());
}
} // namespace gui