From 8c74919a8b482eddba8d18cf8adcc43529a11d78 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 23 Jan 2024 14:51:44 +0100 Subject: [PATCH] dgui: Make copy of mutable default value Fixes #1587 --- direct/src/gui/DirectGuiBase.py | 7 ++++++- tests/gui/test_DirectButton.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/direct/src/gui/DirectGuiBase.py b/direct/src/gui/DirectGuiBase.py index fecfea608a..b7f35ac3af 100644 --- a/direct/src/gui/DirectGuiBase.py +++ b/direct/src/gui/DirectGuiBase.py @@ -224,7 +224,12 @@ class DirectGuiBase(DirectObject.DirectObject): del keywords[name] else: # Use optionDefs value - optionInfo[name] = [default, default, function] + value = default + if isinstance(value, list): + value = list(value) + elif isinstance(value, dict): + value = dict(value) + optionInfo[name] = [default, value, function] elif optionInfo[name][FUNCTION] is None: # Only override function if not defined by derived class optionInfo[name][FUNCTION] = function diff --git a/tests/gui/test_DirectButton.py b/tests/gui/test_DirectButton.py index 6f85e72f59..d01455bae1 100644 --- a/tests/gui/test_DirectButton.py +++ b/tests/gui/test_DirectButton.py @@ -1,6 +1,21 @@ from direct.gui.DirectButton import DirectButton +def test_button_default_extraArgs(): + btn = DirectButton() + + assert btn.configure('extraArgs') == ('extraArgs', [], []) + assert btn._optionInfo['extraArgs'] == [[], [], None] + + # Changing will not affect default value + btn['extraArgs'].append(1) + assert btn.configure('extraArgs') == ('extraArgs', [], [1]) + + # Changing this does + btn.configure('extraArgs')[1].append(2) + assert btn.configure('extraArgs') == ('extraArgs', [2], [1]) + + def test_button_destroy(): btn = DirectButton(text="Test") btn.destroy()