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
0 commit comments