#pragma once #include "Selector.hpp" #include BEGIN_CS_NAMESPACE template class GenericIncrementDecrementSelector : public GenericSelector { using Parent = GenericSelector; public: GenericIncrementDecrementSelector( Selectable &selectable, const Callback &callback, const AH::IncrementDecrementButtons &buttons, Wrap wrap = Wrap::Wrap) : GenericSelector {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 * * @endhtmlonly * * @ingroup Selectors * * @tparam N * The number of settings. */ template class IncrementDecrementSelector : public GenericIncrementDecrementSelector { public: IncrementDecrementSelector(Selectable &selectable, const AH::IncrementDecrementButtons &buttons, Wrap wrap = Wrap::Wrap) : GenericIncrementDecrementSelector { selectable, {}, buttons, wrap, } {} }; END_CS_NAMESPACE