Skip to content

Commit 063a466

Browse files
author
Roberto De Ioris
committed
added key event support for slate
1 parent 25acd00 commit 063a466

6 files changed

Lines changed: 145 additions & 0 deletions

File tree

‎Source/UnrealEnginePython/Private/PyUserWidget.cpp‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,56 @@ FReply UPyUserWidget::NativeOnMouseButtonUp(const FGeometry & InGeometry, const
165165
return FReply::Unhandled();
166166
}
167167

168+
FReply UPyUserWidget::NativeOnKeyUp(const FGeometry & InGeometry, const FKeyEvent & InKeyEvent)
169+
{
170+
Super::NativeOnKeyUp(InGeometry, InKeyEvent);
171+
172+
if (!py_user_widget_instance)
173+
return FReply::Unhandled();
174+
175+
FScopePythonGIL gil;
176+
177+
if (!PyObject_HasAttrString(py_user_widget_instance, (char *)"on_key_up"))
178+
return FReply::Unhandled();
179+
180+
PyObject *ret = PyObject_CallMethod(py_user_widget_instance, (char *)"on_key_up", (char *)"OO", py_ue_new_fgeometry(InGeometry), py_ue_new_fkey_event(InKeyEvent));
181+
if (!ret) {
182+
unreal_engine_py_log_error();
183+
return FReply::Unhandled();
184+
}
185+
if (PyObject_IsTrue(ret)) {
186+
Py_DECREF(ret);
187+
return FReply::Handled();
188+
}
189+
Py_DECREF(ret);
190+
return FReply::Unhandled();
191+
}
192+
193+
FReply UPyUserWidget::NativeOnKeyDown(const FGeometry & InGeometry, const FKeyEvent & InKeyEvent)
194+
{
195+
Super::NativeOnKeyDown(InGeometry, InKeyEvent);
196+
197+
if (!py_user_widget_instance)
198+
return FReply::Unhandled();
199+
200+
FScopePythonGIL gil;
201+
202+
if (!PyObject_HasAttrString(py_user_widget_instance, (char *)"on_key_down"))
203+
return FReply::Unhandled();
204+
205+
PyObject *ret = PyObject_CallMethod(py_user_widget_instance, (char *)"on_key_down", (char *)"OO", py_ue_new_fgeometry(InGeometry), py_ue_new_fkey_event(InKeyEvent));
206+
if (!ret) {
207+
unreal_engine_py_log_error();
208+
return FReply::Unhandled();
209+
}
210+
if (PyObject_IsTrue(ret)) {
211+
Py_DECREF(ret);
212+
return FReply::Handled();
213+
}
214+
Py_DECREF(ret);
215+
return FReply::Unhandled();
216+
}
217+
168218
FReply UPyUserWidget::NativeOnMouseWheel(const FGeometry & InGeometry, const FPointerEvent & InMouseEvent)
169219
{
170220
Super::NativeOnMouseWheel(InGeometry, InMouseEvent);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include "UnrealEnginePythonPrivatePCH.h"
2+
3+
#include "UEPyFKeyEvent.h"
4+
5+
static PyObject *py_ue_fkey_event_get_key(ue_PyFKeyEvent *self, PyObject * args) {
6+
FKey key = self->key_event.GetKey();
7+
return py_ue_new_uscriptstruct(FKey::StaticStruct(), (uint8*)&key);
8+
}
9+
10+
static PyObject *py_ue_fkey_event_get_key_name(ue_PyFKeyEvent *self, PyObject * args) {
11+
FKey key = self->key_event.GetKey();
12+
return PyUnicode_FromString(TCHAR_TO_UTF8(*key.ToString()));
13+
}
14+
15+
static PyMethodDef ue_PyFKeyEvent_methods[] = {
16+
{ "get_key", (PyCFunction)py_ue_fkey_event_get_key, METH_VARARGS, "" },
17+
{ "get_key_name", (PyCFunction)py_ue_fkey_event_get_key_name, METH_VARARGS, "" },
18+
{ NULL } /* Sentinel */
19+
};
20+
21+
static PyObject *ue_PyFKeyEvent_str(ue_PyFKeyEvent *self)
22+
{
23+
return PyUnicode_FromFormat("<unreal_engine.FKeyEvent '%s'>",
24+
TCHAR_TO_UTF8(*self->key_event.ToText().ToString()));
25+
}
26+
27+
static PyTypeObject ue_PyFKeyEventType = {
28+
PyVarObject_HEAD_INIT(NULL, 0)
29+
"unreal_engine.FKeyEvent", /* tp_name */
30+
sizeof(ue_PyFKeyEvent), /* tp_basicsize */
31+
0, /* tp_itemsize */
32+
0, /* tp_dealloc */
33+
0, /* tp_print */
34+
0, /* tp_getattr */
35+
0, /* tp_setattr */
36+
0, /* tp_reserved */
37+
0, /* tp_repr */
38+
0, /* tp_as_number */
39+
0, /* tp_as_sequence */
40+
0, /* tp_as_mapping */
41+
0, /* tp_hash */
42+
0, /* tp_call */
43+
(reprfunc)ue_PyFKeyEvent_str, /* tp_str */
44+
0, /* tp_getattro */
45+
0, /* tp_setattro */
46+
0, /* tp_as_buffer */
47+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
48+
"Unreal Engine FKeyEvent", /* tp_doc */
49+
0, /* tp_traverse */
50+
0, /* tp_clear */
51+
0, /* tp_richcompare */
52+
0, /* tp_weaklistoffset */
53+
0, /* tp_iter */
54+
0, /* tp_iternext */
55+
ue_PyFKeyEvent_methods, /* tp_methods */
56+
};
57+
58+
void ue_python_init_fkey_event(PyObject *ue_module) {
59+
60+
ue_PyFKeyEventType.tp_base = &ue_PyFInputEventType;
61+
62+
if (PyType_Ready(&ue_PyFKeyEventType) < 0)
63+
return;
64+
65+
Py_INCREF(&ue_PyFKeyEventType);
66+
PyModule_AddObject(ue_module, "FKeyEvent", (PyObject *)&ue_PyFKeyEventType);
67+
}
68+
69+
PyObject *py_ue_new_fkey_event(FKeyEvent key_event) {
70+
ue_PyFKeyEvent *ret = (ue_PyFKeyEvent *)PyObject_New(ue_PyFKeyEvent, &ue_PyFKeyEventType);
71+
new(&ret->key_event) FKeyEvent(key_event);
72+
new(&ret->f_input.input) FInputEvent(key_event);
73+
return (PyObject *)ret;
74+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include "UnrealEnginePython.h"
4+
5+
#include "UEPyFInputEvent.h"
6+
7+
extern PyTypeObject ue_PyFInputEventType;
8+
9+
typedef struct {
10+
/* Type-specific fields go here. */
11+
ue_PyFInputEvent f_input;
12+
FKeyEvent key_event;
13+
} ue_PyFKeyEvent;
14+
15+
void ue_python_init_fkey_event(PyObject *);
16+
17+
PyObject *py_ue_new_fkey_event(FKeyEvent);

‎Source/UnrealEnginePython/Private/Slate/UEPySlate.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,7 @@ void ue_python_init_slate(PyObject *module) {
658658

659659
ue_python_init_finput_event(module);
660660
ue_python_init_fpointer_event(module);
661+
ue_python_init_fkey_event(module);
661662
}
662663

663664
PyObject *ue_py_dict_get_item(PyObject *dict, const char *key) {

‎Source/UnrealEnginePython/Private/Slate/UEPySlate.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969

7070
#include "UEPyFInputEvent.h"
7171
#include "UEPyFPointerEvent.h"
72+
#include "UEPyFKeyEvent.h"
7273

7374
#if WITH_EDITOR
7475
#include "UEPySEditorViewport.h"

‎Source/UnrealEnginePython/Public/PyUserWidget.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class UPyUserWidget : public UUserWidget
2929
virtual FReply NativeOnMouseButtonUp(const FGeometry & InGeometry, const FPointerEvent & InMouseEvent) override;
3030
virtual FReply NativeOnMouseWheel(const FGeometry & InGeometry, const FPointerEvent & InMouseEvent) override;
3131
virtual FReply NativeOnMouseMove(const FGeometry & InGeometry, const FPointerEvent & InMouseEvent) override;
32+
virtual FReply NativeOnKeyUp(const FGeometry & InGeometry, const FKeyEvent & InKeyEvent) override;
33+
virtual FReply NativeOnKeyDown(const FGeometry & InGeometry, const FKeyEvent & InKeyEvent) override;
3234

3335
UPROPERTY(EditAnywhere, Category = "Python", BlueprintReadWrite, meta = (ExposeOnSpawn = true))
3436
FString PythonModule;

0 commit comments

Comments
 (0)