From 2ba1ac10dc7309e1d6a10b46c99ac967d7889234 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 26 Aug 2022 05:44:38 +0100 Subject: [PATCH] Introduce knobDoubleClicked for KnobEventHandler Signed-off-by: falkTX --- dgl/EventHandlers.hpp | 1 + dgl/Widget.hpp | 2 +- dgl/src/EventHandlers.cpp | 22 +++++++++++++++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/dgl/EventHandlers.hpp b/dgl/EventHandlers.hpp index c40c4425..c33866de 100644 --- a/dgl/EventHandlers.hpp +++ b/dgl/EventHandlers.hpp @@ -113,6 +113,7 @@ public: virtual void knobDragStarted(SubWidget* widget) = 0; virtual void knobDragFinished(SubWidget* widget) = 0; virtual void knobValueChanged(SubWidget* widget, float value) = 0; + virtual void knobDoubleClicked(SubWidget*) {}; }; explicit KnobEventHandler(SubWidget* self); diff --git a/dgl/Widget.hpp b/dgl/Widget.hpp index 7a245c67..ab20d776 100644 --- a/dgl/Widget.hpp +++ b/dgl/Widget.hpp @@ -64,7 +64,7 @@ public: uint mod; /** Event flags. @see EventFlag */ uint flags; - /** Event timestamp (if any). */ + /** Event timestamp in milliseconds (if any). */ uint time; /** Constructor for default/null values */ diff --git a/dgl/src/EventHandlers.cpp b/dgl/src/EventHandlers.cpp index 3d72d4aa..49efee6b 100644 --- a/dgl/src/EventHandlers.cpp +++ b/dgl/src/EventHandlers.cpp @@ -288,6 +288,7 @@ struct KnobEventHandler::PrivateData { double lastX; double lastY; + uint lastClickTime; PrivateData(KnobEventHandler* const s, SubWidget* const w) : self(s), @@ -305,7 +306,8 @@ struct KnobEventHandler::PrivateData { orientation(Vertical), state(kKnobStateDefault), lastX(0.0), - lastY(0.0) {} + lastY(0.0), + lastClickTime(0) {} PrivateData(KnobEventHandler* const s, SubWidget* const w, PrivateData* const other) : self(s), @@ -323,7 +325,8 @@ struct KnobEventHandler::PrivateData { orientation(other->orientation), state(kKnobStateDefault), lastX(0.0), - lastY(0.0) {} + lastY(0.0), + lastClickTime(0) {} void assignFrom(PrivateData* const other) { @@ -341,6 +344,7 @@ struct KnobEventHandler::PrivateData { state = kKnobStateDefault; lastX = 0.0; lastY = 0.0; + lastClickTime = 0; } inline float logscale(const float v) const @@ -374,9 +378,21 @@ struct KnobEventHandler::PrivateData { return true; } - state |= kKnobStateDragging; lastX = ev.pos.getX(); lastY = ev.pos.getY(); + + if (lastClickTime > 0 && ev.time > lastClickTime && ev.time - lastClickTime <= 300) + { + lastClickTime = 0; + + if (callback != nullptr) + callback->knobDoubleClicked(widget); + + return true; + } + + lastClickTime = ev.time; + state |= kKnobStateDragging; widget->repaint(); if (callback != nullptr)