diff --git a/src/changevaluedisplay.h b/src/changevaluedisplay.h index 0480ce8..35bb84d 100644 --- a/src/changevaluedisplay.h +++ b/src/changevaluedisplay.h @@ -3,6 +3,9 @@ // system includes #include +// 3rdparty lib includes +#include + // local includes #include "displaywithtitle.h" #include "textinterface.h" @@ -76,6 +79,15 @@ private: int m_rotateOffset; bool m_pressed{}; + + struct ButtonHeldInfo + { + espchrono::millis_clock::time_point nextTimestamp; + int counter{}; + }; + + std::optional m_upHeld; + std::optional m_downHeld; }; template @@ -87,6 +99,9 @@ void ChangeValueDisplay::start() m_rotateOffset = 0; m_pressed = false; + + m_upHeld = std::nullopt; + m_downHeld = std::nullopt; } template @@ -94,14 +109,30 @@ void ChangeValueDisplay::update() { Base::update(); - if (!m_pressed) + const auto now = espchrono::millis_clock::now(); + if (m_upHeld && now >= m_upHeld->nextTimestamp) + { + using namespace std::chrono_literals; + m_upHeld->nextTimestamp += m_upHeld->counter > 10 ? 50ms : (m_upHeld->counter > 3 ? 100ms : 200ms); + m_upHeld->counter++; + m_rotateOffset--; + } + if (m_downHeld && now >= m_downHeld->nextTimestamp) + { + using namespace std::chrono_literals; + m_downHeld->nextTimestamp += m_downHeld->counter > 10 ? 50ms : (m_downHeld->counter > 3 ? 100ms : 200ms); + m_downHeld->counter++; + m_rotateOffset++; + } + { const auto rotateOffset = m_rotateOffset; m_rotateOffset = 0; m_value -= rotateOffset * this->step(); } - else + + if (m_pressed) { m_pressed = false; if (auto result = static_cast*>(this)->setValue(m_value); result) @@ -133,8 +164,15 @@ void ChangeValueDisplay::buttonPressed(Button button) { case Button::Left: this->back(); break; case Button::Right: m_pressed = true; break; - case Button::Up: m_rotateOffset--; break; - case Button::Down: m_rotateOffset++; break; + using namespace std::chrono_literals; + case Button::Up: + m_rotateOffset--; + m_upHeld = ButtonHeldInfo { .nextTimestamp = espchrono::millis_clock::now() + 300ms }; + break; + case Button::Down: + m_rotateOffset++; + m_downHeld = ButtonHeldInfo { .nextTimestamp = espchrono::millis_clock::now() + 300ms }; + break; } } @@ -143,7 +181,16 @@ void ChangeValueDisplay::buttonReleased(Button button) { //Base::buttonPressed(button); - // TODO stop auto scroll + switch (button) + { + case Button::Up: + m_upHeld = std::nullopt; + break; + case Button::Down: + m_downHeld = std::nullopt; + break; + default:; + } } } // namespace espgui diff --git a/src/menudisplay.cpp b/src/menudisplay.cpp index 93f407a..4b4e7a9 100644 --- a/src/menudisplay.cpp +++ b/src/menudisplay.cpp @@ -15,6 +15,9 @@ void MenuDisplay::start() m_rotateOffset = 0; m_pressed = false; + + m_upHeld = std::nullopt; + m_downHeld = std::nullopt; } void MenuDisplay::initScreen()