commit 2ba1ac10dc7309e1d6a10b46c99ac967d7889234
parent b8e8eb7a9aff73239df6c2b225fb6dac1647904c
Author: falkTX <falktx@falktx.com>
Date: Fri, 26 Aug 2022 05:44:11 +0100
Introduce knobDoubleClicked for KnobEventHandler
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
3 files changed, 21 insertions(+), 4 deletions(-)
diff --git 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
@@ -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
@@ -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)