added automatic property widgets, fixed arrayproperty in subclassing … · SIRHAMY/UnrealEnginePython@2e85560 · GitHub
Skip to content

Commit 2e85560

Browse files
author
Roberto De Ioris
committed
added automatic property widgets, fixed arrayproperty in subclassing advanced api
1 parent 0955dd0 commit 2e85560

5 files changed

Lines changed: 138 additions & 9 deletions

File tree

Source/UnrealEnginePython/Private/Slate/UEPySWindow.cpp

Lines changed: 36 additions & 2 deletions

Source/UnrealEnginePython/Private/Slate/UEPySlate.cpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include "Editor/Persona/Public/PersonaModule.h"
88
#include "Editor/AnimationEditor/Public/IAnimationEditorModule.h"
99
#include "Editor/StaticMeshEditor/Public/StaticMeshEditorModule.h"
10+
#include "Editor/PropertyEditor/Public/PropertyEditorModule.h"
11+
#include "Editor/PropertyEditor/Public/ISinglePropertyView.h"
1012
#endif
1113

1214
#include "Runtime/Slate/Public/Framework/Commands/UICommandList.h"
@@ -194,6 +196,8 @@ TSharedPtr<SWidget> UPythonSlateDelegate::OnGetAssetContextMenu(const TArray<FAs
194196
Py_DECREF(ret);
195197
return value;
196198
}
199+
200+
197201
#endif
198202

199203
TSharedRef<SWidget> UPythonSlateDelegate::OnGenerateWidget(TSharedPtr<FPythonItem> py_item) {
@@ -699,6 +703,73 @@ class FPythonSlateCommands : public TCommands<FPythonSlateCommands>
699703
};
700704

701705
#if WITH_EDITOR
706+
707+
PyObject *py_unreal_engine_create_detail_view(PyObject *self, PyObject * args, PyObject *kwargs) {
708+
709+
PyObject *py_object;
710+
PyObject *py_allow_search = nullptr;
711+
712+
char *kwlist[] = {
713+
(char *)"uobject",
714+
(char *)"allow_search",
715+
nullptr };
716+
717+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O:create_detail_view", kwlist,
718+
&py_object, &py_allow_search)) {
719+
return nullptr;
720+
}
721+
722+
UObject *u_object = ue_py_check_type<UObject>(py_object);
723+
if (!u_object) {
724+
return PyErr_Format(PyExc_Exception, "argument is not a UObject");
725+
}
726+
727+
FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
728+
FDetailsViewArgs view_args;
729+
view_args.bAllowSearch = (py_allow_search && PyObject_IsTrue(py_allow_search));
730+
731+
TSharedPtr<IDetailsView> view = PropertyEditorModule.CreateDetailView(view_args);
732+
view->SetObject(u_object);
733+
734+
return (PyObject *)py_ue_new_swidget<ue_PySWidget>(view->AsShared(), &ue_PySWidgetType);
735+
}
736+
737+
PyObject *py_unreal_engine_create_property_view(PyObject *self, PyObject * args, PyObject *kwargs) {
738+
739+
PyObject *py_object;
740+
char *name;
741+
char *name_override = nullptr;
742+
743+
char *kwlist[] = {
744+
(char*)"uobject",
745+
(char *)"name",
746+
(char *)"name_override",
747+
nullptr };
748+
749+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Os|s:create_property_view", kwlist,
750+
&py_object, &name, &name_override)) {
751+
return nullptr;
752+
}
753+
754+
UObject *u_object = ue_py_check_type<UObject>(py_object);
755+
if (!u_object) {
756+
return PyErr_Format(PyExc_Exception, "argument is not a UObject");
757+
}
758+
759+
FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
760+
FSinglePropertyParams params;
761+
if (name_override)
762+
params.NameOverride = FText::FromString(UTF8_TO_TCHAR(name_override));
763+
764+
auto view_widget = PropertyEditorModule.CreateSingleProperty(u_object, FName(name), params);
765+
766+
if (!view_widget.IsValid())
767+
return PyErr_Format(PyExc_Exception, "unable to create SingleProperty widget");
768+
769+
return (PyObject *)py_ue_new_swidget<ue_PySWidget>(view_widget->AsShared(), &ue_PySWidgetType);
770+
}
771+
772+
702773
PyObject *py_unreal_engine_add_menu_extension(PyObject * self, PyObject * args) {
703774

704775
char *command_name;

Source/UnrealEnginePython/Private/Slate/UEPySlate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ PyObject *py_unreal_engine_get_editor_window(PyObject *, PyObject *);
8787
PyObject *py_unreal_engine_add_menu_extension(PyObject *, PyObject *);
8888
PyObject *py_unreal_engine_add_menu_bar_extension(PyObject *, PyObject *);
8989
PyObject *py_unreal_engine_add_tool_bar_extension(PyObject *, PyObject *);
90+
PyObject *py_unreal_engine_create_detail_view(PyObject *, PyObject *, PyObject *);
91+
PyObject *py_unreal_engine_create_property_view(PyObject *, PyObject *, PyObject *);
9092
#endif
9193

9294
PyObject *py_unreal_engine_invoke_tab(PyObject *, PyObject *);

Source/UnrealEnginePython/Private/UEPyModule.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ static PyMethodDef unreal_engine_methods[] = {
176176
{ "add_menu_bar_extension", py_unreal_engine_add_menu_bar_extension, METH_VARARGS, "" },
177177
{ "add_tool_bar_extension", py_unreal_engine_add_tool_bar_extension, METH_VARARGS, "" },
178178

179+
#pragma warning(suppress: 4191)
180+
{ "create_detail_view", (PyCFunction)py_unreal_engine_create_detail_view, METH_VARARGS | METH_KEYWORDS, "" },
181+
#pragma warning(suppress: 4191)
182+
{ "create_property_view", (PyCFunction)py_unreal_engine_create_property_view, METH_VARARGS | METH_KEYWORDS, "" },
183+
179184
{ "open_editor_for_asset", py_unreal_engine_open_editor_for_asset, METH_VARARGS, "" },
180185
{ "close_editor_for_asset", py_unreal_engine_close_editor_for_asset, METH_VARARGS, "" },
181186
{ "close_all_asset_editors", py_unreal_engine_close_all_asset_editors, METH_VARARGS, "" },
@@ -1162,7 +1167,7 @@ static int unreal_engine_py_init(ue_PyUObject *self, PyObject *args, PyObject *k
11621167
if (PyList_Size(value) == 1) {
11631168
PyObject *first_item = PyList_GetItem(value, 0);
11641169
if (ue_is_pyuobject(first_item)) {
1165-
ue_PyUObject *py_obj = (ue_PyUObject *)value;
1170+
ue_PyUObject *py_obj = (ue_PyUObject *)first_item;
11661171
if (py_obj->ue_object->IsA<UClass>()) {
11671172
UClass *p_class = (UClass *)py_obj->ue_object;
11681173
if (p_class->IsChildOf<UProperty>()) {
@@ -1172,6 +1177,13 @@ static int unreal_engine_py_init(ue_PyUObject *self, PyObject *args, PyObject *k
11721177
}
11731178
prop_added = true;
11741179
}
1180+
else {
1181+
if (!py_ue_add_property(self, Py_BuildValue("([O]sO)", (PyObject *)ue_get_python_wrapper(UObjectProperty::StaticClass()), class_key, first_item))) {
1182+
unreal_engine_py_log_error();
1183+
return -1;
1184+
}
1185+
prop_added = true;
1186+
}
11751187
}
11761188
}
11771189
}
@@ -1535,7 +1547,7 @@ void unreal_engine_py_log_error() {
15351547
}
15361548

15371549
PyErr_Clear();
1538-
}
1550+
}
15391551

15401552
// retrieve a UWorld from a generic UObject (if possible)
15411553
UWorld *ue_get_uworld(ue_PyUObject *py_obj) {

Source/UnrealEnginePython/Private/UObject/UEPyObject.cpp

Lines changed: 15 additions & 5 deletions

0 commit comments

Comments
 (0)