Skip to content

Commit eec8426

Browse files
Add self-removal from WidgetManager in generated destructor
When app exits with a generated widget still in WidgetManager (e.g., user closes window directly), LawnApp's destructor only cleans up known member widgets (mGameSelector, mBoard, etc.). Unknown generated widgets remain in WidgetManager's mWidgets list. When delete mWidgetManager runs, ~WidgetContainer() asserts mWidgets.empty(). Fix: add mWidgetManager->RemoveWidget(this) in generated destructor so the widget removes itself from the manager before base destruction. Combined with existing RemoveAllWidgets(false, false) and member variable deletion, this ensures clean teardown in all paths.
1 parent 6d6c596 commit eec8426

1 file changed

Lines changed: 3 additions & 0 deletions

File tree

core/code_generator.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,9 @@ def generate_cpp_for_interface(self, iface: Interface, project: Project) -> str:
285285
cpp += "}\n\n"
286286

287287
cpp += f"{s.class_name}::~{s.class_name}()\n{{\n"
288+
# If still attached to WidgetManager, remove self to prevent assertion in ~WidgetContainer()
289+
cpp += " if (mWidgetManager)\n"
290+
cpp += " mWidgetManager->RemoveWidget(this);\n"
288291
# Remove all child widgets from the container before deletion to satisfy WidgetContainer assertion
289292
cpp += " RemoveAllWidgets(false, false);\n"
290293
for wid in iface.widgets.values():

0 commit comments

Comments
 (0)