From 92d06e9e6bc8e77723847f3c37875ebb9786c0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 23 Oct 2024 20:03:25 +0200 Subject: [PATCH] python: adapt to Magnum key and pointer event changes. No backwards compatibility now either, sorry. --- doc/python/pages/changelog.rst | 8 +- src/python/magnum/platform/application.h | 100 +++++++++++------------ src/python/magnum/platform/glfw.cpp | 56 ++++++++----- src/python/magnum/platform/sdl2.cpp | 58 ++++++++----- 4 files changed, 124 insertions(+), 98 deletions(-) diff --git a/doc/python/pages/changelog.rst b/doc/python/pages/changelog.rst index b67ca36..04ec371 100644 --- a/doc/python/pages/changelog.rst +++ b/doc/python/pages/changelog.rst @@ -115,10 +115,10 @@ Changelog :ref:`Range2D.center_y()`, :ref:`Range3D.z()`, :ref:`Range3D.center_x()` / :ref:`Range3D.center_y()` / :ref:`Range3D.center_z()` - Fixed a copypaste error in - :ref:`platform.sdl2.Application.MouseMoveEvent.relative_position` and - :ref:`platform.glfw.Application.MouseMoveEvent.relative_position` -- Fixed :ref:`platform.sdl2.Application.InputEvent.Modifier` and - :ref:`platform.glfw.Application.InputEvent.Modifier` to behave properly + :ref:`platform.sdl2.Application.PointerMoveEvent.relative_position` and + :ref:`platform.glfw.Application.PointerMoveEvent.relative_position` +- Fixed :ref:`platform.sdl2.Application.Modifier` and + :ref:`platform.glfw.Application.Modifier` to behave properly as flags and not just as an enum - Exposed :ref:`meshtools.compress_indices()`, :ref:`meshtools.concatenate()`, :ref:`meshtools.copy()`, :ref:`meshtools.duplicate()`, diff --git a/src/python/magnum/platform/application.h b/src/python/magnum/platform/application.h index 3afe59b..4d0b98e 100644 --- a/src/python/magnum/platform/application.h +++ b/src/python/magnum/platform/application.h @@ -29,6 +29,8 @@ #include #include /** @todo drop once we have our string casters */ +#include "Corrade/Containers/OptionalPythonBindings.h" /* for pointers() */ + #include "corrade/EnumOperators.h" #include "magnum/bootstrap.h" @@ -98,28 +100,14 @@ template void application(py::class_ void exitEvent(py::class_& c) { - c - .def_property("accepted", &T::isAccepted, &T::setAccepted, "Accepted status of the event"); -} - -template void viewportEvent(py::class_& c) { - c - .def_property_readonly("window_size", &T::windowSize, "Window size") - .def_property_readonly("framebuffer_size", &T::framebufferSize, "Framebuffer size") - .def_property_readonly("dpi_scaling", &T::dpiScaling, "DPI scaling"); -} -template void inputEvent(py::class_& c) { - py::enum_ modifiers{c, "Modifier", "Modifier"}; + py::enum_ modifiers{c, "Modifier", "Keyboard modifier"}; modifiers .value("SHIFT", T::Modifier::Shift) .value("CTRL", T::Modifier::Ctrl) @@ -127,10 +115,6 @@ template void inputEvent(py::class_& c) { .value("SUPER", T::Modifier::Super); corrade::enumOperators(modifiers); - c.def_property("accepted", &T::isAccepted, &T::setAccepted, "Accepted status of the event"); -} - -template void keyEvent(py::class_& c) { py::enum_{c, "Key", "Key"} .value("UNKNOWN", T::Key::Unknown) .value("LEFT_SHIFT", T::Key::LeftShift) @@ -244,55 +228,71 @@ template void keyEvent(py::class_& c) { .value("NUM_ENTER", T::Key::NumEnter) .value("NUM_EQUAL", T::Key::NumEqual); + /* The PointerEventSource and Pointer enums are defined for each + application separately, as each has a different set of values */ +} + +template void exitEvent(py::class_& c) { + c + .def_property("accepted", &T::isAccepted, &T::setAccepted, "Accepted status of the event"); +} + +template void viewportEvent(py::class_& c) { + c + .def_property_readonly("window_size", &T::windowSize, "Window size") + .def_property_readonly("framebuffer_size", &T::framebufferSize, "Framebuffer size") + .def_property_readonly("dpi_scaling", &T::dpiScaling, "DPI scaling"); +} + +template void inputEvent(py::class_& c) { + c.def_property("accepted", &T::isAccepted, &T::setAccepted, "Accepted status of the event"); +} + +template void keyEvent(py::class_& c) { c .def_property_readonly("key", &T::key, "Key") /** @todo key name? useful? useles?? */ .def_property_readonly("modifiers", [](T& self) { - return typename T::Modifier(typename std::underlying_type::type(self.modifiers())); + return typename decltype(self.modifiers())::Type(enumCastUnderlyingType(self.modifiers())); }, "Modifiers") .def_property_readonly("is_repeated", &T::isRepeated, "Whether the key press is repeated"); } -template void mouseEvent(py::class_& c) { - py::enum_{c, "Button", "Mouse button"} - .value("LEFT", T::Button::Left) - .value("MIDDLE", T::Button::Middle) - .value("RIGHT", T::Button::Right); - +template void pointerEvent(py::class_& c) { c - .def_property_readonly("button", &T::button, "Button") + .def_property_readonly("source", &T::source, "Pointer event source") + .def_property_readonly("pointer", &T::pointer, "Pointer type that was pressed or released") + .def_property_readonly("is_primary", &T::isPrimary, "Whether the pointer is primary") + .def_property_readonly("id", &T::id, "Pointer ID") .def_property_readonly("position", &T::position, "Position") .def_property_readonly("modifiers", [](T& self) { - return typename T::Modifier(typename std::underlying_type::type(self.modifiers())); - }, "Modifiers"); + return typename decltype(self.modifiers())::Type(enumCastUnderlyingType(self.modifiers())); + }, "Keyboard modifiers"); } -template void mouseMoveEvent(py::class_& c) { - py::enum_ buttons{c, "Buttons", "Set of mouse buttons"}; - buttons - .value("LEFT", T::Button::Left) - .value("MIDDLE", T::Button::Middle) - .value("RIGHT", T::Button::Right); - corrade::enumOperators(buttons); - +template void pointerMoveEvent(py::class_& c) { c + .def_property_readonly("source", &T::source, "Pointer event source") + .def_property_readonly("pointer", &T::pointer, "Pointer type that was added or removed from the set of pressed pointers") + .def_property_readonly("pointers", [](T& self) { + return typename decltype(self.pointers())::Type(enumCastUnderlyingType(self.pointers())); + }, "Pointer types pressed in this event") + .def_property_readonly("is_primary", &T::isPrimary, "Whether the pointer is primary") + .def_property_readonly("id", &T::id, "Pointer ID") .def_property_readonly("position", &T::position, "Position") .def_property_readonly("relative_position", &T::relativePosition, "Relative position") - .def_property_readonly("buttons", [](T& self) { - return typename T::Button(typename std::underlying_type::type(self.buttons())); - }, "Mouse buttons") .def_property_readonly("modifiers", [](T& self) { - return typename T::Modifier(typename std::underlying_type::type(self.modifiers())); - }, "Modifiers"); + return typename decltype(self.modifiers())::Type(enumCastUnderlyingType(self.modifiers())); + }, "Keyboard modifiers"); } -template void mouseScrollEvent(py::class_& c) { +template void scrollEvent(py::class_& c) { c .def_property_readonly("offset", &T::offset, "Offset") .def_property_readonly("position", &T::position, "Position") .def_property_readonly("modifiers", [](T& self) { - return typename T::Modifier(typename std::underlying_type::type(self.modifiers())); - }, "Modifiers"); + return typename decltype(self.modifiers())::Type(enumCastUnderlyingType(self.modifiers())); + }, "Keyboard modifiers"); } }} diff --git a/src/python/magnum/platform/glfw.cpp b/src/python/magnum/platform/glfw.cpp index 93a8302..a6889f3 100644 --- a/src/python/magnum/platform/glfw.cpp +++ b/src/python/magnum/platform/glfw.cpp @@ -58,10 +58,10 @@ void glfw(py::module_& m) { void viewportEvent(ViewportEvent&) override {} void keyPressEvent(KeyEvent&) override {} void keyReleaseEvent(KeyEvent&) override {} - void mousePressEvent(MouseEvent&) override {} - void mouseReleaseEvent(MouseEvent&) override {} - void mouseMoveEvent(MouseMoveEvent&) override {} - void mouseScrollEvent(MouseScrollEvent&) override {} + void pointerPressEvent(PointerEvent&) override {} + void pointerReleaseEvent(PointerEvent&) override {} + void pointerMoveEvent(PointerMoveEvent&) override {} + void scrollEvent(ScrollEvent&) override {} /* The base doesn't have a virtual destructor because in C++ it's never deleted through a pointer to the base. Here we need it, though. */ @@ -142,45 +142,45 @@ void glfw(py::module_& m) { ); } - void mousePressEvent(MouseEvent& event) override { + void pointerPressEvent(PointerEvent& event) override { PYBIND11_OVERLOAD_NAME( void, PublicizedApplication, - "mouse_press_event", - mousePressEvent, + "pointer_press_event", + pointerPressEvent, /* Have to use std::ref() otherwise pybind tries to copy it and fails */ std::ref(event) ); } - void mouseReleaseEvent(MouseEvent& event) override { + void pointerReleaseEvent(PointerEvent& event) override { PYBIND11_OVERLOAD_NAME( void, PublicizedApplication, - "mouse_release_event", - mouseReleaseEvent, + "pointer_release_event", + pointerReleaseEvent, /* Have to use std::ref() otherwise pybind tries to copy it and fails */ std::ref(event) ); } - void mouseMoveEvent(MouseMoveEvent& event) override { + void pointerMoveEvent(PointerMoveEvent& event) override { PYBIND11_OVERLOAD_NAME( void, PublicizedApplication, - "mouse_move_event", - mouseMoveEvent, + "pointer_move_event", + pointerMoveEvent, /* Have to use std::ref() otherwise pybind tries to copy it and fails */ std::ref(event) ); } - void mouseScrollEvent(MouseScrollEvent& event) override { + void scrollEvent(ScrollEvent& event) override { PYBIND11_OVERLOAD_NAME( void, PublicizedApplication, - "mouse_scroll_event", - mouseScrollEvent, + "scroll_event", + scrollEvent, /* Have to use std::ref() otherwise pybind tries to copy it and fails */ std::ref(event) @@ -200,9 +200,21 @@ void glfw(py::module_& m) { PyNonDestructibleClass viewportEvent_{glfwApplication, "ViewportEvent", "Viewport event"}; PyNonDestructibleClass inputEvent_{glfwApplication, "InputEvent", "Base for input events"}; py::class_ keyEvent_{glfwApplication, "KeyEvent", "Key event"}; - py::class_ mouseEvent_{glfwApplication, "MouseEvent", "Mouse event"}; - py::class_ mouseMoveEvent_{glfwApplication, "MouseMoveEvent", "Mouse move event"}; - py::class_ mouseScrollEvent_{glfwApplication, "MouseScrollEvent", "Mouse scroll event"}; + py::class_ pointerEvent_{glfwApplication, "PointerEvent", "Pointer event"}; + py::class_ pointerMoveEvent_{glfwApplication, "PointerMoveEvent", "Pointer move event"}; + py::class_ scrollEvent_{glfwApplication, "ScrollEvent", "Scroll event"}; + + py::enum_{glfwApplication, "PointerEventSource", "Pointer event source"} + .value("MOUSE", Platform::Application::PointerEventSource::Mouse); + + py::enum_ pointer{glfwApplication, "Pointer", "Pointer"}; + pointer + .value("MOUSE_LEFT", Platform::Application::Pointer::MouseLeft) + .value("MOUSE_MIDDLE", Platform::Application::Pointer::MouseMiddle) + .value("MOUSE_RIGHT", Platform::Application::Pointer::MouseRight) + .value("MOUSE_BUTTON4", Platform::Application::Pointer::MouseButton4) + .value("MOUSE_BUTTON5", Platform::Application::Pointer::MouseButton5); + corrade::enumOperators(pointer); py::enum_{glfwApplication, "Cursor", "Cursor type"} .value("ARROW", Platform::Application::Cursor::Arrow) @@ -227,9 +239,9 @@ void glfw(py::module_& m) { viewportEvent(viewportEvent_); inputEvent(inputEvent_); keyEvent(keyEvent_); - mouseEvent(mouseEvent_); - mouseMoveEvent(mouseMoveEvent_); - mouseScrollEvent(mouseScrollEvent_); + pointerEvent(pointerEvent_); + pointerMoveEvent(pointerMoveEvent_); + scrollEvent(scrollEvent_); } }} diff --git a/src/python/magnum/platform/sdl2.cpp b/src/python/magnum/platform/sdl2.cpp index 2428f77..34be579 100644 --- a/src/python/magnum/platform/sdl2.cpp +++ b/src/python/magnum/platform/sdl2.cpp @@ -58,10 +58,10 @@ void sdl2(py::module_& m) { void viewportEvent(ViewportEvent&) override {} void keyPressEvent(KeyEvent&) override {} void keyReleaseEvent(KeyEvent&) override {} - void mousePressEvent(MouseEvent&) override {} - void mouseReleaseEvent(MouseEvent&) override {} - void mouseMoveEvent(MouseMoveEvent&) override {} - void mouseScrollEvent(MouseScrollEvent&) override {} + void pointerPressEvent(PointerEvent&) override {} + void pointerReleaseEvent(PointerEvent&) override {} + void pointerMoveEvent(PointerMoveEvent&) override {} + void scrollEvent(ScrollEvent&) override {} /* The base doesn't have a virtual destructor because in C++ it's never deleted through a pointer to the base. Here we need it, though. */ @@ -142,45 +142,45 @@ void sdl2(py::module_& m) { ); } - void mousePressEvent(MouseEvent& event) override { + void pointerPressEvent(PointerEvent& event) override { PYBIND11_OVERLOAD_NAME( void, PublicizedApplication, - "mouse_press_event", - mousePressEvent, + "pointer_press_event", + pointerPressEvent, /* Have to use std::ref() otherwise pybind tries to copy it and fails */ std::ref(event) ); } - void mouseReleaseEvent(MouseEvent& event) override { + void pointerReleaseEvent(PointerEvent& event) override { PYBIND11_OVERLOAD_NAME( void, PublicizedApplication, - "mouse_release_event", - mouseReleaseEvent, + "pointer_release_event", + pointerReleaseEvent, /* Have to use std::ref() otherwise pybind tries to copy it and fails */ std::ref(event) ); } - void mouseMoveEvent(MouseMoveEvent& event) override { + void pointerMoveEvent(PointerMoveEvent& event) override { PYBIND11_OVERLOAD_NAME( void, PublicizedApplication, - "mouse_move_event", - mouseMoveEvent, + "pointer_move_event", + pointerMoveEvent, /* Have to use std::ref() otherwise pybind tries to copy it and fails */ std::ref(event) ); } - void mouseScrollEvent(MouseScrollEvent& event) override { + void scrollEvent(ScrollEvent& event) override { PYBIND11_OVERLOAD_NAME( void, PublicizedApplication, - "mouse_scroll_event", - mouseScrollEvent, + "scroll_event", + scrollEvent, /* Have to use std::ref() otherwise pybind tries to copy it and fails */ std::ref(event) @@ -200,9 +200,23 @@ void sdl2(py::module_& m) { PyNonDestructibleClass viewportEvent_{sdl2application, "ViewportEvent", "Viewport event"}; PyNonDestructibleClass inputEvent_{sdl2application, "InputEvent", "Base for input events"}; py::class_ keyEvent_{sdl2application, "KeyEvent", "Key event"}; - py::class_ mouseEvent_{sdl2application, "MouseEvent", "Mouse event"}; - py::class_ mouseMoveEvent_{sdl2application, "MouseMoveEvent", "Mouse move event"}; - py::class_ mouseScrollEvent_{sdl2application, "MouseScrollEvent", "Mouse scroll event"}; + py::class_ pointerEvent_{sdl2application, "PointerEvent", "Pointer event"}; + py::class_ pointerMoveEvent_{sdl2application, "PointerMoveEvent", "Pointer move event"}; + py::class_ scrollEvent_{sdl2application, "ScrollEvent", "Scroll event"}; + + py::enum_{sdl2application, "PointerEventSource", "Pointer event source"} + .value("MOUSE", Platform::Application::PointerEventSource::Mouse) + .value("TOUCH", Platform::Application::PointerEventSource::Touch); + + py::enum_ pointer{sdl2application, "Pointer", "Pointer"}; + pointer + .value("MOUSE_LEFT", Platform::Application::Pointer::MouseLeft) + .value("MOUSE_MIDDLE", Platform::Application::Pointer::MouseMiddle) + .value("MOUSE_RIGHT", Platform::Application::Pointer::MouseRight) + .value("MOUSE_BUTTON4", Platform::Application::Pointer::MouseButton4) + .value("MOUSE_BUTTON5", Platform::Application::Pointer::MouseButton5) + .value("FINGER", Platform::Application::Pointer::Finger); + corrade::enumOperators(pointer); py::enum_{sdl2application, "Cursor", "Cursor type"} .value("ARROW", Platform::Application::Cursor::Arrow) @@ -224,9 +238,9 @@ void sdl2(py::module_& m) { viewportEvent(viewportEvent_); inputEvent(inputEvent_); keyEvent(keyEvent_); - mouseEvent(mouseEvent_); - mouseMoveEvent(mouseMoveEvent_); - mouseScrollEvent(mouseScrollEvent_); + pointerEvent(pointerEvent_); + pointerMoveEvent(pointerMoveEvent_); + scrollEvent(scrollEvent_); } }}