diff --git a/gui/wxpython/core/settings.py b/gui/wxpython/core/settings.py index 5f75a77ee54..e4c961607fb 100644 --- a/gui/wxpython/core/settings.py +++ b/gui/wxpython/core/settings.py @@ -143,6 +143,7 @@ def _defaultSettings(self): globalvar.MAP_WINDOW_SIZE[0], globalvar.MAP_WINDOW_SIZE[1], ), + "dimSingleWindow": "1,1,1,1", }, # workspace "workspace": { diff --git a/gui/wxpython/gui_core/preferences.py b/gui/wxpython/gui_core/preferences.py index 50c2c6f3334..2fbc1aefa04 100644 --- a/gui/wxpython/gui_core/preferences.py +++ b/gui/wxpython/gui_core/preferences.py @@ -1830,32 +1830,47 @@ def _updateSettings(self): # # update default window dimension # - if ( - self.settings.Get(group="general", key="defWindowPos", subkey="enabled") - is True - ): - dim = "" - # layer manager + windows_pos = self.settings.Get( + group="general", + key="defWindowPos", + subkey="enabled", + ) + single_window = self.settings.Get( + group="appearance", + key="singleWindow", + subkey="enabled", + ) + if windows_pos: + # get dimension of main window pos = self.parent.GetPosition() size = self.parent.GetSize() - dim = "%d,%d,%d,%d" % (pos[0], pos[1], size[0], size[1]) - # opened displays + dim = f"{pos[0]},{pos[1]},{size[0]},{size[1]}" + + # extend dimension by dimensions of opened displays for mapdisp in self._giface.GetAllMapDisplays(): pos = mapdisp.GetPosition() size = mapdisp.GetSize() # window size must be larger than zero, not minimized - # when mapdisp is inside single window (panel has no IsIconized), don't save dim - if ( - hasattr(mapdisp, "IsIconized") - and not mapdisp.IsIconized() - and (size[0] > 0 and size[1] > 0) + # do not save dim when mapdisp is docked within single window + if (not mapdisp.IsDockable() or not mapdisp.IsDocked()) and ( + size[0] > 0 and size[1] > 0 ): - dim += ",%d,%d,%d,%d" % (pos[0], pos[1], size[0], size[1]) + dim += f",{pos[0]},{pos[1]},{size[0]},{size[1]}" - self.settings.Set( - group="general", key="defWindowPos", subkey="dim", value=dim - ) + if single_window: + # single window mode + self.settings.Set( + group="general", + key="defWindowPos", + subkey="dimSingleWindow", + value=dim, + ) + else: + # multi window mode + self.settings.Set( + group="general", key="defWindowPos", subkey="dim", value=dim + ) return True diff --git a/gui/wxpython/main_window/frame.py b/gui/wxpython/main_window/frame.py index eee07982bf4..5d7a46de8da 100644 --- a/gui/wxpython/main_window/frame.py +++ b/gui/wxpython/main_window/frame.py @@ -103,7 +103,7 @@ def __init__( id=wx.ID_ANY, title=None, workspace=None, - size=wx.Display().GetGeometry().GetSize(), + size=wx.GetClientDisplayRect().GetSize(), style=wx.DEFAULT_FRAME_STYLE, **kwargs, ): @@ -179,30 +179,32 @@ def show_menu_errors(messages): # use default window layout ? if UserSettings.Get(group="general", key="defWindowPos", subkey="enabled"): - dim = UserSettings.Get(group="general", key="defWindowPos", subkey="dim") - try: - x, y = map(int, dim.split(",")[0:2]) - w, h = map(int, dim.split(",")[2:4]) - client_disp = wx.ClientDisplayRect() - if x == 1: - # Get client display x offset (OS panel) - x = client_disp[0] - if y == 1: - # Get client display y offset (OS panel) - y = client_disp[1] - self.SetPosition((x, y)) - self.SetSize((w, h)) - except Exception: - pass - self.Layout() - if w <= globalvar.GM_WINDOW_SIZE[0] or h <= globalvar.GM_WINDOW_SIZE[1]: - self.Fit() + single_window_dim = { + "group": "general", + "key": "defWindowPos", + "subkey": "dimSingleWindow", + } + dim = UserSettings.Get(**single_window_dim) + default_dim = UserSettings.Get(**single_window_dim, settings_type="default") + + if dim != default_dim: + try: + x, y, w, h = map(int, dim.split(",")[:4]) + client_disp = wx.ClientDisplayRect() + if x == 1: + # Get client display x offset (OS panel) + x = client_disp[0] + if y == 1: + # Get client display y offset (OS panel) + y = client_disp[1] + self.SetPosition((x, y)) + self.SetSize((w, h)) + except Exception: + pass + else: + self.Maximize(True) else: - self.Layout() - self.Fit() - # does center (of screen) make sense for lmgr? - self.Centre() - + self.Maximize(True) self.Show() # load workspace file if requested