Skip to content

Commit 625d36a

Browse files
authored
Merge pull request #68 from MHFU-ModKit/studio/restore-maximized
Studio: no freeze when it opens maximized with a saved layout
2 parents a5013d3 + ce6b92c commit 625d36a

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

‎apps/studio/src/mhfu_studio/ui/window.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,12 @@ def __init__(self, studio: Studio, settings: QSettings | None = None) -> None:
243243
if not (isinstance(geo, QByteArray) and self.restoreGeometry(geo)):
244244
self.resize(1500, 940)
245245
studio.listen(self._schedule)
246+
# the layout before the maximize: Qt retries one restored into a hidden, maximized
247+
# window on every resize, and on macOS each retry resizes again, forever
248+
maximized = self.windowState() & Qt.WindowState.WindowMaximized
249+
self.setWindowState(self.windowState() & ~maximized)
246250
self.sync()
251+
self.setWindowState(self.windowState() | maximized)
247252

248253
# ---- docks ----------------------------------------------------------------------- #
249254

‎apps/studio/tests/ui/test_window.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,24 @@ def test_old_layouts_are_dropped(make_window: Make) -> None:
176176
assert again.dockWidgetArea(dock(again, "map/Items")) == LEFT
177177

178178

179+
def test_layout_restores_unmaximized(make_window: Make, monkeypatch: pytest.MonkeyPatch) -> None:
180+
"""A layout restored into a hidden, maximized window looped forever on macOS."""
181+
w = make_window()
182+
w.showMaximized()
183+
w.close()
184+
states: list[Qt.WindowState] = []
185+
restore = QMainWindow.restoreState
186+
187+
def spy(self: QMainWindow, state: Any, version: int = 0) -> bool:
188+
states.append(self.windowState())
189+
return restore(self, state, version)
190+
191+
monkeypatch.setattr(QMainWindow, "restoreState", spy)
192+
again = make_window(show=False)
193+
assert states and not any(s & Qt.WindowState.WindowMaximized for s in states)
194+
assert again.windowState() & Qt.WindowState.WindowMaximized
195+
196+
179197
def test_restore_places_new_docks(make_window: Make) -> None:
180198
make_window().close()
181199
w = make_window(Tabbed("map"), Tabbed("monster"))

0 commit comments

Comments
 (0)