Skip to content

Commit feb0ae4

Browse files
author
Roberto De Ioris
committed
added FModifierKeysState wrapper
1 parent e57d0b6 commit feb0ae4

File tree

7 files changed

+262
-4
lines changed

7 files changed

+262
-4
lines changed

Source/UnrealEnginePython/Private/Slate/UEPyFCharacterEvent.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,27 @@ static PyTypeObject ue_PyFCharacterEventType = {
5656
static int ue_py_fcharacter_event_init(ue_PyFCharacterEvent *self, PyObject *args, PyObject *kwargs)
5757
{
5858
char *key;
59-
if (!PyArg_ParseTuple(args, "s", &key))
59+
PyObject *py_repeat = nullptr;
60+
PyObject *py_modifier = nullptr;
61+
if (!PyArg_ParseTuple(args, "sO|O", &key, &py_repeat, &py_modifier))
6062
{
6163
return -1;
6264
}
6365

64-
// TODO make it configurable
6566
FModifierKeysState modifier;
67+
if (py_modifier)
68+
{
69+
ue_PyFModifierKeysState *f_modifier = py_ue_is_fmodifier_keys_state(py_modifier);
70+
if (!f_modifier)
71+
{
72+
PyErr_SetString(PyExc_Exception, "argument is not a FModifierKeysState");
73+
return -1;
74+
}
75+
modifier = f_modifier->modifier;
76+
}
77+
6678

67-
// TODO make repeat configurable
68-
FCharacterEvent Event(*UTF8_TO_TCHAR(key), modifier, 0, false);
79+
FCharacterEvent Event(*UTF8_TO_TCHAR(key), modifier, 0, (py_repeat && PyObject_IsTrue(py_repeat)));
6980

7081
new(&self->character_event) FCharacterEvent(Event);
7182
new(&self->f_input.input) FInputEvent(Event);
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#include "UnrealEnginePythonPrivatePCH.h"
2+
3+
#include "UEPyFModifierKeysState.h"
4+
5+
static PyObject *py_ue_fmodifier_keys_state_are_caps_locked(ue_PyFModifierKeysState *self, PyObject * args)
6+
{
7+
if (self->modifier.AreCapsLocked())
8+
{
9+
Py_RETURN_TRUE;
10+
}
11+
Py_RETURN_FALSE;
12+
}
13+
14+
static PyMethodDef ue_PyFModifierKeysState_methods[] = {
15+
{ "are_caps_locked", (PyCFunction)py_ue_fmodifier_keys_state_are_caps_locked, METH_VARARGS, "" },
16+
{ NULL } /* Sentinel */
17+
};
18+
19+
static PyObject *ue_PyFModifierKeysState_str(ue_PyFModifierKeysState *self)
20+
{
21+
return PyUnicode_FromFormat("<unreal_engine.FModifierKeysState %p>", self);
22+
}
23+
24+
static PyTypeObject ue_PyFModifierKeysStateType = {
25+
PyVarObject_HEAD_INIT(NULL, 0)
26+
"unreal_engine.FModifierKeysState", /* tp_name */
27+
sizeof(ue_PyFModifierKeysState), /* tp_basicsize */
28+
0, /* tp_itemsize */
29+
0, /* tp_dealloc */
30+
0, /* tp_print */
31+
0, /* tp_getattr */
32+
0, /* tp_setattr */
33+
0, /* tp_reserved */
34+
0, /* tp_repr */
35+
0, /* tp_as_number */
36+
0, /* tp_as_sequence */
37+
0, /* tp_as_mapping */
38+
0, /* tp_hash */
39+
0, /* tp_call */
40+
(reprfunc)ue_PyFModifierKeysState_str, /* tp_str */
41+
0, /* tp_getattro */
42+
0, /* tp_setattro */
43+
0, /* tp_as_buffer */
44+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
45+
"Unreal Engine FModifierKeysState", /* tp_doc */
46+
0, /* tp_traverse */
47+
0, /* tp_clear */
48+
0, /* tp_richcompare */
49+
0, /* tp_weaklistoffset */
50+
0, /* tp_iter */
51+
0, /* tp_iternext */
52+
ue_PyFModifierKeysState_methods, /* tp_methods */
53+
};
54+
55+
static int ue_py_fmodifier_keys_state_init(ue_PyFModifierKeysState *self, PyObject *args, PyObject *kwargs)
56+
{
57+
static char *kw_names[] = {
58+
(char *)"left_shift_down",
59+
(char *)"right_shift_down",
60+
(char *)"left_control_down",
61+
(char *)"right_control_down",
62+
(char *)"left_alt_down",
63+
(char *)"right_alt_down",
64+
(char *)"left_command_down",
65+
(char *)"right_command_down",
66+
(char *)"are_caps_locked",
67+
NULL };
68+
69+
PyObject *py_left_shift_down = nullptr;
70+
PyObject *py_right_shift_down = nullptr;
71+
PyObject *py_left_control_down = nullptr;
72+
PyObject *py_right_control_down = nullptr;
73+
PyObject *py_left_alt_down = nullptr;
74+
PyObject *py_right_alt_down = nullptr;
75+
PyObject *py_left_command_down = nullptr;
76+
PyObject *py_right_command_down = nullptr;
77+
PyObject *py_are_capse_locked = nullptr;
78+
79+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOOOOOOOO", kw_names,
80+
&py_left_shift_down,
81+
&py_right_shift_down,
82+
&py_left_control_down,
83+
&py_right_control_down,
84+
&py_left_alt_down,
85+
&py_right_alt_down,
86+
&py_left_command_down,
87+
&py_right_command_down,
88+
&py_are_capse_locked))
89+
{
90+
return -1;
91+
}
92+
93+
bool bInIsLeftShiftDown = (py_left_shift_down && PyObject_IsTrue(py_left_shift_down));
94+
bool bInIsRightShiftDown = (py_right_shift_down && PyObject_IsTrue(py_right_shift_down));
95+
bool bInIsLeftControlDown = (py_left_control_down && PyObject_IsTrue(py_left_control_down));
96+
bool bInIsRightControlDown = (py_right_control_down && PyObject_IsTrue(py_right_control_down));
97+
bool bInIsLeftAltDown = (py_left_alt_down && PyObject_IsTrue(py_left_alt_down));
98+
bool bInIsRightAltDown = (py_right_alt_down && PyObject_IsTrue(py_right_alt_down));
99+
bool bInIsLeftCommandDown = (py_left_command_down && PyObject_IsTrue(py_left_command_down));
100+
bool bInIsRightCommandDown = (py_right_command_down && PyObject_IsTrue(py_right_command_down));
101+
bool bInAreCapsLocked = (py_are_capse_locked && PyObject_IsTrue(py_are_capse_locked));
102+
103+
new(&self->modifier) FModifierKeysState(
104+
bInIsLeftShiftDown,
105+
bInIsRightShiftDown,
106+
bInIsLeftControlDown,
107+
bInIsRightControlDown,
108+
bInIsLeftAltDown,
109+
bInIsRightAltDown,
110+
bInIsLeftCommandDown,
111+
bInIsRightCommandDown,
112+
bInAreCapsLocked);
113+
114+
return 0;
115+
}
116+
117+
void ue_python_init_fmodifier_keys_state(PyObject *ue_module)
118+
{
119+
120+
ue_PyFModifierKeysStateType.tp_init = (initproc)ue_py_fmodifier_keys_state_init;
121+
122+
if (PyType_Ready(&ue_PyFModifierKeysStateType) < 0)
123+
return;
124+
125+
Py_INCREF(&ue_PyFModifierKeysStateType);
126+
PyModule_AddObject(ue_module, "FModifierKeysState", (PyObject *)&ue_PyFModifierKeysStateType);
127+
}
128+
129+
PyObject *py_ue_new_fmodifier_keys_state(FModifierKeysState modifier)
130+
{
131+
ue_PyFModifierKeysState *ret = (ue_PyFModifierKeysState *)PyObject_New(ue_PyFModifierKeysState, &ue_PyFModifierKeysStateType);
132+
new(&ret->modifier) FModifierKeysState(modifier);
133+
return (PyObject *)ret;
134+
}
135+
136+
ue_PyFModifierKeysState *py_ue_is_fmodifier_keys_state(PyObject *obj)
137+
{
138+
if (!PyObject_IsInstance(obj, (PyObject *)&ue_PyFModifierKeysStateType))
139+
return nullptr;
140+
return (ue_PyFModifierKeysState *)obj;
141+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#pragma once
2+
3+
#include "UnrealEnginePython.h"
4+
5+
typedef struct
6+
{
7+
PyObject_HEAD
8+
/* Type-specific fields go here. */
9+
FModifierKeysState modifier;
10+
} ue_PyFModifierKeysState;
11+
12+
void ue_python_init_fmodifier_keys_state(PyObject *);
13+
14+
PyObject *py_ue_new_fmodifier_keys_state(FModifierKeysState);
15+
ue_PyFModifierKeysState *py_ue_is_fmodifier_keys_state(PyObject *);

Source/UnrealEnginePython/Private/Slate/UEPyFPointerEvent.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,61 @@ static PyTypeObject ue_PyFPointerEventType = {
7878
ue_PyFPointerEvent_methods, /* tp_methods */
7979
};
8080

81+
static int ue_py_fpointer_event_init(ue_PyFPointerEvent *self, PyObject *args, PyObject *kwargs)
82+
{
83+
int pointer_index;
84+
float ssp_x;
85+
float ssp_y;
86+
float lssp_x;
87+
float lssp_y;
88+
char *effecting;
89+
float wheel_delta;
90+
PyObject *py_modifier = nullptr;
91+
92+
if (!PyArg_ParseTuple(args, "i(ff)(ff)s|fO",
93+
&pointer_index,
94+
&ssp_x,
95+
&ssp_y,
96+
&lssp_x,
97+
&lssp_y,
98+
&effecting,
99+
&wheel_delta,
100+
&py_modifier))
101+
{
102+
return -1;
103+
}
104+
105+
TSet<FKey> keys;
106+
107+
FModifierKeysState modifier;
108+
if (py_modifier)
109+
{
110+
ue_PyFModifierKeysState *f_modifier = py_ue_is_fmodifier_keys_state(py_modifier);
111+
if (!f_modifier)
112+
{
113+
PyErr_SetString(PyExc_Exception, "argument is not a FModifierKeysState");
114+
return -1;
115+
}
116+
modifier = f_modifier->modifier;
117+
}
118+
119+
FPointerEvent Event(pointer_index,
120+
FVector2D(ssp_x, ssp_y),
121+
FVector2D(lssp_x, lssp_y),
122+
keys,
123+
FKey(effecting), wheel_delta, modifier);
124+
125+
new(&self->pointer) FPointerEvent(Event);
126+
new(&self->f_input.input) FInputEvent(Event);
127+
128+
return 0;
129+
}
130+
81131
void ue_python_init_fpointer_event(PyObject *ue_module)
82132
{
83133

84134
ue_PyFPointerEventType.tp_base = &ue_PyFInputEventType;
135+
ue_PyFPointerEventType.tp_init = (initproc)ue_py_fpointer_event_init;
85136

86137
if (PyType_Ready(&ue_PyFPointerEventType) < 0)
87138
return;

Source/UnrealEnginePython/Private/Slate/UEPySWidget.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,11 @@ static PyObject *py_ue_swidget_get_type(ue_PySWidget *self, PyObject * args)
242242
return PyUnicode_FromString(TCHAR_TO_UTF8(*(self->s_widget->GetTypeAsString())));
243243
}
244244

245+
static PyObject *py_ue_swidget_get_cached_geometry(ue_PySWidget *self, PyObject * args)
246+
{
247+
return py_ue_new_fgeometry(self->s_widget->GetCachedGeometry());
248+
}
249+
245250
static PyObject *py_ue_swidget_get_shared_reference_count(ue_PySWidget *self, PyObject * args)
246251
{
247252
return PyLong_FromLong(self->s_widget.GetSharedReferenceCount());
@@ -289,8 +294,40 @@ static PyObject *py_ue_swidget_on_mouse_button_down(ue_PySWidget *self, PyObject
289294
Py_RETURN_FALSE;
290295
}
291296

297+
static PyObject *py_ue_swidget_on_mouse_button_up(ue_PySWidget *self, PyObject * args)
298+
{
299+
PyObject *py_geometry;
300+
PyObject *py_pointer_event;
301+
if (!PyArg_ParseTuple(args, "OO:on_mouse_button_up", &py_geometry, &py_pointer_event))
302+
{
303+
return nullptr;
304+
}
305+
306+
ue_PyFGeometry *geometry = py_ue_is_fgeometry(py_geometry);
307+
if (!geometry)
308+
{
309+
return PyErr_Format(PyExc_Exception, "argument is not a FGeomtry");
310+
}
311+
312+
ue_PyFPointerEvent *pointer = py_ue_is_fpointer_event(py_pointer_event);
313+
if (!pointer)
314+
{
315+
return PyErr_Format(PyExc_Exception, "argument is not a FPointerEvent");
316+
}
317+
318+
FReply reply = self->s_widget->OnMouseButtonUp(geometry->geometry, pointer->pointer);
319+
320+
if (reply.IsEventHandled())
321+
{
322+
Py_RETURN_TRUE;
323+
}
324+
325+
Py_RETURN_FALSE;
326+
}
327+
292328
static PyMethodDef ue_PySWidget_methods[] = {
293329
{ "get_shared_reference_count", (PyCFunction)py_ue_swidget_get_shared_reference_count, METH_VARARGS, "" },
330+
{ "get_cached_geometry", (PyCFunction)py_ue_swidget_get_cached_geometry, METH_VARARGS, "" },
294331
{ "get_children", (PyCFunction)py_ue_swidget_get_children, METH_VARARGS, "" },
295332
{ "get_type", (PyCFunction)py_ue_swidget_get_type, METH_VARARGS, "" },
296333
{ "set_tooltip_text", (PyCFunction)py_ue_swidget_set_tooltip_text, METH_VARARGS, "" },
@@ -307,6 +344,7 @@ static PyMethodDef ue_PySWidget_methods[] = {
307344
{ "bind_on_mouse_move", (PyCFunction)py_ue_swidget_bind_on_mouse_move, METH_VARARGS, "" },
308345
#endif
309346
{ "on_mouse_button_down", (PyCFunction)py_ue_swidget_on_mouse_button_down, METH_VARARGS, "" },
347+
{ "on_mouse_button_up", (PyCFunction)py_ue_swidget_on_mouse_button_up, METH_VARARGS, "" },
310348
{ NULL } /* Sentinel */
311349
};
312350

Source/UnrealEnginePython/Private/Slate/UEPySlate.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,7 @@ void ue_python_init_slate(PyObject *module)
870870
ue_python_init_fpointer_event(module);
871871
ue_python_init_fkey_event(module);
872872
ue_python_init_fcharacter_event(module);
873+
ue_python_init_fmodifier_keys_state(module);
873874
ue_python_init_eslate_enums(module);
874875
}
875876

Source/UnrealEnginePython/Private/Slate/UEPySlate.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
#include "UEPyFPointerEvent.h"
7575
#include "UEPyFKeyEvent.h"
7676
#include "UEPyFCharacterEvent.h"
77+
#include "UEPyFModifierKeysState.h"
7778

7879
#if WITH_EDITOR
7980
#include "UEPySEditorViewport.h"

0 commit comments

Comments
 (0)