From 467dd78e579106aac54cd385811d7bed1274ca2f Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Fri, 5 Oct 2018 17:33:50 -0400 Subject: [PATCH] Fix event bugs --- include/WidgetState.hpp | 15 +++++---- src/WidgetState.cpp | 74 ++++++++++++++++++++++++++++++----------- src/app/RackWidget.cpp | 4 +++ src/widgets/Widget.cpp | 7 ++-- 4 files changed, 69 insertions(+), 31 deletions(-) diff --git a/include/WidgetState.hpp b/include/WidgetState.hpp index 7ab4647f..e5aa20f7 100644 --- a/include/WidgetState.hpp +++ b/include/WidgetState.hpp @@ -7,13 +7,14 @@ namespace rack { struct WidgetState { - Widget *rootWidget; - Widget *hoveredWidget; - Widget *draggedWidget; - Widget *dragHoveredWidget; - Widget *selectedWidget; + Widget *rootWidget = NULL; + Widget *hoveredWidget = NULL; + Widget *draggedWidget = NULL; + Widget *dragHoveredWidget = NULL; + Widget *selectedWidget = NULL; + /** For middle-click dragging */ + Widget *scrollWidget = NULL; - WidgetState(); void handleButton(math::Vec pos, int button, int action, int mods); void handleHover(math::Vec pos, math::Vec mouseDelta); void handleLeave(); @@ -21,6 +22,8 @@ struct WidgetState { void handleText(math::Vec pos, int codepoint); void handleKey(math::Vec pos, int key, int scancode, int action, int mods); void handleDrop(math::Vec pos, std::vector paths); + /** Prepares a widget for deletion */ + void finalizeWidget(Widget *w); }; diff --git a/src/WidgetState.cpp b/src/WidgetState.cpp index 241a23ea..31b1b2d0 100644 --- a/src/WidgetState.cpp +++ b/src/WidgetState.cpp @@ -4,15 +4,6 @@ namespace rack { -WidgetState::WidgetState() { - rootWidget = NULL; - hoveredWidget = NULL; - draggedWidget = NULL; - dragHoveredWidget = NULL; - selectedWidget = NULL; -} - - void WidgetState::handleButton(math::Vec pos, int button, int action, int mods) { // Button event event::Button eButton; @@ -23,18 +14,20 @@ void WidgetState::handleButton(math::Vec pos, int button, int action, int mods) rootWidget->handleEvent(eButton); Widget *clickedWidget = eButton.target; - if (button == GLFW_MOUSE_BUTTON_LEFT && clickedWidget) { + if (button == GLFW_MOUSE_BUTTON_LEFT) { // Drag events - if (action == GLFW_PRESS && !draggedWidget) { + if (action == GLFW_PRESS && !draggedWidget && clickedWidget) { event::DragStart eDragStart; clickedWidget->handleEvent(eDragStart); - draggedWidget = eDragStart.target; + draggedWidget = clickedWidget; } if (action == GLFW_RELEASE && draggedWidget) { - event::DragDrop eDragDrop; - eDragDrop.origin = draggedWidget; - clickedWidget->handleEvent(eDragDrop); + if (clickedWidget) { + event::DragDrop eDragDrop; + eDragDrop.origin = draggedWidget; + clickedWidget->handleEvent(eDragDrop); + } event::DragEnd eDragEnd; draggedWidget->handleEvent(eDragEnd); @@ -56,21 +49,53 @@ void WidgetState::handleButton(math::Vec pos, int button, int action, int mods) } } } + + if (button == GLFW_MOUSE_BUTTON_MIDDLE) { + if (action == GLFW_PRESS) { + scrollWidget = clickedWidget; + } + if (action == GLFW_RELEASE) { + scrollWidget = NULL; + } + } } void WidgetState::handleHover(math::Vec pos, math::Vec mouseDelta) { + // Drag events + if (draggedWidget) { + event::DragMove eDragMove; + eDragMove.mouseDelta = mouseDelta; + draggedWidget->handleEvent(eDragMove); + return; + } + + // if (scrollWidget) { + // event::HoverScroll eHoverScroll; + // eHoverScroll.pos = pos; + // eHoverScroll.scrollDelta = scrollDelta; + // rootWidget->handleEvent(eHoverScroll); + // } + // Hover event event::Hover eHover; eHover.pos = pos; eHover.mouseDelta = mouseDelta; rootWidget->handleEvent(eHover); + Widget *newHoveredWidget = eHover.target; - // Drag events - if (draggedWidget) { - event::DragMove eDragMove; - eDragMove.mouseDelta = mouseDelta; - draggedWidget->handleEvent(eDragMove); + if (newHoveredWidget != hoveredWidget) { + if (hoveredWidget) { + event::Leave eLeave; + hoveredWidget->handleEvent(eLeave); + } + + hoveredWidget = newHoveredWidget; + + if (hoveredWidget) { + event::Enter eEnter; + hoveredWidget->handleEvent(eEnter); + } } } @@ -137,6 +162,15 @@ void WidgetState::handleKey(math::Vec pos, int key, int scancode, int action, in rootWidget->handleEvent(eHoverKey); } +void WidgetState::finalizeWidget(Widget *w) { + if (hoveredWidget == w) hoveredWidget = NULL; + if (draggedWidget == w) draggedWidget = NULL; + if (dragHoveredWidget == w) dragHoveredWidget = NULL; + if (selectedWidget == w) selectedWidget = NULL; + if (scrollWidget == w) scrollWidget = NULL; +} + + // TODO Move this elsewhere WidgetState *gWidgetState = NULL; diff --git a/src/app/RackWidget.cpp b/src/app/RackWidget.cpp index 3514aa77..6cfe6464 100644 --- a/src/app/RackWidget.cpp +++ b/src/app/RackWidget.cpp @@ -503,9 +503,13 @@ void RackWidget::on(event::Hover &e) { } void RackWidget::on(event::Button &e) { + DEBUG("1"); OpaqueWidget::on(e); + DEBUG("2"); if (e.target == this) { + DEBUG("3"); if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_RIGHT) { + DEBUG("4"); appModuleBrowserCreate(); } } diff --git a/src/widgets/Widget.cpp b/src/widgets/Widget.cpp index 0df1022e..7d62d0ac 100644 --- a/src/widgets/Widget.cpp +++ b/src/widgets/Widget.cpp @@ -9,11 +9,7 @@ namespace rack { Widget::~Widget() { // You should only delete orphaned widgets assert(!parent); - // Stop dragging and hovering this widget - if (gWidgetState->hoveredWidget == this) gWidgetState->hoveredWidget = NULL; - if (gWidgetState->draggedWidget == this) gWidgetState->draggedWidget = NULL; - if (gWidgetState->hoveredWidget == this) gWidgetState->hoveredWidget = NULL; - if (gWidgetState->selectedWidget == this) gWidgetState->selectedWidget = NULL; + gWidgetState->finalizeWidget(this); clearChildren(); } @@ -81,6 +77,7 @@ void Widget::step() { // Delete children if a delete is requested if (child->requestedDelete) { it = children.erase(it); + child->parent = NULL; delete child; continue; }