Implemented auto increment / decrement in changevaluedisplay
This commit is contained in:
@ -3,6 +3,9 @@
|
|||||||
// system includes
|
// system includes
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
|
// 3rdparty lib includes
|
||||||
|
#include <espchrono.h>
|
||||||
|
|
||||||
// local includes
|
// local includes
|
||||||
#include "displaywithtitle.h"
|
#include "displaywithtitle.h"
|
||||||
#include "textinterface.h"
|
#include "textinterface.h"
|
||||||
@ -76,6 +79,15 @@ private:
|
|||||||
|
|
||||||
int m_rotateOffset;
|
int m_rotateOffset;
|
||||||
bool m_pressed{};
|
bool m_pressed{};
|
||||||
|
|
||||||
|
struct ButtonHeldInfo
|
||||||
|
{
|
||||||
|
espchrono::millis_clock::time_point nextTimestamp;
|
||||||
|
int counter{};
|
||||||
|
};
|
||||||
|
|
||||||
|
std::optional<ButtonHeldInfo> m_upHeld;
|
||||||
|
std::optional<ButtonHeldInfo> m_downHeld;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Tvalue>
|
template<typename Tvalue>
|
||||||
@ -87,6 +99,9 @@ void ChangeValueDisplay<Tvalue>::start()
|
|||||||
|
|
||||||
m_rotateOffset = 0;
|
m_rotateOffset = 0;
|
||||||
m_pressed = false;
|
m_pressed = false;
|
||||||
|
|
||||||
|
m_upHeld = std::nullopt;
|
||||||
|
m_downHeld = std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Tvalue>
|
template<typename Tvalue>
|
||||||
@ -94,14 +109,30 @@ void ChangeValueDisplay<Tvalue>::update()
|
|||||||
{
|
{
|
||||||
Base::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;
|
const auto rotateOffset = m_rotateOffset;
|
||||||
m_rotateOffset = 0;
|
m_rotateOffset = 0;
|
||||||
|
|
||||||
m_value -= rotateOffset * this->step();
|
m_value -= rotateOffset * this->step();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (m_pressed)
|
||||||
{
|
{
|
||||||
m_pressed = false;
|
m_pressed = false;
|
||||||
if (auto result = static_cast<AccessorInterface<Tvalue>*>(this)->setValue(m_value); result)
|
if (auto result = static_cast<AccessorInterface<Tvalue>*>(this)->setValue(m_value); result)
|
||||||
@ -133,8 +164,15 @@ void ChangeValueDisplay<Tvalue>::buttonPressed(Button button)
|
|||||||
{
|
{
|
||||||
case Button::Left: this->back(); break;
|
case Button::Left: this->back(); break;
|
||||||
case Button::Right: m_pressed = true; break;
|
case Button::Right: m_pressed = true; break;
|
||||||
case Button::Up: m_rotateOffset--; break;
|
using namespace std::chrono_literals;
|
||||||
case Button::Down: m_rotateOffset++; break;
|
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<Tvalue>::buttonReleased(Button button)
|
|||||||
{
|
{
|
||||||
//Base::buttonPressed(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
|
} // namespace espgui
|
||||||
|
@ -15,6 +15,9 @@ void MenuDisplay::start()
|
|||||||
|
|
||||||
m_rotateOffset = 0;
|
m_rotateOffset = 0;
|
||||||
m_pressed = false;
|
m_pressed = false;
|
||||||
|
|
||||||
|
m_upHeld = std::nullopt;
|
||||||
|
m_downHeld = std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuDisplay::initScreen()
|
void MenuDisplay::initScreen()
|
||||||
|
Reference in New Issue
Block a user