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; } }