Browse Source

python: adapt to Magnum key and pointer event changes.

No backwards compatibility now either, sorry.
next
Vladimír Vondruš 2 years ago
parent
commit
92d06e9e6b
  1. 8
      doc/python/pages/changelog.rst
  2. 100
      src/python/magnum/platform/application.h
  3. 56
      src/python/magnum/platform/glfw.cpp
  4. 58
      src/python/magnum/platform/sdl2.cpp

8
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()`,

100
src/python/magnum/platform/application.h

@ -29,6 +29,8 @@
#include <pybind11/pybind11.h>
#include <Corrade/Containers/StringStl.h> /** @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<class T, class Trampoline, class Holder> void application(py::class_<T,
.def("draw_event", &T::drawEvent, "Draw event")
.def("key_press_event", &T::keyPressEvent, "Key press event")
.def("key_release_event", &T::keyReleaseEvent, "Key release event")
.def("mouse_press_event", &T::mousePressEvent, "Mouse press event")
.def("mouse_release_event", &T::mouseReleaseEvent, "Mouse release event")
.def("mouse_move_event", &T::mouseMoveEvent, "Mouse move event")
.def("mouse_scroll_event", &T::mouseScrollEvent, "Mouse scroll event")
/** @todo mouse gesture, text input/editing event */
.def("pointer_press_event", &T::pointerPressEvent, "Pointer press event")
.def("pointer_release_event", &T::pointerReleaseEvent, "Pointer release event")
.def("pointer_move_event", &T::pointerMoveEvent, "Pointer move event")
.def("scroll_event", &T::scrollEvent, "Scroll event")
/** @todo text input/editing event */
;
}
template<class T, class ...Args> void exitEvent(py::class_<T, Args...>& c) {
c
.def_property("accepted", &T::isAccepted, &T::setAccepted, "Accepted status of the event");
}
template<class T, class ...Args> void viewportEvent(py::class_<T, Args...>& 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<class T, class ...Args> void inputEvent(py::class_<T, Args...>& c) {
py::enum_<typename T::Modifier> modifiers{c, "Modifier", "Modifier"};
py::enum_<typename T::Modifier> modifiers{c, "Modifier", "Keyboard modifier"};
modifiers
.value("SHIFT", T::Modifier::Shift)
.value("CTRL", T::Modifier::Ctrl)
@ -127,10 +115,6 @@ template<class T, class ...Args> void inputEvent(py::class_<T, Args...>& c) {
.value("SUPER", T::Modifier::Super);
corrade::enumOperators(modifiers);
c.def_property("accepted", &T::isAccepted, &T::setAccepted, "Accepted status of the event");
}
template<class T, class ...Args> void keyEvent(py::class_<T, Args...>& c) {
py::enum_<typename T::Key>{c, "Key", "Key"}
.value("UNKNOWN", T::Key::Unknown)
.value("LEFT_SHIFT", T::Key::LeftShift)
@ -244,55 +228,71 @@ template<class T, class ...Args> void keyEvent(py::class_<T, Args...>& 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<class T, class ...Args> void exitEvent(py::class_<T, Args...>& c) {
c
.def_property("accepted", &T::isAccepted, &T::setAccepted, "Accepted status of the event");
}
template<class T, class ...Args> void viewportEvent(py::class_<T, Args...>& 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<class T, class ...Args> void inputEvent(py::class_<T, Args...>& c) {
c.def_property("accepted", &T::isAccepted, &T::setAccepted, "Accepted status of the event");
}
template<class T, class ...Args> void keyEvent(py::class_<T, Args...>& 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<typename T::Modifier>::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<class T, class ...Args> void mouseEvent(py::class_<T, Args...>& c) {
py::enum_<typename T::Button>{c, "Button", "Mouse button"}
.value("LEFT", T::Button::Left)
.value("MIDDLE", T::Button::Middle)
.value("RIGHT", T::Button::Right);
template<class T, class ...Args> void pointerEvent(py::class_<T, Args...>& 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<typename T::Modifier>::type(self.modifiers()));
}, "Modifiers");
return typename decltype(self.modifiers())::Type(enumCastUnderlyingType(self.modifiers()));
}, "Keyboard modifiers");
}
template<class T, class ...Args> void mouseMoveEvent(py::class_<T, Args...>& c) {
py::enum_<typename T::Button> 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<class T, class ...Args> void pointerMoveEvent(py::class_<T, Args...>& 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<typename T::Button>::type(self.buttons()));
}, "Mouse buttons")
.def_property_readonly("modifiers", [](T& self) {
return typename T::Modifier(typename std::underlying_type<typename T::Modifier>::type(self.modifiers()));
}, "Modifiers");
return typename decltype(self.modifiers())::Type(enumCastUnderlyingType(self.modifiers()));
}, "Keyboard modifiers");
}
template<class T, class ...Args> void mouseScrollEvent(py::class_<T, Args...>& c) {
template<class T, class ...Args> void scrollEvent(py::class_<T, Args...>& 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<typename T::Modifier>::type(self.modifiers()));
}, "Modifiers");
return typename decltype(self.modifiers())::Type(enumCastUnderlyingType(self.modifiers()));
}, "Keyboard modifiers");
}
}}

56
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<PublicizedApplication::ViewportEvent> viewportEvent_{glfwApplication, "ViewportEvent", "Viewport event"};
PyNonDestructibleClass<PublicizedApplication::InputEvent> inputEvent_{glfwApplication, "InputEvent", "Base for input events"};
py::class_<PublicizedApplication::KeyEvent, PublicizedApplication::InputEvent> keyEvent_{glfwApplication, "KeyEvent", "Key event"};
py::class_<PublicizedApplication::MouseEvent, PublicizedApplication::InputEvent> mouseEvent_{glfwApplication, "MouseEvent", "Mouse event"};
py::class_<PublicizedApplication::MouseMoveEvent, PublicizedApplication::InputEvent> mouseMoveEvent_{glfwApplication, "MouseMoveEvent", "Mouse move event"};
py::class_<PublicizedApplication::MouseScrollEvent, PublicizedApplication::InputEvent> mouseScrollEvent_{glfwApplication, "MouseScrollEvent", "Mouse scroll event"};
py::class_<PublicizedApplication::PointerEvent, PublicizedApplication::InputEvent> pointerEvent_{glfwApplication, "PointerEvent", "Pointer event"};
py::class_<PublicizedApplication::PointerMoveEvent, PublicizedApplication::InputEvent> pointerMoveEvent_{glfwApplication, "PointerMoveEvent", "Pointer move event"};
py::class_<PublicizedApplication::ScrollEvent, PublicizedApplication::InputEvent> scrollEvent_{glfwApplication, "ScrollEvent", "Scroll event"};
py::enum_<Platform::Application::PointerEventSource>{glfwApplication, "PointerEventSource", "Pointer event source"}
.value("MOUSE", Platform::Application::PointerEventSource::Mouse);
py::enum_<Platform::Application::Pointer> 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_<Platform::Application::Cursor>{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_);
}
}}

58
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<PublicizedApplication::ViewportEvent> viewportEvent_{sdl2application, "ViewportEvent", "Viewport event"};
PyNonDestructibleClass<PublicizedApplication::InputEvent> inputEvent_{sdl2application, "InputEvent", "Base for input events"};
py::class_<PublicizedApplication::KeyEvent, PublicizedApplication::InputEvent> keyEvent_{sdl2application, "KeyEvent", "Key event"};
py::class_<PublicizedApplication::MouseEvent, PublicizedApplication::InputEvent> mouseEvent_{sdl2application, "MouseEvent", "Mouse event"};
py::class_<PublicizedApplication::MouseMoveEvent, PublicizedApplication::InputEvent> mouseMoveEvent_{sdl2application, "MouseMoveEvent", "Mouse move event"};
py::class_<PublicizedApplication::MouseScrollEvent, PublicizedApplication::InputEvent> mouseScrollEvent_{sdl2application, "MouseScrollEvent", "Mouse scroll event"};
py::class_<PublicizedApplication::PointerEvent, PublicizedApplication::InputEvent> pointerEvent_{sdl2application, "PointerEvent", "Pointer event"};
py::class_<PublicizedApplication::PointerMoveEvent, PublicizedApplication::InputEvent> pointerMoveEvent_{sdl2application, "PointerMoveEvent", "Pointer move event"};
py::class_<PublicizedApplication::ScrollEvent, PublicizedApplication::InputEvent> scrollEvent_{sdl2application, "ScrollEvent", "Scroll event"};
py::enum_<Platform::Application::PointerEventSource>{sdl2application, "PointerEventSource", "Pointer event source"}
.value("MOUSE", Platform::Application::PointerEventSource::Mouse)
.value("TOUCH", Platform::Application::PointerEventSource::Touch);
py::enum_<Platform::Application::Pointer> 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_<Platform::Application::Cursor>{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_);
}
}}

Loading…
Cancel
Save