Skip to content

Commit 029577a

Browse files
author
ikrima
committed
Synchronize to Changelist #3575
1 parent a6c14ee commit 029577a

17 files changed

+727
-185
lines changed

Source/PythonConsole/Private/PythonScriptFactory.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
UPythonScriptFactory::UPythonScriptFactory(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) {
77

8+
#if !WITH_KNL_PYEXT
89
Formats.Add(FString("py;Python Script"));
10+
#endif
911

1012
bCreateNew = false;
1113
bEditAfterNew = true;

Source/UnrealEnginePython/Private/ConsoleManager/UEPyIConsoleManager.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,68 @@ static PyObject *py_ue_iconsole_manager_register_variable_float(PyObject *cls, P
507507
Py_RETURN_NONE;
508508
}
509509

510+
void UPythonConsoleDelegate::OnConsoleCommand(const TArray < FString > & InArgs)
511+
{
512+
FScopePythonGIL gil;
513+
514+
PyObject *ret = nullptr;
515+
if (InArgs.Num() == 0)
516+
{
517+
ret = PyObject_CallFunction(py_callable, nullptr);
518+
}
519+
else
520+
{
521+
PyObject *py_args = PyTuple_New(InArgs.Num());
522+
for (int32 i = 0; i < InArgs.Num(); i++)
523+
{
524+
PyTuple_SetItem(py_args, i, PyUnicode_FromString(TCHAR_TO_UTF8(*InArgs[i])));
525+
}
526+
ret = PyObject_CallObject(py_callable, py_args);
527+
Py_DECREF(py_args);
528+
}
529+
if (!ret)
530+
{
531+
unreal_engine_py_log_error();
532+
return;
533+
}
534+
Py_DECREF(ret);
535+
}
536+
537+
static PyObject *py_ue_iconsole_manager_register_command(PyObject *cls, PyObject * args)
538+
{
539+
char *key;
540+
PyObject *py_callable;
541+
char *help = nullptr;
542+
if (!PyArg_ParseTuple(args, "sO|s:register_command", &key, &py_callable, &help))
543+
{
544+
return nullptr;
545+
}
546+
547+
if (!PyCallable_Check(py_callable))
548+
{
549+
return PyErr_Format(PyExc_Exception, "argument is not callable");
550+
}
551+
552+
IConsoleObject *c_object = IConsoleManager::Get().FindConsoleObject(UTF8_TO_TCHAR(key));
553+
if (c_object)
554+
{
555+
return PyErr_Format(PyExc_Exception, "console object \"%s\" already exists", key);
556+
}
557+
558+
UPythonConsoleDelegate *py_delegate = NewObject<UPythonConsoleDelegate>();
559+
py_delegate->SetPyCallable(py_callable);
560+
py_delegate->AddToRoot();
561+
FConsoleCommandWithArgsDelegate console_delegate;
562+
console_delegate.BindUObject(py_delegate, &UPythonConsoleDelegate::OnConsoleCommand);
563+
564+
if (!IConsoleManager::Get().RegisterConsoleCommand(UTF8_TO_TCHAR(key), help ? UTF8_TO_TCHAR(help) : UTF8_TO_TCHAR(key), console_delegate, 0))
565+
{
566+
return PyErr_Format(PyExc_Exception, "unable to register console command \"%s\"", key);
567+
}
568+
569+
Py_RETURN_NONE;
570+
}
571+
510572
static PyMethodDef ue_PyIConsoleManager_methods[] = {
511573
{ "get_history", (PyCFunction)py_ue_iconsole_manager_get_history, METH_VARARGS | METH_CLASS, "" },
512574
{ "add_history_entry", (PyCFunction)py_ue_iconsole_manager_add_history_entry, METH_VARARGS | METH_CLASS, "" },
@@ -533,6 +595,7 @@ static PyMethodDef ue_PyIConsoleManager_methods[] = {
533595
{ "register_variable_string", (PyCFunction)py_ue_iconsole_manager_register_variable_string, METH_VARARGS | METH_CLASS, "" },
534596
{ "register_variable_int", (PyCFunction)py_ue_iconsole_manager_register_variable_int, METH_VARARGS | METH_CLASS, "" },
535597
{ "register_variable_float", (PyCFunction)py_ue_iconsole_manager_register_variable_float, METH_VARARGS | METH_CLASS, "" },
598+
{ "register_command", (PyCFunction)py_ue_iconsole_manager_register_command, METH_VARARGS | METH_CLASS, "" },
536599
{ NULL } /* Sentinel */
537600
};
538601

Source/UnrealEnginePython/Private/ConsoleManager/UEPyIConsoleManager.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,21 @@
33
#include "UnrealEnginePython.h"
44

55
#include "Runtime/Core/Public/HAL/IConsoleManager.h"
6+
#include "UEPyIConsoleManager.generated.h"
67

78
typedef struct
89
{
910
PyObject_HEAD
1011
/* Type-specific fields go here. */
1112
} ue_PyIConsoleManager;
1213

14+
UCLASS()
15+
class UPythonConsoleDelegate : public UPythonDelegate
16+
{
17+
GENERATED_BODY()
18+
19+
public:
20+
void OnConsoleCommand(const TArray < FString > &InArgs);
21+
};
1322

1423
void ue_python_init_iconsole_manager(PyObject *);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#include "UnrealEnginePythonPrivatePCH.h"
2+
#include "PyNativeWidgetHost.h"
3+
4+
#include "UnrealEnginePython.h"
5+
6+
7+
8+
9+
UPyNativeWidgetHost::UPyNativeWidgetHost(const FObjectInitializer& ObjectInitializer)
10+
: Super(ObjectInitializer)
11+
{
12+
bIsVariable = true;
13+
}
14+
15+
#if WITH_EDITOR
16+
const FText UPyNativeWidgetHost::GetPaletteCategory()
17+
{
18+
return NSLOCTEXT("Python", "Python", "Python");
19+
}
20+
#endif

Source/UnrealEnginePython/Private/PyUserWidget.cpp

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
#include "UnrealEnginePythonPrivatePCH.h"
22
#include "PyUserWidget.h"
3+
#include "PyNativeWidgetHost.h"
34

45
#include "PythonDelegate.h"
56

67
#include "Slate/UEPyFGeometry.h"
78
#include "Slate/UEPyFPaintContext.h"
89

10+
#include "Widgets/Layout/SBox.h"
11+
#include "UMGStyle.h"
12+
#include "Runtime/UMG/Public/Blueprint/WidgetTree.h"
13+
914
void UPyUserWidget::NativeConstruct()
1015
{
1116
Super::NativeConstruct();
1217

18+
WidgetTree->ForEachWidget([&](UWidget* Widget) {
19+
if (Widget->IsA<UPyNativeWidgetHost>())
20+
{
21+
PyNativeWidgetHost = Cast<UPyNativeWidgetHost>(Widget);
22+
}
23+
});
24+
1325
if (PythonModule.IsEmpty())
1426
return;
1527

@@ -62,7 +74,7 @@ void UPyUserWidget::NativeConstruct()
6274

6375
if (PythonPaintForceDisabled)
6476
bCanEverPaint = false;
65-
77+
6678
if (!PyObject_HasAttrString(py_user_widget_instance, (char *)"construct"))
6779
return;
6880

@@ -215,6 +227,33 @@ FReply UPyUserWidget::NativeOnKeyDown(const FGeometry & InGeometry, const FKeyEv
215227
return FReply::Unhandled();
216228
}
217229

230+
#if WITH_EDITOR
231+
232+
const FText UPyUserWidget::GetPaletteCategory()
233+
{
234+
return NSLOCTEXT("Python", "Python", "Python");
235+
}
236+
#endif
237+
238+
void UPyUserWidget::SetSlateWidget(TSharedRef<SWidget> InContent)
239+
{
240+
if (PyNativeWidgetHost.IsValid())
241+
{
242+
PyNativeWidgetHost->SetContent(InContent);
243+
}
244+
}
245+
246+
247+
void UPyUserWidget::ReleaseSlateResources(bool bReleaseChildren)
248+
{
249+
Super::ReleaseSlateResources(bReleaseChildren);
250+
}
251+
252+
TSharedRef<SWidget> UPyUserWidget::RebuildWidget()
253+
{
254+
return Super::RebuildWidget();
255+
}
256+
218257
FReply UPyUserWidget::NativeOnMouseWheel(const FGeometry & InGeometry, const FPointerEvent & InMouseEvent)
219258
{
220259
Super::NativeOnMouseWheel(InGeometry, InMouseEvent);
@@ -308,6 +347,10 @@ void UPyUserWidget::NativePaint(FPaintContext & InContext) const
308347
Py_DECREF(ret);
309348
}
310349

350+
UPyUserWidget::UPyUserWidget(const FObjectInitializer& ObjectInitializer)
351+
: Super(ObjectInitializer)
352+
{}
353+
311354
UPyUserWidget::~UPyUserWidget()
312355
{
313356
FScopePythonGIL gil;

Source/UnrealEnginePython/Private/Slate/UEPySPythonTreeView.cpp

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,31 @@
88

99
#define sw_python_tree_view StaticCastSharedRef<SPythonTreeView>(self->s_tree_view.s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget)
1010

11+
static PyObject *py_ue_spython_tree_view_set_item_expansion(ue_PySPythonTreeView *self, PyObject * args)
12+
{
13+
PyObject *py_item;
14+
PyObject *py_bool;
15+
if (!PyArg_ParseTuple(args, "OO:set_item_expansion", &py_item, &py_bool))
16+
{
17+
return nullptr;
18+
}
19+
sw_python_tree_view->SetPythonItemExpansion(py_item, PyObject_IsTrue(py_bool) ? true : false);
20+
Py_RETURN_NONE;
21+
}
22+
23+
void SPythonTreeView::SetPythonItemExpansion(PyObject *item, bool InShouldExpandItem)
24+
{
25+
for (TSharedPtr<struct FPythonItem> PythonItem : *ItemsSource)
26+
{
27+
if (PythonItem->py_object == item)
28+
{
29+
SetItemExpansion(PythonItem, InShouldExpandItem);
30+
}
31+
}
32+
}
1133

1234
static PyMethodDef ue_PySPythonTreeView_methods[] = {
35+
{ "set_item_expansion", (PyCFunction)py_ue_spython_tree_view_set_item_expansion, METH_VARARGS, "" },
1336
{ NULL } /* Sentinel */
1437
};
1538

@@ -44,25 +67,29 @@ PyTypeObject ue_PySPythonTreeViewType = {
4467
ue_PySPythonTreeView_methods, /* tp_methods */
4568
};
4669

47-
static int ue_py_spython_tree_view_init(ue_PySPythonTreeView *self, PyObject *args, PyObject *kwargs) {
70+
static int ue_py_spython_tree_view_init(ue_PySPythonTreeView *self, PyObject *args, PyObject *kwargs)
71+
{
4872

4973
ue_py_slate_setup_farguments(SPythonTreeView);
5074

5175
// first of all check for values
5276
PyObject *values = ue_py_dict_get_item(kwargs, "tree_items_source");
53-
if (!values) {
77+
if (!values)
78+
{
5479
PyErr_SetString(PyExc_Exception, "you must specify tree items");
5580
return -1;
5681
}
5782

5883
values = PyObject_GetIter(values);
59-
if (!values) {
84+
if (!values)
85+
{
6086
PyErr_SetString(PyExc_Exception, "values field is not an iterable");
6187
return -1;
6288
}
6389

6490
TArray<TSharedPtr<FPythonItem>> *items = new TArray<TSharedPtr<FPythonItem>>();
65-
while (PyObject *item = PyIter_Next(values)) {
91+
while (PyObject *item = PyIter_Next(values))
92+
{
6693
Py_INCREF(item);
6794
// keep track of items
6895
self->s_tree_view.s_list_view.s_table_view_base.s_compound_widget.s_widget.py_refs.Add(item);
@@ -88,7 +115,8 @@ static int ue_py_spython_tree_view_init(ue_PySPythonTreeView *self, PyObject *ar
88115
return 0;
89116
}
90117

91-
void ue_python_init_spython_tree_view(PyObject *ue_module) {
118+
void ue_python_init_spython_tree_view(PyObject *ue_module)
119+
{
92120

93121
ue_PySPythonTreeViewType.tp_init = (initproc)ue_py_spython_tree_view_init;
94122

Source/UnrealEnginePython/Private/Slate/UEPySPythonTreeView.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@
66

77
extern PyTypeObject ue_PySPythonTreeViewType;
88

9-
class SPythonTreeView : public STreeView<TSharedPtr<struct FPythonItem>> {
9+
class SPythonTreeView : public STreeView<TSharedPtr<struct FPythonItem>>
10+
{
1011
public:
11-
~SPythonTreeView() {
12+
~SPythonTreeView()
13+
{
1214
delete(ItemsSource);
1315
}
16+
17+
void SetPythonItemExpansion(PyObject *item, bool InShouldExpandItem);
1418
};
1519

16-
typedef struct {
20+
typedef struct
21+
{
1722
ue_PySTreeView s_tree_view;
1823
/* Type-specific fields go here. */
1924
} ue_PySPythonTreeView;

Source/UnrealEnginePython/Private/Slate/UEPySTreeView.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,23 @@
33

44
#include "UEPySTreeView.h"
55

6+
#define sw_tree_view StaticCastSharedRef<STreeView<TSharedPtr<void>>>(self->s_list_view.s_table_view_base.s_compound_widget.s_widget.s_widget)
7+
8+
static PyObject *py_ue_stree_view_request_tree_refresh(ue_PySTreeView *self, PyObject * args)
9+
{
10+
sw_tree_view->RequestTreeRefresh();
11+
Py_RETURN_NONE;
12+
}
13+
14+
static PyObject *py_ue_stree_view_clear_expanded_items(ue_PySTreeView *self, PyObject * args)
15+
{
16+
sw_tree_view->ClearExpandedItems();
17+
Py_RETURN_NONE;
18+
}
619

720
static PyMethodDef ue_PySTreeView_methods[] = {
21+
{ "request_tree_refresh", (PyCFunction)py_ue_stree_view_request_tree_refresh, METH_VARARGS, "" },
22+
{ "clear_expanded_items", (PyCFunction)py_ue_stree_view_clear_expanded_items, METH_VARARGS, "" },
823
{ NULL } /* Sentinel */
924
};
1025

@@ -40,7 +55,8 @@ PyTypeObject ue_PySTreeViewType = {
4055
};
4156

4257

43-
void ue_python_init_stree_view(PyObject *ue_module) {
58+
void ue_python_init_stree_view(PyObject *ue_module)
59+
{
4460

4561
ue_PySTreeViewType.tp_base = &ue_PySListViewType;
4662

0 commit comments

Comments
 (0)