From 8ad2f05abd12886d07264edcb49ee05e9ce6328b 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: 6991c60426c0a41d88174fbe404dee49fc13dc2b [formerly 662192d79c314e08128b196cd352188eff903fb0] [formerly d238c31726f70ecf078d8e8cc3dc3032cf1529ca [formerly 5caa1f462aed257779cfe5e8413729062f026bf5]] Former-commit-id: 296fe5698e0bf5d8b058de032a8549df1c4891eb [formerly 20dfabc83b4eb8c2cc89138a05c29d53e17c952a] Former-commit-id: 44b7f726bc84056071b9e577357a736e78436767 --- 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; } }