Skip to content

Commit 3589f03

Browse files
author
Roberto De Ioris
committed
fixed slate GC delegates
1 parent eefcf3d commit 3589f03

File tree

2 files changed

+33
-11
lines changed

2 files changed

+33
-11
lines changed

Source/UnrealEnginePython/Private/Slate/UEPySlate.h

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,17 @@ template<typename T> ue_PySWidget *py_ue_new_swidget(TSharedRef<SWidget> s_widge
136136
return ret;
137137
}
138138

139-
#define ue_py_snew_base(T, required, arguments) ((ue_PySWidget *)self)->Widget = TSharedRef<T>(MakeTDecl<T>(#T, __FILE__, __LINE__, required) <<= arguments);
139+
#define ue_py_snew_base(T, required, arguments) ((ue_PySWidget *)self)->Widget = TSharedRef<T>(MakeTDecl<T>(#T, __FILE__, __LINE__, required) <<= arguments);\
140+
for(TSharedRef<FPythonSlateDelegate> Delegate : DeferredSlateDelegates)\
141+
{\
142+
FUnrealEnginePythonHouseKeeper::Get()->TrackDeferredSlateDelegate(Delegate, ((ue_PySWidget *)self)->Widget);\
143+
}
140144

141-
#define ue_py_snew_simple(T) ue_py_snew_base(T, RequiredArgs::MakeRequiredArgs(), T::FArguments())
145+
#define ue_py_snew_simple(T) TArray<TSharedRef<FPythonSlateDelegate>> DeferredSlateDelegates;\
146+
ue_py_snew_base(T, RequiredArgs::MakeRequiredArgs(), T::FArguments())
142147

143-
#define ue_py_snew_simple_with_req_args(T, ... ) ue_py_snew_base(T, RequiredArgs::MakeRequiredArgs(__VA_ARGS__), T::FArguments())
148+
#define ue_py_snew_simple_with_req_args(T, ... ) TArray<TSharedRef<FPythonSlateDelegate>> DeferredSlateDelegates;\
149+
ue_py_snew_base(T, RequiredArgs::MakeRequiredArgs(__VA_ARGS__), T::FArguments())
144150

145151
#define ue_py_snew(T) ue_py_snew_base(T, RequiredArgs::MakeRequiredArgs(), arguments)
146152

@@ -155,9 +161,9 @@ ue_PySWidget *ue_py_get_swidget(TSharedRef<SWidget> s_widget);
155161
if (value) {\
156162
if (PyCalllable_Check_Extended(value)) {\
157163
_base handler;\
158-
ue_PySWidget *py_swidget = (ue_PySWidget *)self;\
159-
TSharedRef<FPythonSlateDelegate> py_delegate = FUnrealEnginePythonHouseKeeper::Get()->NewSlateDelegate(py_swidget->Widget, value);\
164+
TSharedRef<FPythonSlateDelegate> py_delegate = FUnrealEnginePythonHouseKeeper::Get()->NewDeferredSlateDelegate(value);\
160165
handler.Bind(py_delegate, &FPythonSlateDelegate::_func);\
166+
DeferredSlateDelegates.Add(py_delegate);\
161167
arguments._attribute(handler);\
162168
}
163169

@@ -167,9 +173,9 @@ ue_PySWidget *ue_py_get_swidget(TSharedRef<SWidget> s_widget);
167173
if (value) {\
168174
if (PyCalllable_Check_Extended(value)) {\
169175
_base handler;\
170-
ue_PySWidget *py_swidget = (ue_PySWidget *)self;\
171-
TSharedRef<FPythonSlateDelegate> py_delegate = FUnrealEnginePythonHouseKeeper::Get()->NewSlateDelegate(py_swidget->Widget, value);\
176+
TSharedRef<FPythonSlateDelegate> py_delegate = FUnrealEnginePythonHouseKeeper::Get()->NewDeferredSlateDelegate(value);\
172177
handler.BindSP(py_delegate, &FPythonSlateDelegate::_func);\
178+
DeferredSlateDelegates.Add(py_delegate);\
173179
arguments._attribute(handler);\
174180
}
175181

@@ -453,9 +459,10 @@ ue_PySWidget *ue_py_get_swidget(TSharedRef<SWidget> s_widget);
453459

454460

455461
#define ue_py_slate_setup_farguments(_type) _type::FArguments arguments;\
456-
ue_py_slate_farguments_bool("is_enabled", IsEnabled);\
457-
ue_py_slate_farguments_text("tool_tip_text", ToolTipText);\
458-
ue_py_slate_farguments_fvector2d("render_transform_pivot", RenderTransformPivot)
462+
TArray<TSharedRef<FPythonSlateDelegate>> DeferredSlateDelegates;\
463+
ue_py_slate_farguments_bool("is_enabled", IsEnabled); \
464+
ue_py_slate_farguments_text("tool_tip_text", ToolTipText); \
465+
ue_py_slate_farguments_fvector2d("render_transform_pivot", RenderTransformPivot)
459466

460467
#define ue_py_slate_farguments_required_slot(param) { PyObject *value = ue_py_dict_get_item(kwargs, param);\
461468
value = value ? value : PyTuple_GetItem(args, 0);\
@@ -470,6 +477,7 @@ ue_PySWidget *ue_py_get_swidget(TSharedRef<SWidget> s_widget);
470477
}
471478

472479
#define ue_py_slate_setup_hack_slot_args(_type, _swidget_ref) _type::FSlot &arguments = _swidget_ref->AddSlot();\
480+
TArray<TSharedRef<FPythonSlateDelegate>> DeferredSlateDelegates;\
473481
ue_py_slate_farguments_required_slot("widget");
474482

475483
void ue_python_init_slate(PyObject *);

Source/UnrealEnginePython/Public/PythonHouseKeeper.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ class FUnrealEnginePythonHouseKeeper
193193
FPythonSWidgetDelegateTracker &Tracker = PySlateDelegatesTracker[i];
194194
if (!Tracker.Owner.IsValid())
195195
{
196-
PyDelegatesTracker.RemoveAt(i);
196+
PySlateDelegatesTracker.RemoveAt(i);
197197
Garbaged++;
198198
}
199199

@@ -226,6 +226,20 @@ class FUnrealEnginePythonHouseKeeper
226226
return Delegate;
227227
}
228228

229+
TSharedRef<FPythonSlateDelegate> NewDeferredSlateDelegate(PyObject *PyCallable)
230+
{
231+
TSharedRef<FPythonSlateDelegate> Delegate = MakeShareable(new FPythonSlateDelegate());
232+
Delegate->SetPyCallable(PyCallable);
233+
234+
return Delegate;
235+
}
236+
237+
void TrackDeferredSlateDelegate(TSharedRef<FPythonSlateDelegate> Delegate, TSharedRef<SWidget> Owner)
238+
{
239+
FPythonSWidgetDelegateTracker Tracker(Delegate, Owner);
240+
PySlateDelegatesTracker.Add(Tracker);
241+
}
242+
229243
TSharedRef<FPythonSlateDelegate> NewStaticSlateDelegate(PyObject *PyCallable)
230244
{
231245
TSharedRef<FPythonSlateDelegate> Delegate = MakeShareable(new FPythonSlateDelegate());

0 commit comments

Comments
 (0)