From 7683299447a4e1ecb5210b73bc6173c563e7da2b Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Fri, 5 Oct 2018 06:08:14 -0400 Subject: [PATCH] Move event creation code to WidgetState --- include/WidgetState.hpp | 6 ++++ include/ui/Scene.hpp | 1 + src/WidgetState.cpp | 79 +++++++++++++++++++++++++++++++++++++++++ src/window.cpp | 55 +++++----------------------- 4 files changed, 94 insertions(+), 47 deletions(-) diff --git a/include/WidgetState.hpp b/include/WidgetState.hpp index 4c9e5a28..e2c334e5 100644 --- a/include/WidgetState.hpp +++ b/include/WidgetState.hpp @@ -15,6 +15,12 @@ struct WidgetState { WidgetState(); void handleButton(math::Vec pos, int button, int action, int mods); + void handleHover(math::Vec pos, math::Vec mouseDelta); + void handleLeave(); + void handleScroll(math::Vec pos, math::Vec scrollDelta); + void handleChar(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); }; diff --git a/include/ui/Scene.hpp b/include/ui/Scene.hpp index 4dbadb35..fdcc180b 100644 --- a/include/ui/Scene.hpp +++ b/include/ui/Scene.hpp @@ -1,6 +1,7 @@ #pragma once #include "widgets.hpp" +#include "logger.hpp" namespace rack { diff --git a/src/WidgetState.cpp b/src/WidgetState.cpp index 28af2a40..218d1a3c 100644 --- a/src/WidgetState.cpp +++ b/src/WidgetState.cpp @@ -57,6 +57,85 @@ void WidgetState::handleButton(math::Vec pos, int button, int action, int mods) } +void WidgetState::handleHover(math::Vec pos, math::Vec mouseDelta) { + // Hover event + event::Hover eHover; + eHover.pos = pos; + eHover.mouseDelta = mouseDelta; + rootWidget->handleEvent(eHover); + + // Drag events + if (draggedWidget) { + event::DragMove eDragMove; + eDragMove.mouseDelta = mouseDelta; + draggedWidget->handleEvent(eDragMove); + } +} + +void WidgetState::handleLeave() { + if (hoveredWidget) { + // Leave event + event::Leave eLeave; + hoveredWidget->handleEvent(eLeave); + } + hoveredWidget = NULL; +} + +void WidgetState::handleScroll(math::Vec pos, math::Vec scrollDelta) { + // HoverScroll event + event::HoverScroll eHoverScroll; + eHoverScroll.pos = pos; + eHoverScroll.scrollDelta = scrollDelta; + rootWidget->handleEvent(eHoverScroll); +} + +void WidgetState::handleDrop(math::Vec pos, std::vector paths) { + // PathDrop event + event::PathDrop ePathDrop; + ePathDrop.pos = pos; + ePathDrop.paths = paths; + rootWidget->handleEvent(ePathDrop); +} + +void WidgetState::handleChar(math::Vec pos, int codepoint) { + if (selectedWidget) { + // SelectText event + event::SelectText eSelectText; + eSelectText.codepoint = codepoint; + selectedWidget->handleEvent(eSelectText); + if (eSelectText.target) + return; + } + + // HoverText event + event::HoverText eHoverText; + eHoverText.pos = pos; + eHoverText.codepoint = codepoint; + rootWidget->handleEvent(eHoverText); +} + +void WidgetState::handleKey(math::Vec pos, int key, int scancode, int action, int mods) { + if (selectedWidget) { + event::SelectKey eSelectKey; + eSelectKey.key = key; + eSelectKey.scancode = scancode; + eSelectKey.action = action; + eSelectKey.mods = mods; + selectedWidget->handleEvent(eSelectKey); + if (eSelectKey.target) + return; + } + + event::HoverKey eHoverKey; + eHoverKey.pos = pos; + eHoverKey.key = key; + eHoverKey.scancode = scancode; + eHoverKey.action = action; + eHoverKey.mods = mods; + rootWidget->handleEvent(eHoverKey); +} + + // TODO Move this elsewhere WidgetState *gWidgetState = NULL; diff --git a/src/window.cpp b/src/window.cpp index 2ed0e2dd..e85c8899 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -167,16 +167,7 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { gMousePos = mousePos; - event::Hover eHover; - eHover.pos = mousePos; - eHover.mouseDelta = mouseDelta; - gWidgetState->rootWidget->handleEvent(eHover); - - if (gWidgetState->draggedWidget) { - event::DragMove eDragMove; - eDragMove.mouseDelta = mouseDelta; - gWidgetState->draggedWidget->handleEvent(eDragMove); - } + gWidgetState->handleHover(mousePos, mouseDelta); /* if (gWidgetState->draggedWidget) { @@ -228,11 +219,7 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { void cursorEnterCallback(GLFWwindow* window, int entered) { if (!entered) { - if (gWidgetState->hoveredWidget) { - event::Leave eLeave; - gWidgetState->hoveredWidget->handleEvent(eLeave); - } - gWidgetState->hoveredWidget = NULL; + gWidgetState->handleLeave(); } } @@ -244,40 +231,15 @@ void scrollCallback(GLFWwindow *window, double x, double y) { #endif scrollDelta = scrollDelta.mult(50.0); - event::HoverScroll eHoverScroll; - eHoverScroll.scrollDelta = scrollDelta; - gWidgetState->rootWidget->handleEvent(eHoverScroll); + gWidgetState->handleScroll(gMousePos, scrollDelta); } void charCallback(GLFWwindow *window, unsigned int codepoint) { - if (gWidgetState->selectedWidget) { - event::SelectText eSelectText; - eSelectText.codepoint = codepoint; - gWidgetState->selectedWidget->handleEvent(eSelectText); - } + gWidgetState->handleChar(gMousePos, codepoint); } void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) { - if (action == GLFW_PRESS || action == GLFW_REPEAT) { - if (gWidgetState->selectedWidget) { - event::SelectKey eSelectKey; - eSelectKey.key = key; - eSelectKey.scancode = scancode; - eSelectKey.action = action; - eSelectKey.mods = mods; - gWidgetState->selectedWidget->handleEvent(eSelectKey); - if (eSelectKey.target) - return; - } - - event::HoverKey eHoverKey; - eHoverKey.key = key; - eHoverKey.scancode = scancode; - eHoverKey.action = action; - eHoverKey.mods = mods; - eHoverKey.pos = gMousePos; - gWidgetState->rootWidget->handleEvent(eHoverKey); - } + gWidgetState->handleKey(gMousePos, key, scancode, action, mods); // Keyboard MIDI driver if (!(mods & (GLFW_MOD_SHIFT | GLFW_MOD_CONTROL | GLFW_MOD_ALT | GLFW_MOD_SUPER))) { @@ -291,12 +253,11 @@ void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods } void dropCallback(GLFWwindow *window, int count, const char **paths) { - event::PathDrop ePathDrop; - ePathDrop.pos = gMousePos; + std::vector pathsVec; for (int i = 0; i < count; i++) { - ePathDrop.paths.push_back(paths[i]); + pathsVec.push_back(paths[i]); } - gWidgetState->rootWidget->handleEvent(ePathDrop); + gWidgetState->handleDrop(gMousePos, pathsVec); } void errorCallback(int error, const char *description) {