From c5933152e1b34e0c33e2db4a8b255f3306fe03fa Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Wed, 29 Dec 2021 22:53:58 +0100 Subject: [PATCH] Added ChangeValueDisplay for string --- CMakeLists.txt | 2 + src/changevaluedisplay.h | 4 +- src/changevaluedisplay_string.cpp | 63 +++++++++++++++++++++++++++++++ src/changevaluedisplay_string.h | 44 +++++++++++++++++++++ src/display.h | 8 +++- 5 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 src/changevaluedisplay_string.cpp create mode 100644 src/changevaluedisplay_string.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 44f2476..f957c74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ set(headers src/changevaluedisplay_bool.h src/changevaluedisplay_daylightsavingmode.h src/changevaluedisplay_sntp_sync_mode_t.h + src/changevaluedisplay_string.h src/changevaluedisplay_wifi_auth_mode_t.h src/changevaluedisplay_wifi_mode_t.h src/checkboxicon.h @@ -50,6 +51,7 @@ set(sources src/changevaluedisplay_bool.cpp src/changevaluedisplay_daylightsavingmode.cpp src/changevaluedisplay_sntp_sync_mode_t.cpp + src/changevaluedisplay_string.cpp src/changevaluedisplay_wifi_auth_mode_t.cpp src/changevaluedisplay_wifi_mode_t.cpp src/display.cpp diff --git a/src/changevaluedisplay.h b/src/changevaluedisplay.h index 133d144..f2b71d6 100644 --- a/src/changevaluedisplay.h +++ b/src/changevaluedisplay.h @@ -77,7 +77,7 @@ void ChangeValueDisplay::start() { Base::start(); - m_value = static_cast*>(this)->getValue(); + m_value = /*static_cast*>*/(this)->getValue(); m_rotateOffset = 0; m_pressed = false; @@ -93,7 +93,7 @@ void ChangeValueDisplay::update() const auto rotateOffset = m_rotateOffset; m_rotateOffset = 0; - m_value -= rotateOffset * static_cast*>(this)->step(); + m_value -= rotateOffset * /*static_cast*>*/(this)->step(); } else { diff --git a/src/changevaluedisplay_string.cpp b/src/changevaluedisplay_string.cpp new file mode 100644 index 0000000..d747f39 --- /dev/null +++ b/src/changevaluedisplay_string.cpp @@ -0,0 +1,63 @@ +#include "changevaluedisplay_string.h" + +// local includes +#include "tftinstance.h" + +void espgui::ChangeValueDisplay::start() +{ + Base::start(); + + m_value = /*static_cast*>*/(this)->getValue(); + + m_pressed = false; +} + +void espgui::ChangeValueDisplay::initScreen() +{ + Base::initScreen(); + + tft.drawRect(25, 75, 190, 65, TFT_WHITE); + m_valueLabel.start(); + + tft.setTextFont(4); + tft.setTextColor(TFT_WHITE); + tft.drawString("Change value and", 10, 160); + tft.drawString("press button to", 10, 185); + tft.drawString("confirm and go", 10, 210); + tft.drawString("back.", 10, 235); +} + +void espgui::ChangeValueDisplay::update() +{ + Base::update(); + + if (m_pressed) + { + m_pressed = false; + if (auto result = /*static_cast*>*/(this)->setValue(m_value); result) + confirm(); + else + errorOccured(std::move(result).error()); + } +} + +void espgui::ChangeValueDisplay::redraw() +{ + Base::redraw(); + + tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.setTextFont(4); + m_valueLabel.redraw(m_value); +} + +void espgui::ChangeValueDisplay::buttonPressed(Button button) +{ + //Base::buttonPressed(button); + + switch (button) + { + case Button::Left: this->back(); break; + case Button::Right: m_pressed = true; break; + default:; + } +} diff --git a/src/changevaluedisplay_string.h b/src/changevaluedisplay_string.h new file mode 100644 index 0000000..6cb1fee --- /dev/null +++ b/src/changevaluedisplay_string.h @@ -0,0 +1,44 @@ +#pragma once + +// local includes +#include "changevaluedisplay.h" +#include "displaywithtitle.h" +#include "confirminterface.h" +#include "backinterface.h" +#include "errorhandlerinterface.h" +#include "widgets/label.h" + +namespace espgui { + +template<> +class ChangeValueDisplay : + public DisplayWithTitle, + public virtual AccessorInterface, + public virtual ConfirmInterface, + public virtual BackInterface, + public virtual ErrorHandlerInterface +{ + using Base = DisplayWithTitle; + +public: + ChangeValueDisplay *asChangeValueDisplayString() override { return this; } + const ChangeValueDisplay *asChangeValueDisplayString() const override { return this; } + + void start() override; + void initScreen() override; + void update() override; + void redraw() override; + + void buttonPressed(Button button) override; + + const std::string &shownValue() const { return m_value; } + void setShownValue(std::string &&value) { m_value = std::move(value); } + +private: + std::string m_value; + bool m_pressed{}; + + Label m_valueLabel{26, 81}; // 188, 53 +}; + +} // namespace espgui diff --git a/src/display.h b/src/display.h index dd23f98..4827966 100644 --- a/src/display.h +++ b/src/display.h @@ -12,9 +12,11 @@ namespace espgui { class TextInterface; class MenuDisplay; class ChangeValueDisplayInterface; -} +template class ChangeValueDisplay; +} // namespace espgui namespace espgui { + template class makeComponent : public T... {}; @@ -58,5 +60,9 @@ public: virtual ChangeValueDisplayInterface *asChangeValueDisplayInterface() { return nullptr; } virtual const ChangeValueDisplayInterface *asChangeValueDisplayInterface() const { return nullptr; } + + virtual ChangeValueDisplay *asChangeValueDisplayString() { return nullptr; } + virtual const ChangeValueDisplay *asChangeValueDisplayString() const { return nullptr; } }; + } // namespace espgui