Compare commits
4 Commits
main
...
old_versio
Author | SHA1 | Date | |
---|---|---|---|
f40dab0c60 | |||
56b6f20651 | |||
aaea3a9e33 | |||
b8a29bb12b |
@ -1,5 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
// system includes
|
||||
#include <string>
|
||||
|
||||
// 3rdparty lib includes
|
||||
#include <tl/expected.hpp>
|
||||
|
||||
|
@ -3,6 +3,9 @@
|
||||
// system includes
|
||||
#include <type_traits>
|
||||
|
||||
// 3rdparty lib includes
|
||||
#include <espchrono.h>
|
||||
|
||||
// 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<ButtonHeldInfo> m_upHeld;
|
||||
std::optional<ButtonHeldInfo> m_downHeld;
|
||||
};
|
||||
|
||||
template<typename Tvalue>
|
||||
@ -87,6 +99,9 @@ void ChangeValueDisplay<Tvalue>::start()
|
||||
|
||||
m_rotateOffset = 0;
|
||||
m_pressed = false;
|
||||
|
||||
m_upHeld = std::nullopt;
|
||||
m_downHeld = std::nullopt;
|
||||
}
|
||||
|
||||
template<typename Tvalue>
|
||||
@ -94,14 +109,30 @@ void ChangeValueDisplay<Tvalue>::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<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::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<Tvalue>::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
|
||||
|
@ -3,6 +3,8 @@
|
||||
// local includes
|
||||
#include "tftinstance.h"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
namespace espgui {
|
||||
void MenuDisplay::start()
|
||||
{
|
||||
@ -13,6 +15,9 @@ void MenuDisplay::start()
|
||||
|
||||
m_rotateOffset = 0;
|
||||
m_pressed = false;
|
||||
|
||||
m_upHeld = std::nullopt;
|
||||
m_downHeld = std::nullopt;
|
||||
}
|
||||
|
||||
void MenuDisplay::initScreen()
|
||||
@ -35,7 +40,20 @@ void MenuDisplay::update()
|
||||
{
|
||||
Base::update();
|
||||
|
||||
if (!m_pressed)
|
||||
const auto now = espchrono::millis_clock::now();
|
||||
if (m_upHeld && now >= m_upHeld->nextTimestamp)
|
||||
{
|
||||
m_upHeld->nextTimestamp += m_upHeld->counter > 3 ? 100ms : 200ms;
|
||||
m_upHeld->counter++;
|
||||
m_rotateOffset--;
|
||||
}
|
||||
if (m_downHeld && now >= m_downHeld->nextTimestamp)
|
||||
{
|
||||
m_downHeld->nextTimestamp += m_downHeld->counter > 3 ? 100ms : 200ms;
|
||||
m_downHeld->counter++;
|
||||
m_rotateOffset++;
|
||||
}
|
||||
|
||||
{
|
||||
const auto offset = m_rotateOffset;
|
||||
m_rotateOffset = 0;
|
||||
@ -81,7 +99,8 @@ void MenuDisplay::update()
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if (m_pressed)
|
||||
{
|
||||
m_pressed = false;
|
||||
if (m_selectedIndex >= 0)
|
||||
@ -198,14 +217,30 @@ void MenuDisplay::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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
void MenuDisplay::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
|
||||
|
@ -9,6 +9,9 @@
|
||||
#include <cassert>
|
||||
#include <memory>
|
||||
|
||||
// 3rdparty lib includes
|
||||
#include <espchrono.h>
|
||||
|
||||
// local includes
|
||||
#include "displaywithtitle.h"
|
||||
#include "textinterface.h"
|
||||
@ -146,5 +149,14 @@ private:
|
||||
bool m_pressed;
|
||||
|
||||
std::vector<std::unique_ptr<MenuItem>> m_menuItems;
|
||||
|
||||
struct ButtonHeldInfo
|
||||
{
|
||||
espchrono::millis_clock::time_point nextTimestamp;
|
||||
int counter{};
|
||||
};
|
||||
|
||||
std::optional<ButtonHeldInfo> m_upHeld;
|
||||
std::optional<ButtonHeldInfo> m_downHeld;
|
||||
};
|
||||
} // namespace espgui
|
||||
|
Reference in New Issue
Block a user