4 Commits

4 changed files with 107 additions and 10 deletions

View File

@ -1,5 +1,8 @@
#pragma once
// system includes
#include <string>
// 3rdparty lib includes
#include <tl/expected.hpp>

View File

@ -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

View File

@ -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

View File

@ -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