Skip to content

Commit d6ba222

Browse files
author
Roberto De Ioris
committed
fixed add_menu_extension()
1 parent 5ab2760 commit d6ba222

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

Source/UnrealEnginePython/Private/Slate/UEPySlate.cpp

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include "UnrealEnginePythonPrivatePCH.h"
44

55
#include "LevelEditor.h"
6+
#include "Runtime/Slate/Public/Framework/Commands/UICommandList.h"
7+
#include "Runtime/Slate/Public/Framework/Commands/UICommandInfo.h"
68

79
#include "UEPySlate.h"
810

@@ -93,8 +95,106 @@ PyObject *py_unreal_engine_get_editor_window(PyObject *self, PyObject *args) {
9395
if (!FGlobalTabmanager::Get()->GetRootWindow().IsValid()) {
9496
return PyErr_Format(PyExc_Exception, "no RootWindow found");
9597
}
96-
98+
9799
return (PyObject *)ue_py_get_swidget(FGlobalTabmanager::Get()->GetRootWindow());
98100
}
99101

102+
class FPythonSlateCommands : public TCommands<FPythonSlateCommands>
103+
{
104+
public:
105+
106+
FPythonSlateCommands()
107+
: TCommands<FPythonSlateCommands>(TEXT("UnrealEnginePython"), NSLOCTEXT("Contexts", "UnrealEnginePython", "UnrealEnginePython"), NAME_None, "EditorStyle")
108+
{
109+
UE_LOG(LogPython, Warning, TEXT("BULDING COMMAND"));
110+
111+
}
112+
113+
void Setup(char *command_name, PyObject *py_object) {
114+
py_callable = py_object;
115+
Py_INCREF(py_callable);
116+
117+
name = FString(command_name);
118+
}
119+
120+
// TCommands<> interface
121+
virtual void RegisterCommands() override {
122+
UE_LOG(LogPython, Warning, TEXT("REGISTERING COMMAND"));
123+
commands = MakeShareable(new FUICommandList);
124+
125+
extender = MakeShareable(new FExtender());
126+
127+
UI_COMMAND_Function(this, command, nullptr, *name, *name, TCHAR_TO_UTF8(*name), *name, *name, EUserInterfaceActionType::Button, FInputGesture());
128+
commands->MapAction(command, FExecuteAction::CreateRaw(this, &FPythonSlateCommands::Callback), FCanExecuteAction());
129+
130+
extender->AddMenuExtension("WindowLayout", EExtensionHook::After, commands, FMenuExtensionDelegate::CreateRaw(this, &FPythonSlateCommands::Builder));
131+
132+
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
133+
LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(extender);
134+
135+
CommandsChanged.Broadcast(*this);
136+
}
137+
138+
void Callback() {
139+
FScopePythonGIL gil;
140+
PyObject *ret = PyObject_CallObject(py_callable, nullptr);
141+
if (!ret) {
142+
unreal_engine_py_log_error();
143+
return;
144+
}
145+
Py_DECREF(ret);
146+
}
147+
148+
void Builder(FMenuBuilder &Builder) {
149+
UE_LOG(LogPython, Warning, TEXT("BULDING MENU %s"), *command->GetCommandName().ToString());
150+
Builder.AddMenuEntry(command);
151+
}
152+
153+
TSharedPtr<FExtender> GetExtender() {
154+
return extender;
155+
}
156+
157+
TSharedPtr<FUICommandList> GetCommands() {
158+
return commands;
159+
}
160+
private:
161+
TSharedPtr<FUICommandList> commands;
162+
TSharedPtr<FUICommandInfo> command;
163+
TSharedPtr<FExtender> extender;
164+
PyObject *py_callable;
165+
166+
FString name;
167+
};
168+
169+
PyObject *py_unreal_engine_add_menu_extension(PyObject * self, PyObject * args) {
170+
171+
char *command_name;
172+
PyObject *py_callable;
173+
int interface_type = EUserInterfaceActionType::Button;
174+
175+
char *menu_bar = nullptr;
176+
177+
if (!PyArg_ParseTuple(args, "sO|s:add_menu_extension", &command_name, &py_callable, &menu_bar)) {
178+
return NULL;
179+
}
180+
181+
UE_LOG(LogPython, Warning, TEXT("STARTIIIING !!!"));
182+
183+
if (!PyCallable_Check(py_callable))
184+
return PyErr_Format(PyExc_Exception, "argument is not callable");
185+
186+
187+
188+
TSharedRef<FPythonSlateCommands> commands = MakeShareable(new FPythonSlateCommands());
189+
190+
commands->Setup(command_name, py_callable);
191+
192+
commands->RegisterCommands();
193+
194+
UE_LOG(LogPython, Warning, TEXT("EXTENSION ADDED"));
195+
196+
Py_INCREF(Py_None);
197+
return Py_None;
198+
}
199+
100200
#endif

Source/UnrealEnginePython/Private/Slate/UEPySlate.h

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

3232

3333
PyObject *py_unreal_engine_get_editor_window(PyObject *, PyObject *);
34+
PyObject *py_unreal_engine_add_menu_extension(PyObject *, PyObject *);
3435

3536
template<typename T> TSharedRef<T> ue_py_init_swidget(ue_PySWidget *py_swidget) {
3637
TSharedRef<T> new_swidget = TSharedRef<T>(SNew(T));

Source/UnrealEnginePython/Private/UEPyModule.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ static PyMethodDef unreal_engine_methods[] = {
149149

150150
// slate
151151
{ "get_editor_window", py_unreal_engine_get_editor_window, METH_VARARGS, "" },
152+
{ "add_menu_extension", py_unreal_engine_add_menu_extension, METH_VARARGS, "" },
152153

153154
{ "open_editor_for_asset", py_unreal_engine_open_editor_for_asset, METH_VARARGS, "" },
154155
{ "close_editor_for_asset", py_unreal_engine_close_editor_for_asset, METH_VARARGS, "" },

0 commit comments

Comments
 (0)