From 139a8a47112582b5b1a4ce1a08303dbfea196b86 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Thu, 9 Jun 2022 13:53:49 +0200 Subject: [PATCH 1/3] Holding up/down in menudisplay repeatadly rotates --- src/menudisplay.cpp | 26 +++++++++++++++++++++++--- src/menudisplay.h | 5 +++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/menudisplay.cpp b/src/menudisplay.cpp index bfdcb68..c706ce3 100644 --- a/src/menudisplay.cpp +++ b/src/menudisplay.cpp @@ -3,6 +3,8 @@ // local includes #include "tftinstance.h" +using namespace std::chrono_literals; + namespace espgui { void MenuDisplay::start() { @@ -93,6 +95,18 @@ void MenuDisplay::redraw() { Base::redraw(); + if (m_upHoldingSince && espchrono::ago(*m_upHoldingSince) > 500ms) + { + m_upHoldingSince = espchrono::millis_clock::now(); + m_rotateOffset--; + } + + if (m_downHoldingSince && espchrono::ago(*m_downHoldingSince) > 500ms) + { + m_downHoldingSince = espchrono::millis_clock::now(); + m_rotateOffset++; + } + tft.setTextFont(4); tft.setTextColor(TFT_YELLOW, TFT_BLACK); @@ -197,14 +211,20 @@ 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_upHoldingSince = espchrono::millis_clock::now(); break; + case Button::Down: m_rotateOffset++; m_downHoldingSince = espchrono::millis_clock::now(); break; } } void MenuDisplay::buttonReleased(Button button) { //Base::buttonPressed(button); - // TODO stop auto scroll + + switch (button) + { + case Button::Up: m_upHoldingSince = std::nullopt; break; + case Button::Down: m_downHoldingSince = std::nullopt; break; + default:; + } } } // namespace espgui diff --git a/src/menudisplay.h b/src/menudisplay.h index 102841a..deeb7b4 100644 --- a/src/menudisplay.h +++ b/src/menudisplay.h @@ -8,6 +8,8 @@ #include #include #include +#include +#include // local includes #include "displaywithtitle.h" @@ -146,5 +148,8 @@ private: bool m_pressed; std::vector> m_menuItems; + + std::optional m_upHoldingSince; + std::optional m_downHoldingSince; }; } // namespace espgui -- 2.50.1 From a7d5148c8b3213a0276833c4f2ada9e6423653ac Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Thu, 9 Jun 2022 15:02:58 +0200 Subject: [PATCH 2/3] Implemented scrolling --- CMakeLists.txt | 1 + src/menudisplay.cpp | 31 +++++++++++++++------- src/menudisplay.h | 16 ++++++++++- src/selectorscrollinterface.h | 50 +++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 src/selectorscrollinterface.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 96fac73..e04ed1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ set(headers src/richtextrenderer.h src/screenmanager.h src/scrollinterface.h + src/selectorscrollinterface.h src/splitgraphdisplay.h src/textinterface.h src/textwithvaluehelper.h diff --git a/src/menudisplay.cpp b/src/menudisplay.cpp index c706ce3..62f458a 100644 --- a/src/menudisplay.cpp +++ b/src/menudisplay.cpp @@ -95,16 +95,25 @@ void MenuDisplay::redraw() { Base::redraw(); - if (m_upHoldingSince && espchrono::ago(*m_upHoldingSince) > 500ms) + // wait for holding since to be above initial scroll speed, then start scrolling in interval set by getScrollSpeed() + if (m_upHoldingSince && (espchrono::ago(*m_upHoldingSince) > getInitialScrollSpeed() || m_upScrolling)) { - m_upHoldingSince = espchrono::millis_clock::now(); - m_rotateOffset--; + if (espchrono::ago(*m_upHoldingSince) > getScrollSpeed()) + { + m_upScrolling = true; + m_rotateOffset--; + m_upHoldingSince = espchrono::millis_clock::now(); + } } - if (m_downHoldingSince && espchrono::ago(*m_downHoldingSince) > 500ms) + if (m_downHoldingSince && (espchrono::ago(*m_downHoldingSince) > getInitialScrollSpeed() || m_downScrolling)) { - m_downHoldingSince = espchrono::millis_clock::now(); - m_rotateOffset++; + if (espchrono::ago(*m_downHoldingSince) > getScrollSpeed()) + { + m_downScrolling = true; + m_rotateOffset++; + m_downHoldingSince = espchrono::millis_clock::now(); + } } tft.setTextFont(4); @@ -209,10 +218,10 @@ void MenuDisplay::buttonPressed(Button button) switch (button) { - case Button::Left: this->back(); break; - case Button::Right: m_pressed = true; break; - case Button::Up: m_rotateOffset--; m_upHoldingSince = espchrono::millis_clock::now(); break; - case Button::Down: m_rotateOffset++; m_downHoldingSince = espchrono::millis_clock::now(); break; + case Button::Left: this->back(); m_leftHoldingSince = espchrono::millis_clock::now(); m_leftScrolling = false; break; + case Button::Right: m_pressed = true; m_rightHoldingSince = espchrono::millis_clock::now(); m_rightScrolling = false; break; + case Button::Up: m_rotateOffset--; m_upHoldingSince = espchrono::millis_clock::now(); m_upScrolling = false; break; + case Button::Down: m_rotateOffset++; m_downHoldingSince = espchrono::millis_clock::now(); m_downScrolling = false; break; } } @@ -224,6 +233,8 @@ void MenuDisplay::buttonReleased(Button button) { case Button::Up: m_upHoldingSince = std::nullopt; break; case Button::Down: m_downHoldingSince = std::nullopt; break; + case Button::Left: m_leftHoldingSince = std::nullopt; break; + case Button::Right: m_rightHoldingSince = std::nullopt; break; default:; } } diff --git a/src/menudisplay.h b/src/menudisplay.h index deeb7b4..dcf42a7 100644 --- a/src/menudisplay.h +++ b/src/menudisplay.h @@ -9,19 +9,24 @@ #include #include #include + +// 3rdparty lib includes #include // local includes #include "displaywithtitle.h" +#include "selectorscrollinterface.h" #include "textinterface.h" #include "widgets/label.h" #include "menuitem.h" #include "backinterface.h" namespace espgui { + using namespace std::chrono_literals; class MenuDisplay : public DisplayWithTitle, - public virtual BackInterface + public virtual BackInterface, + public virtual SelectorScrollInterface<> { using Base = DisplayWithTitle; @@ -149,7 +154,16 @@ private: std::vector> m_menuItems; + bool m_upScrolling; std::optional m_upHoldingSince; + + bool m_downScrolling{}; std::optional m_downHoldingSince; + + bool m_leftScrolling{}; + std::optional m_leftHoldingSince; + + bool m_rightScrolling{}; + std::optional m_rightHoldingSince; }; } // namespace espgui diff --git a/src/selectorscrollinterface.h b/src/selectorscrollinterface.h new file mode 100644 index 0000000..91e9908 --- /dev/null +++ b/src/selectorscrollinterface.h @@ -0,0 +1,50 @@ +#pragma once + +// 3rdparty lib includes +#include + +namespace espgui { +namespace { +template +struct is_allowed +{ + static constexpr bool value = false; +}; + +template <> +struct is_allowed +{ + static constexpr bool value = true; +}; +template <> +struct is_allowed +{ + static constexpr bool value = true; +}; +template <> +struct is_allowed +{ + static constexpr bool value = true; +}; +template <> +struct is_allowed +{ + static constexpr bool value = true; +}; +} // namespace + +template +class SelectorScrollInterface { + static_assert(is_allowed::value, "Type not supported"); +public: + TimeType getInitialScrollSpeed() const { return initialScrollDelay; } + TimeType getScrollSpeed() const { return scrollDelay; } + + void setInitialScrollSpeed(TimeType speed) { initialScrollDelay = speed; } + void setScrollSpeed(TimeType speed) { scrollDelay = speed; } + +private: + TimeType initialScrollDelay{initialDelay}; + TimeType scrollDelay{delay}; +}; +} // namespace espgui -- 2.50.1 From 09add5cdeee839e0c4c127d55c99d51a55a543d5 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Thu, 9 Jun 2022 15:51:44 +0200 Subject: [PATCH 3/3] Implemented buttonHeld; still needs some work --- src/buttonsinterface.h | 1 + src/menudisplay.cpp | 118 +++++++++++++++++++++++++++++++++-------- src/menudisplay.h | 7 +-- 3 files changed, 102 insertions(+), 24 deletions(-) diff --git a/src/buttonsinterface.h b/src/buttonsinterface.h index 143bb5f..4b455ba 100644 --- a/src/buttonsinterface.h +++ b/src/buttonsinterface.h @@ -22,6 +22,7 @@ public: virtual void buttonPressed(Button button) = 0; virtual void buttonReleased(Button button) = 0; + virtual void buttonHeld(Button button) {}; }; } // namespace espgui diff --git a/src/menudisplay.cpp b/src/menudisplay.cpp index 62f458a..6e50e1d 100644 --- a/src/menudisplay.cpp +++ b/src/menudisplay.cpp @@ -3,6 +3,8 @@ // local includes #include "tftinstance.h" +#include "esp_log.h" + using namespace std::chrono_literals; namespace espgui { @@ -15,6 +17,18 @@ void MenuDisplay::start() m_rotateOffset = 0; m_pressed = false; + + m_upScrolling = false; + m_upHoldingSince = std::nullopt; + + m_downScrolling = false; + m_downHoldingSince = std::nullopt; + + m_leftScrolling = false; + m_leftHoldingSince = std::nullopt; + + m_rightScrolling = false; + m_rightHoldingSince = std::nullopt; } void MenuDisplay::initScreen() @@ -37,6 +51,84 @@ void MenuDisplay::update() { Base::update(); + { + const auto ago = espchrono::ago(*m_upHoldingSince); + if (m_upHoldingSince && (m_upScrolling || ago > getInitialScrollSpeed())) + { + if (ago > getScrollSpeed()) + { + if (!m_upScrolling) + { + // gets executed one time + buttonHeld(espgui::Up); + } + m_upScrolling = true; + m_upHoldingSince = espchrono::millis_clock::now(); + + // do sth + m_rotateOffset--; + } + } + } + + { + const auto ago = espchrono::ago(*m_downHoldingSince); + if (m_downHoldingSince && (m_downScrolling || ago > getInitialScrollSpeed())) + { + if (ago > getScrollSpeed()) + { + if (!m_downScrolling) + { + // gets executed one time + buttonHeld(espgui::Down); + } + m_downScrolling = true; + m_downHoldingSince = espchrono::millis_clock::now(); + + // do sth + m_rotateOffset++; + } + } + } + + { + const auto ago = espchrono::ago(*m_leftHoldingSince); + if (m_leftHoldingSince && (m_leftScrolling || ago > getInitialScrollSpeed())) + { + if (ago > getScrollSpeed()) + { + if (!m_leftScrolling) + { + // gets executed one time + buttonHeld(espgui::Left); + } + m_leftScrolling = true; + m_leftHoldingSince = espchrono::millis_clock::now(); + + // do sth + } + } + } + + { + const auto ago = espchrono::ago(*m_rightHoldingSince); + if (m_rightHoldingSince && (m_rightScrolling || ago > getInitialScrollSpeed())) + { + if (ago > getScrollSpeed()) + { + if (!m_rightScrolling) + { + // gets executed one time + buttonHeld(espgui::Right); + } + m_rightScrolling = true; + m_rightHoldingSince = espchrono::millis_clock::now(); + + // do sth + } + } + } + if (!m_pressed) { const auto offset = m_rotateOffset; @@ -95,27 +187,6 @@ void MenuDisplay::redraw() { Base::redraw(); - // wait for holding since to be above initial scroll speed, then start scrolling in interval set by getScrollSpeed() - if (m_upHoldingSince && (espchrono::ago(*m_upHoldingSince) > getInitialScrollSpeed() || m_upScrolling)) - { - if (espchrono::ago(*m_upHoldingSince) > getScrollSpeed()) - { - m_upScrolling = true; - m_rotateOffset--; - m_upHoldingSince = espchrono::millis_clock::now(); - } - } - - if (m_downHoldingSince && (espchrono::ago(*m_downHoldingSince) > getInitialScrollSpeed() || m_downScrolling)) - { - if (espchrono::ago(*m_downHoldingSince) > getScrollSpeed()) - { - m_downScrolling = true; - m_rotateOffset++; - m_downHoldingSince = espchrono::millis_clock::now(); - } - } - tft.setTextFont(4); tft.setTextColor(TFT_YELLOW, TFT_BLACK); @@ -238,4 +309,9 @@ void MenuDisplay::buttonReleased(Button button) default:; } } + +void MenuDisplay::buttonHeld(Button button) +{ + ESP_LOGI("Menudisplay", "buttonHeld %d", button); +} } // namespace espgui diff --git a/src/menudisplay.h b/src/menudisplay.h index dcf42a7..e8d2295 100644 --- a/src/menudisplay.h +++ b/src/menudisplay.h @@ -39,6 +39,7 @@ public: void buttonPressed(Button button) override; void buttonReleased(Button button) override; + void buttonHeld(Button button) override; MenuDisplay *asMenuDisplay() override { return this; } const MenuDisplay *asMenuDisplay() const override { return this; } @@ -157,13 +158,13 @@ private: bool m_upScrolling; std::optional m_upHoldingSince; - bool m_downScrolling{}; + bool m_downScrolling; std::optional m_downHoldingSince; - bool m_leftScrolling{}; + bool m_leftScrolling; std::optional m_leftHoldingSince; - bool m_rightScrolling{}; + bool m_rightScrolling; std::optional m_rightHoldingSince; }; } // namespace espgui -- 2.50.1