Line data Source code
1 : #pragma once 2 : 3 : #include "Selector.hpp" 4 : #include <AH/Hardware/IncrementDecrementButtons.hpp> 5 : 6 : BEGIN_CS_NAMESPACE 7 : 8 : template <setting_t N, class Callback = EmptySelectorCallback> 9 : class GenericIncrementDecrementSelector : public GenericSelector<N, Callback> { 10 : using Parent = GenericSelector<N, Callback>; 11 : 12 : public: 13 7 : GenericIncrementDecrementSelector( 14 : Selectable<N> &selectable, const Callback &callback, 15 : const AH::IncrementDecrementButtons &buttons, Wrap wrap = Wrap::Wrap) 16 7 : : GenericSelector<N, Callback> {selectable, callback}, buttons(buttons), 17 14 : wrap(wrap) {} 18 : 19 5 : void begin() override { 20 5 : Parent::begin(); 21 5 : buttons.begin(); 22 5 : } 23 : 24 19 : void update() override { 25 19 : Parent::update(); 26 : using IncrDecrButtons = AH::IncrementDecrementButtons; 27 19 : switch (buttons.update()) { 28 8 : case IncrDecrButtons::Nothing: break; 29 5 : case IncrDecrButtons::IncrementShort: // fallthrough 30 : case IncrDecrButtons::IncrementLong: // fallthrough 31 5 : case IncrDecrButtons::IncrementHold: this->increment(wrap); break; 32 5 : case IncrDecrButtons::DecrementShort: // fallthrough 33 : case IncrDecrButtons::DecrementLong: // fallthrough 34 5 : case IncrDecrButtons::DecrementHold: this->decrement(wrap); break; 35 1 : case IncrDecrButtons::Reset: this->reset(); break; 36 0 : default: break; 37 : } 38 19 : } 39 : 40 : /// @see @ref AH::Button::invert() 41 : void invert() { buttons.invert(); } 42 : 43 : AH::IncrementDecrementButtons::State getButtonsState() const { 44 : return buttons.getState(); 45 : } 46 : 47 : private: 48 : AH::IncrementDecrementButtons buttons; 49 : Wrap wrap; 50 : }; 51 : 52 : // -------------------------------------------------------------------------- // 53 : 54 : /** 55 : * @brief Selector with two buttons (one to increment, one to decrement). 56 : * 57 : * Pressing two buttons simultaneously resets to the default setting. 58 : * 59 : * @htmlonly 60 : * <object type="image/svg+xml" data="../../selector-increment-decrement-LED.svg"></object> 61 : * @endhtmlonly 62 : * 63 : * @ingroup Selectors 64 : * 65 : * @tparam N 66 : * The number of settings. 67 : */ 68 : template <setting_t N> 69 : class IncrementDecrementSelector : public GenericIncrementDecrementSelector<N> { 70 : public: 71 6 : IncrementDecrementSelector(Selectable<N> &selectable, 72 : const AH::IncrementDecrementButtons &buttons, 73 : Wrap wrap = Wrap::Wrap) 74 : : GenericIncrementDecrementSelector<N> { 75 : selectable, 76 : {}, 77 : buttons, 78 : wrap, 79 6 : } {} 80 : }; 81 : 82 : END_CS_NAMESPACE