@@ -19,6 +19,7 @@ struct ParamWidget : widget::OpaqueWidget { | |||||
void step() override; | void step() override; | ||||
void draw(const widget::DrawContext &ctx) override; | void draw(const widget::DrawContext &ctx) override; | ||||
void onButton(const event::Button &e) override; | void onButton(const event::Button &e) override; | ||||
void onDoubleClick(const event::DoubleClick &e) override; | |||||
void onEnter(const event::Enter &e) override; | void onEnter(const event::Enter &e) override; | ||||
void onLeave(const event::Leave &e) override; | void onLeave(const event::Leave &e) override; | ||||
@@ -16,6 +16,7 @@ struct Switch : ParamWidget { | |||||
bool momentaryReleased = false; | bool momentaryReleased = false; | ||||
void step() override; | void step() override; | ||||
void onDoubleClick(const event::DoubleClick &e) override; | |||||
void onDragStart(const event::DragStart &e) override; | void onDragStart(const event::DragStart &e) override; | ||||
void onDragEnd(const event::DragEnd &e) override; | void onDragEnd(const event::DragEnd &e) override; | ||||
}; | }; | ||||
@@ -86,6 +86,12 @@ struct Button : Event, Position { | |||||
}; | }; | ||||
/** Occurs when the left mouse button is pressed the second time within a time and position window. | |||||
*/ | |||||
struct DoubleClick : Event { | |||||
}; | |||||
/** Occurs when a key is pressed, released, or repeated while the mouse is hovering a Widget. | /** Occurs when a key is pressed, released, or repeated while the mouse is hovering a Widget. | ||||
Recurses until consumed. | Recurses until consumed. | ||||
*/ | */ | ||||
@@ -246,6 +252,9 @@ struct State { | |||||
widget::Widget *selectedWidget = NULL; | widget::Widget *selectedWidget = NULL; | ||||
/** For middle-click dragging */ | /** For middle-click dragging */ | ||||
widget::Widget *scrollWidget = NULL; | widget::Widget *scrollWidget = NULL; | ||||
/** For double-clicking */ | |||||
double lastClickTime = -INFINITY; | |||||
math::Vec lastClickPos; | |||||
void setHovered(widget::Widget *w); | void setHovered(widget::Widget *w); | ||||
void setDragged(widget::Widget *w); | void setDragged(widget::Widget *w); | ||||
@@ -122,6 +122,7 @@ struct Widget { | |||||
*/ | */ | ||||
virtual void onHover(const event::Hover &e) {recursePositionEvent(&Widget::onHover, e);} | virtual void onHover(const event::Hover &e) {recursePositionEvent(&Widget::onHover, e);} | ||||
virtual void onButton(const event::Button &e) {recursePositionEvent(&Widget::onButton, e);} | virtual void onButton(const event::Button &e) {recursePositionEvent(&Widget::onButton, e);} | ||||
virtual void onDoubleClick(const event::DoubleClick &e) {} | |||||
virtual void onHoverKey(const event::HoverKey &e) {recursePositionEvent(&Widget::onHoverKey, e);} | virtual void onHoverKey(const event::HoverKey &e) {recursePositionEvent(&Widget::onHoverKey, e);} | ||||
virtual void onHoverText(const event::HoverText &e) {recursePositionEvent(&Widget::onHoverText, e);} | virtual void onHoverText(const event::HoverText &e) {recursePositionEvent(&Widget::onHoverText, e);} | ||||
virtual void onHoverScroll(const event::HoverScroll &e) {recursePositionEvent(&Widget::onHoverScroll, e);} | virtual void onHoverScroll(const event::HoverScroll &e) {recursePositionEvent(&Widget::onHoverScroll, e);} | ||||
@@ -90,7 +90,7 @@ struct ParamResetItem : ui::MenuItem { | |||||
ParamWidget *paramWidget; | ParamWidget *paramWidget; | ||||
ParamResetItem() { | ParamResetItem() { | ||||
text = "Initialize"; | text = "Initialize"; | ||||
rightText = WINDOW_MOD_SHIFT_NAME "+Click"; | |||||
rightText = "Double-click"; | |||||
} | } | ||||
void onAction(const event::Action &e) override { | void onAction(const event::Action &e) override { | ||||
paramWidget->resetAction(); | paramWidget->resetAction(); | ||||
@@ -101,7 +101,7 @@ struct ParamResetItem : ui::MenuItem { | |||||
struct ParamFineItem : ui::MenuItem { | struct ParamFineItem : ui::MenuItem { | ||||
ParamFineItem() { | ParamFineItem() { | ||||
text = "Fine adjust"; | text = "Fine adjust"; | ||||
rightText = WINDOW_MOD_CTRL_NAME "+Drag"; | |||||
rightText = WINDOW_MOD_CTRL_NAME "+drag"; | |||||
disabled = true; | disabled = true; | ||||
} | } | ||||
}; | }; | ||||
@@ -149,18 +149,14 @@ void ParamWidget::onButton(const event::Button &e) { | |||||
e.consume(this); | e.consume(this); | ||||
} | } | ||||
// Shift-click to reset | |||||
if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT && (e.mods & WINDOW_MOD_MASK) == GLFW_MOD_SHIFT) { | |||||
resetAction(); | |||||
// HACK so that dragging won't occur | |||||
e.consume(NULL); | |||||
return; | |||||
} | |||||
if (!e.getConsumed()) | if (!e.getConsumed()) | ||||
widget::OpaqueWidget::onButton(e); | widget::OpaqueWidget::onButton(e); | ||||
} | } | ||||
void ParamWidget::onDoubleClick(const event::DoubleClick &e) { | |||||
resetAction(); | |||||
} | |||||
void ParamWidget::onEnter(const event::Enter &e) { | void ParamWidget::onEnter(const event::Enter &e) { | ||||
if (settings::paramTooltip && !tooltip && paramQuantity) { | if (settings::paramTooltip && !tooltip && paramQuantity) { | ||||
ParamTooltip *paramTooltip = new ParamTooltip; | ParamTooltip *paramTooltip = new ParamTooltip; | ||||
@@ -23,6 +23,10 @@ void Switch::step() { | |||||
ParamWidget::step(); | ParamWidget::step(); | ||||
} | } | ||||
void Switch::onDoubleClick(const event::DoubleClick &e) { | |||||
// Don't reset parameter on double-click | |||||
} | |||||
void Switch::onDragStart(const event::DragStart &e) { | void Switch::onDragStart(const event::DragStart &e) { | ||||
if (momentary) { | if (momentary) { | ||||
if (paramQuantity) { | if (paramQuantity) { | ||||
@@ -133,6 +133,20 @@ void State::handleButton(math::Vec pos, int button, int action, int mods) { | |||||
if (action == GLFW_PRESS) { | if (action == GLFW_PRESS) { | ||||
setSelected(clickedWidget); | setSelected(clickedWidget); | ||||
} | } | ||||
if (action == GLFW_PRESS) { | |||||
const double doubleClickDuration = 0.5; | |||||
const float doubleClickDistance = 10; | |||||
double clickTime = glfwGetTime(); | |||||
if (clickTime - lastClickTime <= doubleClickDuration && pos.minus(lastClickPos).norm() <= doubleClickDistance) { | |||||
// event::DoubleClick | |||||
event::DoubleClick eDoubleClick; | |||||
clickedWidget->onDoubleClick(eDoubleClick); | |||||
} | |||||
lastClickTime = clickTime; | |||||
lastClickPos = pos; | |||||
} | |||||
} | } | ||||
// if (button == GLFW_MOUSE_BUTTON_MIDDLE) { | // if (button == GLFW_MOUSE_BUTTON_MIDDLE) { | ||||