cs-midi/Selectors/IncrementDecrementSelector.hpp

82 lines
2.5 KiB
C++

#pragma once
#include "Selector.hpp"
#include <AH/Hardware/IncrementDecrementButtons.hpp>
BEGIN_CS_NAMESPACE
template <setting_t N, class Callback = EmptySelectorCallback>
class GenericIncrementDecrementSelector : public GenericSelector<N, Callback> {
using Parent = GenericSelector<N, Callback>;
public:
GenericIncrementDecrementSelector(
Selectable<N> &selectable, const Callback &callback,
const AH::IncrementDecrementButtons &buttons, Wrap wrap = Wrap::Wrap)
: GenericSelector<N, Callback> {selectable, callback}, buttons(buttons),
wrap(wrap) {}
void begin() override {
Parent::begin();
buttons.begin();
}
void update() override {
Parent::update();
using IncrDecrButtons = AH::IncrementDecrementButtons;
switch (buttons.update()) {
case IncrDecrButtons::Nothing: break;
case IncrDecrButtons::IncrementShort: // fallthrough
case IncrDecrButtons::IncrementLong: // fallthrough
case IncrDecrButtons::IncrementHold: this->increment(wrap); break;
case IncrDecrButtons::DecrementShort: // fallthrough
case IncrDecrButtons::DecrementLong: // fallthrough
case IncrDecrButtons::DecrementHold: this->decrement(wrap); break;
case IncrDecrButtons::Reset: this->reset(); break;
default: break;
}
}
/// @see @ref AH::Button::invert()
void invert() { buttons.invert(); }
AH::IncrementDecrementButtons::State getButtonsState() const {
return buttons.getState();
}
private:
AH::IncrementDecrementButtons buttons;
Wrap wrap;
};
// -------------------------------------------------------------------------- //
/**
* @brief Selector with two buttons (one to increment, one to decrement).
*
* Pressing two buttons simultaneously resets to the default setting.
*
* @htmlonly
* <object type="image/svg+xml" data="../../selector-increment-decrement-LED.svg"></object>
* @endhtmlonly
*
* @ingroup Selectors
*
* @tparam N
* The number of settings.
*/
template <setting_t N>
class IncrementDecrementSelector : public GenericIncrementDecrementSelector<N> {
public:
IncrementDecrementSelector(Selectable<N> &selectable,
const AH::IncrementDecrementButtons &buttons,
Wrap wrap = Wrap::Wrap)
: GenericIncrementDecrementSelector<N> {
selectable,
{},
buttons,
wrap,
} {}
};
END_CS_NAMESPACE