Skip to content

Commit edf00f7

Browse files
authored
fix: Fix parent attribute to point to proper magicgui widget parent (#583)
* fix: fix parent * test: add one more
1 parent c578b61 commit edf00f7

File tree

4 files changed

+29
-5
lines changed

4 files changed

+29
-5
lines changed

src/magicgui/backends/_ipynb/widgets.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ def _mgui_set_enabled(self, enabled: bool):
5959

6060
def _mgui_get_parent(self):
6161
# TODO: how does ipywidgets handle this?
62-
return getattr(self._ipywidget, "parent", None)
62+
# return getattr(self._ipywidget, "parent", None)
63+
raise NotImplementedError(
64+
"parent not implemented for ipywidgets backend. Please open an issue"
65+
)
6366

6467
def _mgui_set_parent(self, widget):
6568
# TODO: how does ipywidgets handle this?

src/magicgui/backends/_qtpy/widgets.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
from magicgui.types import FileDialogMode
2828
from magicgui.widgets import Widget, protocols
29+
from magicgui.widgets._concrete import _LabeledWidget
2930

3031
if TYPE_CHECKING:
3132
import numpy
@@ -82,9 +83,18 @@ def _mgui_get_enabled(self) -> bool:
8283
def _mgui_set_enabled(self, enabled: bool) -> None:
8384
self._qwidget.setEnabled(enabled)
8485

85-
# TODO: this used to return _magic_widget ... figure out what we should be returning
86-
def _mgui_get_parent(self) -> QObject | None: # type: ignore
87-
return self._qwidget.parent()
86+
def _mgui_get_parent(self) -> Widget | None:
87+
par = self._qwidget.parent()
88+
# FIXME: This whole thing is hacky.
89+
while par is not None:
90+
mgui_wdg = getattr(par, "_magic_widget", None)
91+
# the labeled widget itself should be considered a "hidden" layer.
92+
if isinstance(mgui_wdg, Widget) and not isinstance(
93+
mgui_wdg, _LabeledWidget
94+
):
95+
return mgui_wdg
96+
par = par.parent()
97+
return None
8898

8999
def _mgui_set_parent(self, widget: Widget) -> None:
90100
self._qwidget.setParent(widget.native if widget else None)

tests/test_container.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,14 @@ def _on_clicked(self):
203203
...
204204

205205
assert isinstance(C(), widgets.Container)
206+
207+
208+
def test_parent():
209+
lbl = widgets.Label()
210+
inner = widgets.Container(widgets=[lbl])
211+
outer = widgets.Container()
212+
outer.append(inner)
213+
214+
assert lbl.parent is inner
215+
assert inner.parent is outer
216+
assert outer.parent is None

tests/test_widgets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ def test_basic_widget_attributes():
198198

199199
assert widget.parent is None
200200
container.append(widget)
201-
assert widget.parent is container.native
201+
assert widget.parent is container
202202
widget.parent = None
203203
assert widget.parent is None
204204
assert widget.label == "my name"

0 commit comments

Comments
 (0)