Skip to content

Commit 588f187

Browse files
author
Roberto De Ioris
committed
added nomad tab spawner
1 parent c049f56 commit 588f187

File tree

6 files changed

+61
-39
lines changed

6 files changed

+61
-39
lines changed

Source/UnrealEnginePython/Private/Slate/UEPyFTabSpawnerEntry.cpp

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,21 @@ static PyObject *py_ue_ftab_spawner_entry_set_display_name(ue_PyFTabSpawnerEntry
1313
return (PyObject *)self;
1414
}
1515

16+
static PyObject *py_ue_ftab_spawner_entry_set_tooltip_text(ue_PyFTabSpawnerEntry *self, PyObject * args) {
17+
char *tooltip;
18+
if (!PyArg_ParseTuple(args, "s:set_tooltip_text", &tooltip))
19+
return NULL;
20+
21+
self->spawner_entry->SetTooltipText(FText::FromString(UTF8_TO_TCHAR(tooltip)));
22+
23+
Py_INCREF(self);
24+
return (PyObject *)self;
25+
}
26+
1627
static PyMethodDef ue_PyFTabSpawnerEntry_methods[] = {
1728
{ "set_display_name", (PyCFunction)py_ue_ftab_spawner_entry_set_display_name, METH_VARARGS, "" },
29+
{ "set_tooltip_text", (PyCFunction)py_ue_ftab_spawner_entry_set_tooltip_text, METH_VARARGS, "" },
1830
//{ "set_group", (PyCFunction)py_ue_ftab_spawner_entry_set_group, METH_VARARGS, "" },
19-
//{ "set_tooltip_text", (PyCFunction)py_ue_ftab_spawner_entry_set_tooltip_text, METH_VARARGS, "" },
2031
//{ "set_icon", (PyCFunction)py_ue_ftab_spawner_entry_set_icon, METH_VARARGS, "" },
2132
{ NULL } /* Sentinel */
2233
};
@@ -60,32 +71,9 @@ static PyTypeObject ue_PyFTabSpawnerEntryType = {
6071
};
6172

6273

63-
64-
65-
static int ue_py_ftab_spawner_entry_init(ue_PyFTabSpawnerEntry *self, PyObject *args, PyObject *kwargs) {
66-
char *name;
67-
PyObject *py_callable;
68-
if (!PyArg_ParseTuple(args, "sO", &name, &py_callable))
69-
return -1;
70-
71-
if (!PyCallable_Check(py_callable)) {
72-
PyErr_SetString(PyExc_ValueError, "argument is not callable");
73-
return -1;
74-
}
75-
76-
UPythonSlateDelegate *py_delegate = NewObject<UPythonSlateDelegate>();
77-
py_delegate->SetPyCallable(py_callable);
78-
py_delegate->AddToRoot();
79-
self->spawner_entry = &FGlobalTabmanager::Get()->RegisterNomadTabSpawner(UTF8_TO_TCHAR(name), FOnSpawnTab::CreateUObject(py_delegate, &UPythonSlateDelegate::SpawnPythonTab));
80-
81-
return 0;
82-
}
83-
8474
void ue_python_init_ftab_spawner_entry(PyObject *ue_module) {
8575
ue_PyFTabSpawnerEntryType.tp_new = PyType_GenericNew;
8676

87-
ue_PyFTabSpawnerEntryType.tp_init = (initproc)ue_py_ftab_spawner_entry_init;
88-
8977
if (PyType_Ready(&ue_PyFTabSpawnerEntryType) < 0)
9078
return;
9179

Source/UnrealEnginePython/Private/Slate/UEPyFTabSpawnerEntry.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,4 @@ PyObject *py_ue_new_ftab_spawner_entry(FTabSpawnerEntry *);
1616

1717
void ue_python_init_ftab_spawner_entry(PyObject *);
1818

19-
2019
#endif

Source/UnrealEnginePython/Private/Slate/UEPySDockTab.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ PyTypeObject ue_PySDockTabType = {
6565
};
6666

6767
static int ue_py_sdock_tab_init(ue_PySDockTab *self, PyObject *args, PyObject *kwargs) {
68-
ue_py_snew(SDockTab, s_border.s_compound_widget.s_widget);
68+
int tab_role;
69+
if (!PyArg_ParseTuple(args, "i", &tab_role))
70+
return -1;
71+
self->s_border.s_compound_widget.s_widget.s_widget_owned = SNew(SDockTab).TabRole((ETabRole)tab_role);
72+
self->s_border.s_compound_widget.s_widget.s_widget = &self->s_border.s_compound_widget.s_widget.s_widget_owned.Get();
6973
return 0;
7074
}
7175

Source/UnrealEnginePython/Private/Slate/UEPySlate.cpp

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "LevelEditor.h"
66
#include "Runtime/Slate/Public/Framework/Commands/UICommandList.h"
77
#include "Runtime/Slate/Public/Framework/Commands/UICommandInfo.h"
8+
#include "Runtime/Slate/Public/Framework/Docking/TabManager.h"
89

910
#include "UEPySlate.h"
1011

@@ -46,22 +47,22 @@ TSharedRef<SDockTab> UPythonSlateDelegate::SpawnPythonTab(const FSpawnTabArgs &a
4647
PyObject *ret = PyObject_CallFunction(py_callable, nullptr);
4748
if (!ret) {
4849
unreal_engine_py_log_error();
49-
return SNew(SDockTab);
50+
return SNew(SDockTab).TabRole(ETabRole::NomadTab);
5051
}
5152
ue_PySWidget *s_widget = py_ue_is_swidget(ret);
5253
if (!s_widget) {
5354
UE_LOG(LogPython, Error, TEXT("python callable did not return a SDockTab object"));
54-
return SNew(SDockTab);
55+
return SNew(SDockTab).TabRole(ETabRole::NomadTab);
5556
}
5657

57-
if (s_widget->s_widget_owned->GetType() == FName("SDockTab")) {
58+
if (s_widget->s_widget_owned->GetType() != FName("SDockTab")) {
5859
UE_LOG(LogPython, Error, TEXT("python callable did not return a SDockTab object"));
59-
return SNew(SDockTab);
60+
return SNew(SDockTab).TabRole(ETabRole::NomadTab);
6061
}
6162

6263
TSharedRef<SDockTab> dock_tab = StaticCastSharedRef<SDockTab>(s_widget->s_widget_owned);
63-
// dec'referencing it is useless (and maybe dangerous :P)
64-
//Py_DECREF(ret);
64+
// increase dock reference counting
65+
Py_INCREF(ret);
6566
return dock_tab;
6667
}
6768

@@ -203,29 +204,56 @@ PyObject *py_unreal_engine_add_menu_extension(PyObject * self, PyObject * args)
203204
return NULL;
204205
}
205206

206-
UE_LOG(LogPython, Warning, TEXT("STARTIIIING !!!"));
207-
208207
if (!PyCallable_Check(py_callable))
209208
return PyErr_Format(PyExc_Exception, "argument is not callable");
210209

211-
212-
213210
TSharedRef<FPythonSlateCommands> commands = MakeShareable(new FPythonSlateCommands());
214211

215212
commands->Setup(command_name, py_callable);
216213

217214
commands->RegisterCommands();
218215

219-
UE_LOG(LogPython, Warning, TEXT("EXTENSION ADDED"));
220-
221216
Py_INCREF(Py_None);
222217
return Py_None;
223218
}
224219

225220
PyObject *py_unreal_engine_register_nomad_tab_spawner(PyObject * self, PyObject * args) {
226221

222+
char *name;
223+
PyObject *py_callable;
224+
if (!PyArg_ParseTuple(args, "sO:register_nomad_tab_spawner", &name, &py_callable)) {
225+
return NULL;
226+
}
227+
228+
if (!PyCallable_Check(py_callable))
229+
return PyErr_Format(PyExc_Exception, "argument is not callable");
230+
231+
FOnSpawnTab spawn_tab;
232+
UPythonSlateDelegate *py_delegate = NewObject<UPythonSlateDelegate>();
233+
py_delegate->SetPyCallable(py_callable);
234+
py_delegate->AddToRoot();
235+
spawn_tab.BindUObject(py_delegate, &UPythonSlateDelegate::SpawnPythonTab);
236+
237+
UE_LOG(LogPython, Warning, TEXT("SPAWNING !!"));
238+
FTabSpawnerEntry *spawner_entry = &FGlobalTabmanager::Get()->RegisterNomadTabSpawner(UTF8_TO_TCHAR(name), spawn_tab);
239+
240+
PyObject *ret = py_ue_new_ftab_spawner_entry(spawner_entry);
241+
Py_INCREF(ret);
242+
return ret;
243+
}
244+
245+
PyObject *py_unreal_engine_unregister_nomad_tab_spawner(PyObject * self, PyObject * args) {
246+
247+
char *name;
248+
if (!PyArg_ParseTuple(args, "s:unregister_nomad_tab_spawner", &name)) {
249+
return NULL;
250+
}
251+
252+
FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(UTF8_TO_TCHAR(name));
253+
227254
Py_INCREF(Py_None);
228255
return Py_None;
229256
}
230257

258+
231259
#endif

Source/UnrealEnginePython/Private/Slate/UEPySlate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "UEPySEditorViewport.h"
2828
#include "UEPySPythonEditorViewport.h"
2929
#include "UEPySImage.h"
30+
#include "UEPySDockTab.h"
3031

3132
#include "UEPyFTabSpawnerEntry.h"
3233

@@ -36,6 +37,7 @@
3637
PyObject *py_unreal_engine_get_editor_window(PyObject *, PyObject *);
3738
PyObject *py_unreal_engine_add_menu_extension(PyObject *, PyObject *);
3839
PyObject *py_unreal_engine_register_nomad_tab_spawner(PyObject *, PyObject *);
40+
PyObject *py_unreal_engine_unregister_nomad_tab_spawner(PyObject *, PyObject *);
3941

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

Source/UnrealEnginePython/Private/UEPyModule.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ static PyMethodDef unreal_engine_methods[] = {
154154
// slate
155155
{ "get_editor_window", py_unreal_engine_get_editor_window, METH_VARARGS, "" },
156156
{ "add_menu_extension", py_unreal_engine_add_menu_extension, METH_VARARGS, "" },
157-
//{ "register_nomad_tab_spawner", py_unreal_engine_register_nomad_tab_spawner, METH_VARARGS, "" },
157+
{ "register_nomad_tab_spawner", py_unreal_engine_register_nomad_tab_spawner, METH_VARARGS, "" },
158+
{ "unregister_nomad_tab_spawner", py_unreal_engine_unregister_nomad_tab_spawner, METH_VARARGS, "" },
158159

159160

160161
{ "open_editor_for_asset", py_unreal_engine_open_editor_for_asset, METH_VARARGS, "" },

0 commit comments

Comments
 (0)