From 9ea02e8b813a03de5ca8aaa8df05901972affd7c Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 16 Sep 2016 16:55:55 +0200 Subject: [PATCH] Sdk/Widgets: Add OnMouseButtonPressed/OnMouseButtonRelease events Former-commit-id: 472d7dc96b23ae29eaa951acd9db1a7771252616 [formerly 48ebfb3f7bb87c895d9ed8208799ab9654d9a8d8] [formerly 7617433fe3c998e6bdde1e01f4b5b9ea7578640d [formerly 280df873dfc507940fdd7ddc0b282c3ba1c0a405]] Former-commit-id: 82ca7b74b4759b8a929e0110cdce3e1426d376da [formerly d8147aeca86e65d22182277f57b9ab47a5575793] Former-commit-id: 373c4a0f6655511f55355550d2f8d8af9e81eea0 --- SDK/include/NDK/BaseWidget.hpp | 3 +++ SDK/include/NDK/Canvas.hpp | 8 +++++- SDK/include/NDK/Canvas.inl | 3 +++ SDK/src/NDK/BaseWidget.cpp | 8 ++++++ SDK/src/NDK/Canvas.cpp | 49 +++++++++++++++++++++++++++++----- 5 files changed, 64 insertions(+), 7 deletions(-) diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index eb00d9ea4..38e593563 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include namespace Ndk @@ -66,6 +67,8 @@ namespace Ndk virtual void OnMouseEnter(); virtual void OnMouseMoved(int x, int y, int deltaX, int deltaY); + virtual void OnMouseButtonPress(int x, int y, Nz::Mouse::Button button); + virtual void OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button); virtual void OnMouseExit(); private: diff --git a/SDK/include/NDK/Canvas.hpp b/SDK/include/NDK/Canvas.hpp index f307f3dd3..9bf8c8ddd 100644 --- a/SDK/include/NDK/Canvas.hpp +++ b/SDK/include/NDK/Canvas.hpp @@ -40,7 +40,10 @@ namespace Ndk void UnregisterWidget(std::size_t index); private: + void OnMouseButtonPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseButtonEvent& event); + void OnMouseButtonRelease(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseButtonEvent& event); void OnMouseMoved(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseMoveEvent& event); + void OnMouseLeft(const Nz::EventHandler* eventHandler); struct WidgetBox { @@ -48,10 +51,13 @@ namespace Ndk Nz::Boxf box; }; + NazaraSlot(Nz::EventHandler, OnMouseButtonPressed, m_mouseButtonPressedSlot); + NazaraSlot(Nz::EventHandler, OnMouseButtonReleased, m_mouseButtonReleasedSlot); NazaraSlot(Nz::EventHandler, OnMouseMoved, m_mouseMovedSlot); + NazaraSlot(Nz::EventHandler, OnMouseLeft, m_mouseLeftSlot); std::vector m_widgetBoxes; - BaseWidget* m_hoveredWidget; + const WidgetBox* m_hoveredWidget; WorldHandle m_world; }; } diff --git a/SDK/include/NDK/Canvas.inl b/SDK/include/NDK/Canvas.inl index c976c911b..f9dcc5845 100644 --- a/SDK/include/NDK/Canvas.inl +++ b/SDK/include/NDK/Canvas.inl @@ -12,7 +12,10 @@ namespace Ndk { m_canvas = this; + m_mouseButtonPressedSlot.Connect(eventHandler.OnMouseButtonPressed, this, &Canvas::OnMouseButtonPressed); + m_mouseButtonReleasedSlot.Connect(eventHandler.OnMouseButtonReleased, this, &Canvas::OnMouseButtonRelease); m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, this, &Canvas::OnMouseMoved); + m_mouseLeftSlot.Connect(eventHandler.OnMouseLeft, this, &Canvas::OnMouseLeft); } inline const WorldHandle& Canvas::GetWorld() const diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index e0c62aab2..f72ace844 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -100,6 +100,14 @@ namespace Ndk { } + void BaseWidget::OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) + { + } + + void BaseWidget::OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button) + { + } + void BaseWidget::OnMouseExit() { } diff --git a/SDK/src/NDK/Canvas.cpp b/SDK/src/NDK/Canvas.cpp index 79efc4cec..e8ee8c387 100644 --- a/SDK/src/NDK/Canvas.cpp +++ b/SDK/src/NDK/Canvas.cpp @@ -54,12 +54,37 @@ namespace Ndk WidgetBox& entry = m_widgetBoxes[index]; WidgetBox& lastEntry = m_widgetBoxes.back(); + if (m_hoveredWidget == &entry) + m_hoveredWidget = nullptr; + entry = std::move(lastEntry); entry.widget->UpdateCanvasIndex(index); m_widgetBoxes.pop_back(); } } + void Canvas::OnMouseButtonPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseButtonEvent& event) + { + if (m_hoveredWidget) + { + int x = static_cast(std::round(event.x - m_hoveredWidget->box.x)); + int y = static_cast(std::round(event.y - m_hoveredWidget->box.y)); + + m_hoveredWidget->widget->OnMouseButtonPress(x, y, event.button); + } + } + + void Canvas::OnMouseButtonRelease(const Nz::EventHandler * eventHandler, const Nz::WindowEvent::MouseButtonEvent & event) + { + if (m_hoveredWidget) + { + int x = static_cast(std::round(event.x - m_hoveredWidget->box.x)); + int y = static_cast(std::round(event.y - m_hoveredWidget->box.y)); + + m_hoveredWidget->widget->OnMouseButtonRelease(x, y, event.button); + } + } + void Canvas::OnMouseMoved(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseMoveEvent& event) { const WidgetBox* bestEntry = nullptr; @@ -82,20 +107,32 @@ namespace Ndk if (bestEntry) { - if (m_hoveredWidget != bestEntry->widget) + if (m_hoveredWidget != bestEntry) { if (m_hoveredWidget) - m_hoveredWidget->OnMouseExit(); + m_hoveredWidget->widget->OnMouseExit(); - m_hoveredWidget = bestEntry->widget; - m_hoveredWidget->OnMouseEnter(); + m_hoveredWidget = bestEntry; + m_hoveredWidget->widget->OnMouseEnter(); } - bestEntry->widget->OnMouseMoved(event.x - bestEntry->box.x, event.y - bestEntry->box.y, event.deltaX, event.deltaY); + int x = static_cast(std::round(event.x - m_hoveredWidget->box.x)); + int y = static_cast(std::round(event.y - m_hoveredWidget->box.y)); + + bestEntry->widget->OnMouseMoved(x, y, event.deltaX, event.deltaY); } else if (m_hoveredWidget) { - m_hoveredWidget->OnMouseExit(); + m_hoveredWidget->widget->OnMouseExit(); + m_hoveredWidget = nullptr; + } + } + + void Canvas::OnMouseLeft(const Nz::EventHandler* eventHandler) + { + if (m_hoveredWidget) + { + m_hoveredWidget->widget->OnMouseExit(); m_hoveredWidget = nullptr; } }