ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
events.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
9 
10 #include <Logging.h>
11 
13 #include "pybind11/functional.h"
14 
15 namespace cloudViewer {
16 namespace visualization {
17 namespace gui {
18 
19 void pybind_gui_events(py::module& m) {
20  py::native_enum<MouseButton> buttons(m, "MouseButton", "enum.IntFlag",
21  "Mouse button identifiers.");
22  buttons.value("NONE", MouseButton::NONE)
23  .value("LEFT", MouseButton::LEFT)
24  .value("MIDDLE", MouseButton::MIDDLE)
25  .value("RIGHT", MouseButton::RIGHT)
26  .value("BUTTON4", MouseButton::BUTTON4)
27  .value("BUTTON5", MouseButton::BUTTON5)
28  .finalize();
29 
30  py::native_enum<KeyModifier> key_mod(m, "KeyModifier", "enum.IntFlag",
31  "Key modifier identifiers.");
32  key_mod.value("NONE", KeyModifier::NONE)
33  .value("SHIFT", KeyModifier::SHIFT)
34  .value("CTRL", KeyModifier::CTRL)
35  .value("ALT", KeyModifier::ALT)
36  .value("META", KeyModifier::META)
37  .finalize();
38 
39  py::class_<MouseEvent> mouse_event(m, "MouseEvent",
40  "Object that stores mouse events");
41 
42  py::native_enum<MouseEvent::Type> mouse_event_type(
43  mouse_event, "Type", "enum.Enum", "MouseEvent::Type.");
44  mouse_event_type.value("MOVE", MouseEvent::Type::MOVE)
45  .value("BUTTON_DOWN", MouseEvent::Type::BUTTON_DOWN)
46  .value("DRAG", MouseEvent::Type::DRAG)
47  .value("BUTTON_UP", MouseEvent::Type::BUTTON_UP)
48  .value("WHEEL", MouseEvent::Type::WHEEL)
49  .finalize();
50  mouse_event.def_readwrite("type", &MouseEvent::type, "Mouse event type")
51  .def_readwrite("x", &MouseEvent::x,
52  "x coordinate of the mouse event")
53  .def_readwrite("y", &MouseEvent::y,
54  "y coordinate of the mouse event")
55  .def(
56  "is_modifier_down",
57  [](const MouseEvent& e, KeyModifier mod) {
58  return ((e.modifiers & int(mod)) != 0);
59  },
60  "Convenience function to more easily deterimine if a "
61  "modifier "
62  "key is down")
63  .def(
64  "is_button_down",
65  [](const MouseEvent& e, MouseButton b) {
66  if (e.type == MouseEvent::Type::WHEEL) {
67  return false;
68  } else if (e.type == MouseEvent::Type::BUTTON_DOWN) {
69  return (e.button.button == b);
70  } else {
71  return ((e.move.buttons & int(b)) != 0);
72  }
73  },
74  "Convenience function to more easily deterimine if a mouse "
75  "button is pressed")
76  .def_readwrite("modifiers", &MouseEvent::modifiers,
77  "ORed mouse modifiers")
78  .def_property(
79  "buttons",
80  [](const MouseEvent& e) -> int {
81  if (e.type == MouseEvent::Type::WHEEL) {
82  return int(MouseButton::NONE);
83  } else if (e.type == MouseEvent::Type::BUTTON_DOWN) {
84  return int(e.button.button);
85  } else {
86  return e.move.buttons;
87  }
88  },
89  [](MouseEvent& e, int new_value) {
90  if (e.type == MouseEvent::Type::WHEEL) {
91  ; // no button value for wheel events
92  } else if (e.type == MouseEvent::Type::BUTTON_DOWN) {
93  e.button.button = MouseButton(new_value);
94  } else {
95  e.move.buttons = new_value;
96  }
97  },
98  "ORed mouse buttons")
99  .def_property(
100  "wheel_dx",
101  [](const MouseEvent& e) -> int {
102  if (e.type == MouseEvent::Type::WHEEL) {
103  return e.wheel.dx;
104  } else {
105  return 0;
106  }
107  },
108  [](MouseEvent& e, int new_value) {
109  if (e.type == MouseEvent::Type::WHEEL) {
110  e.wheel.dx = new_value;
111  } else {
113  "Cannot set MouseEvent.wheel_dx unless "
114  "MouseEvent.type == MouseEvent.Type.WHEEL");
115  }
116  },
117  "Mouse wheel horizontal motion")
118  .def_property(
119  "wheel_dy",
120  [](const MouseEvent& e) -> int {
121  if (e.type == MouseEvent::Type::WHEEL) {
122  return e.wheel.dy;
123  } else {
124  return 0;
125  }
126  },
127  [](MouseEvent& e, int new_value) {
128  if (e.type == MouseEvent::Type::WHEEL) {
129  e.wheel.dy = new_value;
130  } else {
132  "Cannot set MouseEvent.wheel_dy unless "
133  "MouseEvent.type == MouseEvent.Type.WHEEL");
134  }
135  },
136  "Mouse wheel vertical motion")
137  .def_property(
138  "wheel_is_trackpad",
139  [](const MouseEvent& e) -> bool {
140  if (e.type == MouseEvent::Type::WHEEL) {
141  return e.wheel.isTrackpad;
142  } else {
143  return false;
144  }
145  },
146  [](MouseEvent& e, bool new_value) {
147  if (e.type == MouseEvent::Type::WHEEL) {
148  e.wheel.isTrackpad = new_value;
149  } else {
151  "Cannot set MouseEvent.wheel_is_trackpad "
152  "unless MouseEvent.type == "
153  "MouseEvent.Type.WHEEL");
154  }
155  },
156  "Is mouse wheel event from a trackpad");
157 
158  py::native_enum<KeyName> key_name(m, "KeyName", "enum.IntEnum",
159  "Names of keys. Used by KeyEvent.key.");
160  key_name.value("NONE", KeyName::KEY_NONE)
161  .value("BACKSPACE", KeyName::KEY_BACKSPACE)
162  .value("TAB", KeyName::KEY_TAB)
163  .value("ENTER", KeyName::KEY_ENTER)
164  .value("ESCAPE", KeyName::KEY_ESCAPE)
165  .value("SPACE", KeyName::KEY_SPACE)
166  .value("EXCLAMATION_MARK", KeyName::KEY_EXCLAMATION)
167  .value("DOUBLE_QUOTE", KeyName::KEY_DOUBLE_QUOTE)
168  .value("HASH", KeyName::KEY_HASH)
169  .value("DOLLAR_SIGN", KeyName::KEY_DOLLAR_SIGN)
170  .value("PERCENT", KeyName::KEY_PERCENT)
171  .value("AMPERSAND", KeyName::KEY_AMPERSAND)
172  .value("QUOTE", KeyName::KEY_SINGLE_QUOTE)
173  .value("LEFT_PAREN", KeyName::KEY_LEFT_PAREN)
174  .value("RIGHT_PAREN", KeyName::KEY_RIGHT_PAREN)
175  .value("ASTERISK", KeyName::KEY_ASTERISK)
176  .value("PLUS", KeyName::KEY_PLUS)
177  .value("COMMA", KeyName::KEY_COMMA)
178  .value("MINUS", KeyName::KEY_MINUS)
179  .value("PERIOD", KeyName::KEY_PERIOD)
180  .value("SLASH", KeyName::KEY_SLASH)
181  .value("ZERO", KeyName::KEY_0)
182  .value("ONE", KeyName::KEY_1)
183  .value("TWO", KeyName::KEY_2)
184  .value("THREE", KeyName::KEY_3)
185  .value("FOUR", KeyName::KEY_4)
186  .value("FIVE", KeyName::KEY_5)
187  .value("SIX", KeyName::KEY_6)
188  .value("SEVEN", KeyName::KEY_7)
189  .value("EIGHT", KeyName::KEY_8)
190  .value("NINE", KeyName::KEY_9)
191  .value("COLON", KeyName::KEY_COLON)
192  .value("SEMICOLON", KeyName::KEY_SEMICOLON)
193  .value("LESS_THAN", KeyName::KEY_LESS_THAN)
194  .value("EQUALS", KeyName::KEY_EQUALS)
195  .value("GREATER_THAN", KeyName::KEY_GREATER_THAN)
196  .value("QUESTION_MARK", KeyName::KEY_QUESTION_MARK)
197  .value("AT", KeyName::KEY_AT)
198  .value("LEFT_BRACKET", KeyName::KEY_LEFT_BRACKET)
199  .value("BACKSLASH", KeyName::KEY_BACKSLASH)
200  .value("RIGHT_BRACKET", KeyName::KEY_RIGHT_BRACKET)
201  .value("CARET", KeyName::KEY_CARET)
202  .value("UNDERSCORE", KeyName::KEY_UNDERSCORE)
203  .value("BACKTICK", KeyName::KEY_BACKTICK)
204  .value("A", KeyName::KEY_A)
205  .value("B", KeyName::KEY_B)
206  .value("C", KeyName::KEY_C)
207  .value("D", KeyName::KEY_D)
208  .value("E", KeyName::KEY_E)
209  .value("F", KeyName::KEY_F)
210  .value("G", KeyName::KEY_G)
211  .value("H", KeyName::KEY_H)
212  .value("I", KeyName::KEY_I)
213  .value("J", KeyName::KEY_J)
214  .value("K", KeyName::KEY_K)
215  .value("L", KeyName::KEY_L)
216  .value("M", KeyName::KEY_M)
217  .value("N", KeyName::KEY_N)
218  .value("O", KeyName::KEY_O)
219  .value("P", KeyName::KEY_P)
220  .value("Q", KeyName::KEY_Q)
221  .value("R", KeyName::KEY_R)
222  .value("S", KeyName::KEY_S)
223  .value("T", KeyName::KEY_T)
224  .value("U", KeyName::KEY_U)
225  .value("V", KeyName::KEY_V)
226  .value("W", KeyName::KEY_W)
227  .value("X", KeyName::KEY_X)
228  .value("Y", KeyName::KEY_Y)
229  .value("Z", KeyName::KEY_Z)
230  .value("LEFT_BRACE", KeyName::KEY_LEFT_BRACE)
231  .value("PIPE", KeyName::KEY_PIPE)
232  .value("RIGHT_BRACE", KeyName::KEY_RIGHT_BRACE)
233  .value("TILDE", KeyName::KEY_TILDE)
234  .value("DELETE", KeyName::KEY_DELETE)
235  .value("LEFT_SHIFT", KeyName::KEY_LSHIFT)
236  .value("RIGHT_SHIFT", KeyName::KEY_RSHIFT)
237  .value("LEFT_CONTROL", KeyName::KEY_LCTRL)
238  .value("RIGHT_CONTROL", KeyName::KEY_RCTRL)
239  .value("ALT", KeyName::KEY_ALT)
240  .value("META", KeyName::KEY_META)
241  .value("CAPS_LOCK", KeyName::KEY_CAPSLOCK)
242  .value("LEFT", KeyName::KEY_LEFT)
243  .value("RIGHT", KeyName::KEY_RIGHT)
244  .value("UP", KeyName::KEY_UP)
245  .value("DOWN", KeyName::KEY_DOWN)
246  .value("INSERT", KeyName::KEY_INSERT)
247  .value("HOME", KeyName::KEY_HOME)
248  .value("END", KeyName::KEY_END)
249  .value("PAGE_UP", KeyName::KEY_PAGEUP)
250  .value("PAGE_DOWN", KeyName::KEY_PAGEDOWN)
251  .value("F1", KeyName::KEY_F1)
252  .value("F2", KeyName::KEY_F2)
253  .value("F3", KeyName::KEY_F3)
254  .value("F4", KeyName::KEY_F4)
255  .value("F5", KeyName::KEY_F5)
256  .value("F6", KeyName::KEY_F6)
257  .value("F7", KeyName::KEY_F7)
258  .value("F8", KeyName::KEY_F8)
259  .value("F9", KeyName::KEY_F9)
260  .value("F10", KeyName::KEY_F10)
261  .value("F11", KeyName::KEY_F11)
262  .value("F12", KeyName::KEY_F12)
263  .value("UNKNOWN", KeyName::KEY_UNKNOWN)
264  .finalize();
265 
266  py::class_<KeyEvent> key_event(m, "KeyEvent",
267  "Object that stores mouse events");
268 
269  py::native_enum<KeyEvent::Type> key_event_type(
270  key_event, "Type", "enum.Enum", "KeyEvent::Type.");
271  key_event_type.value("DOWN", KeyEvent::Type::DOWN)
272  .value("UP", KeyEvent::Type::UP)
273  .finalize();
274  key_event.def_readwrite("type", &KeyEvent::type, "Key event type")
275  .def_readwrite("key", &KeyEvent::key,
276  "This is the actual key that was pressed, not the "
277  "character generated by the key. This event is "
278  "not suitable for text entry")
279  .def_readwrite("is_repeat", &KeyEvent::isRepeat,
280  "True if this key down event comes from a key "
281  "repeat");
282 }
283 
284 } // namespace gui
285 } // namespace visualization
286 } // namespace cloudViewer
#define LogWarning(...)
Definition: Logging.h:72
void pybind_gui_events(py::module &m)
Definition: events.cpp:19
Generic file read and write utility for python interface.
struct cloudViewer::visualization::gui::MouseEvent::@17::@21 wheel
struct cloudViewer::visualization::gui::MouseEvent::@17::@19 move