Enhancement #2079784: Save the main window geometry when saving a layout.

This commit is contained in:
Charles Haley 2024-09-18 16:25:05 +01:00 committed by Kovid Goyal
parent 3d19fb01be
commit cea3db20c2
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 22 additions and 3 deletions

View File

@ -8,6 +8,7 @@ from qt.core import QComboBox, QDialog, QDialogButtonBox, QFormLayout, QIcon, QL
from calibre.gui2 import error_dialog, gprefs, question_dialog from calibre.gui2 import error_dialog, gprefs, question_dialog
from calibre.gui2.actions import InterfaceAction, show_menu_under_widget from calibre.gui2.actions import InterfaceAction, show_menu_under_widget
from calibre.gui2.geometry import _restore_geometry, save_geometry, delete_geometry
from calibre.utils.icu import sort_key from calibre.utils.icu import sort_key
@ -166,8 +167,12 @@ class LayoutActions(InterfaceAction):
Throws KeyError if the name doesn't exist. Throws KeyError if the name doesn't exist.
''' '''
layouts = gprefs['saved_layouts']
# This can be called by plugins so let the exception fly # This can be called by plugins so let the exception fly
# Restore the application window geometry if we have it.
_restore_geometry(self.gui, gprefs, f'saved_layout_{name}')
# Now the panel sizes inside the central widget
layouts = gprefs['saved_layouts']
settings = layouts[name] settings = layouts[name]
# Order is important here. change_layout() must be called before # Order is important here. change_layout() must be called before
# unserializing the settings or panes like book details won't display # unserializing the settings or panes like book details won't display
@ -201,6 +206,9 @@ class LayoutActions(InterfaceAction):
:param:`name` The name for the settings. :param:`name` The name for the settings.
:param:`settings`: The gui layout settings to save. :param:`settings`: The gui layout settings to save.
''' '''
# Save the main window geometry.
save_geometry(self.gui, gprefs, f'saved_layout_{name}')
# Now the panel sizes inside the central widget
layouts = gprefs['saved_layouts'] layouts = gprefs['saved_layouts']
layouts.update({name: settings}) layouts.update({name: settings})
gprefs['saved_layouts'] = layouts gprefs['saved_layouts'] = layouts
@ -218,6 +226,9 @@ class LayoutActions(InterfaceAction):
_('Do you really want to delete the saved layout {0}?').format(name), _('Do you really want to delete the saved layout {0}?').format(name),
skip_dialog_name='delete_saved_gui_layout'): skip_dialog_name='delete_saved_gui_layout'):
return return
# The information is stored as 2 preferences. Delete them both.
delete_geometry(gprefs, f'saved_layout_{name}')
layouts = gprefs['saved_layouts'] layouts = gprefs['saved_layouts']
layouts.pop(name, None) layouts.pop(name, None)
self.populate_menu() self.populate_menu()

View File

@ -12,6 +12,10 @@ from calibre.constants import is_debugging as _is_debugging
from calibre.utils.config_base import tweaks from calibre.utils.config_base import tweaks
def geometry_pref_name(name):
return f'geometry-of-{name}'
def is_debugging(): def is_debugging():
return _is_debugging() and tweaks.get('show_geometry_debug_output') return _is_debugging() and tweaks.get('show_geometry_debug_output')
@ -77,6 +81,10 @@ def geometry_for_restore_as_dict(self: QWidget):
return ans return ans
def delete_geometry(prefs: dict, name: str):
prefs.pop(geometry_pref_name(name), None)
def save_geometry(self: QWidget, prefs: dict, name: str): def save_geometry(self: QWidget, prefs: dict, name: str):
x = geometry_for_restore_as_dict(self) x = geometry_for_restore_as_dict(self)
if x: if x:
@ -84,7 +92,7 @@ def save_geometry(self: QWidget, prefs: dict, name: str):
debug('Saving geometry for:', name) debug('Saving geometry for:', name)
debug(x) debug(x)
x['qt'] = bytearray(self.saveGeometry()) x['qt'] = bytearray(self.saveGeometry())
prefs.set(f'geometry-of-{name}', x) prefs.set(geometry_pref_name(name), x)
def find_matching_screen(screen_as_dict): def find_matching_screen(screen_as_dict):
@ -153,7 +161,7 @@ def _restore_to_new_screen(self: QWidget, s: QScreen, saved_data: dict) -> bool:
def _restore_geometry(self: QWidget, prefs: dict, name: str, get_legacy_saved_geometry: callable = None) -> bool: def _restore_geometry(self: QWidget, prefs: dict, name: str, get_legacy_saved_geometry: callable = None) -> bool:
x = prefs.get(f'geometry-of-{name}') x = prefs.get(geometry_pref_name(name))
if not x: if not x:
old = get_legacy_saved_geometry() if get_legacy_saved_geometry else prefs.get(name) old = get_legacy_saved_geometry() if get_legacy_saved_geometry else prefs.get(name)
if old is not None: if old is not None: