From fceb78eecece3d4159f0bbc602b460b2b3f10933 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Fri, 22 Sep 2023 11:48:43 -0400 Subject: [PATCH] W_BUTTON: Add clickHeld event --- lib/widget/button.cpp | 35 +++++++++++++++++++++++++++++++++++ lib/widget/button.h | 4 ++++ 2 files changed, 39 insertions(+) diff --git a/lib/widget/button.cpp b/lib/widget/button.cpp index e770957fb2e..ecf5fc6bc44 100644 --- a/lib/widget/button.cpp +++ b/lib/widget/button.cpp @@ -112,6 +112,32 @@ void W_BUTTON::setHelp(optional _help) help = _help; } +void W_BUTTON::run(W_CONTEXT *psContext) +{ + if (clickDownStart.has_value()) + { + const std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); + if (std::chrono::duration_cast(now - clickDownStart.value()) >= widgGetClickHoldMS()) + { + if (clickDownKey.has_value()) + { + if (clickHeld(psContext, clickDownKey.value())) + { + // clear button down state, as the clickHeld event "consumed" this click + state &= ~WBUT_DOWN; + } + } + clickDownStart.reset(); + } + } +} + +// Returns true if "consumed" held click +bool W_BUTTON::clickHeld(W_CONTEXT *psContext, WIDGET_KEY key) +{ + return false; +} + void W_BUTTON::clicked(W_CONTEXT *, WIDGET_KEY key) { if ((minClickInterval > 0) && (realTime - lastClickTime < minClickInterval)) @@ -135,6 +161,9 @@ void W_BUTTON::clicked(W_CONTEXT *, WIDGET_KEY key) } state &= ~WBUT_FLASH; // Stop it flashing state |= WBUT_DOWN; + + clickDownStart = std::chrono::steady_clock::now(); + clickDownKey = key; } } } @@ -170,6 +199,9 @@ void W_BUTTON::released(W_CONTEXT *, WIDGET_KEY key) dirty = true; } } + + clickDownStart = nullopt; + clickDownKey = nullopt; } WIDGET_KEY W_BUTTON::getOnClickButtonPressed() const @@ -202,6 +234,9 @@ void W_BUTTON::highlightLost() { state &= ~(WBUT_DOWN | WBUT_HIGHLIGHT); dirty = true; + + clickDownStart = nullopt; + clickDownKey = nullopt; } void W_BUTTON::display(int xOffset, int yOffset) diff --git a/lib/widget/button.h b/lib/widget/button.h index 214792e6f5f..2628ea11657 100644 --- a/lib/widget/button.h +++ b/lib/widget/button.h @@ -53,9 +53,11 @@ class W_BUTTON : public WIDGET W_BUTTON(); void clicked(W_CONTEXT *psContext, WIDGET_KEY key) override; + virtual bool clickHeld(W_CONTEXT *psContext, WIDGET_KEY key); void released(W_CONTEXT *psContext, WIDGET_KEY key) override; void highlight(W_CONTEXT *psContext) override; void highlightLost() override; + void run(W_CONTEXT *psContext) override; void display(int xOffset, int yOffset) override; void displayRecursive(WidgetGraphicsContext const &context) override; // for handling progress border overlay @@ -160,6 +162,8 @@ class W_BUTTON : public WIDGET PIELIGHT progressBorderColour; WIDGET_KEY lastClickButton = WKEY_NONE; optional help; + optional clickDownStart; // the start time of click down on this button + optional clickDownKey; }; class MultipleChoiceButton : public W_BUTTON