From a328c7c8b2e626d5a950a5cf188cd98aa5e594c9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 23 Dec 2023 10:55:35 +0530 Subject: [PATCH] Implement migration of layout and visibility settings --- src/calibre/gui2/central.py | 54 ++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/src/calibre/gui2/central.py b/src/calibre/gui2/central.py index 8f86ce5135..0e98043eb9 100644 --- a/src/calibre/gui2/central.py +++ b/src/calibre/gui2/central.py @@ -2,6 +2,7 @@ # License: GPLv3 Copyright: 2023, Kovid Goyal from copy import copy +from contextlib import suppress from dataclasses import asdict, dataclass, fields from enum import Enum, auto from qt.core import ( @@ -17,6 +18,34 @@ HIDE_THRESHOLD = 10 SHOW_THRESHOLD = 50 +def migrate_settings(): + ans = { + 'layout': config['gui_layout'], + 'wide_visibility': Visibility().serialize(), + 'narrow_visibility': Visibility().serialize(), + 'wide_desires': WideDesires().serialize(), + 'narrow_desires': NarrowDesires().serialize(), + } + for old, (new, hor_is_wide) in { + 'tag_browser': ('tag_browser', True), + 'book_details': ('book_details', True), + 'cover_browser': ('cover_browser', False), + }.items(): + key = 'wide' if hor_is_wide else 'narrow' + val = gprefs.get(f'{old}_splitter_horizontal_state') + if val: + with suppress(Exception): + ans[f'{key}_visibility'][new] = bool(val[0]) + key = 'narrow' if hor_is_wide else 'wide' + val = gprefs.get(f'{old}_splitter_vertical_state') + if val: + with suppress(Exception): + ans[f'{key}_visibility'][new] = bool(val[0]) + if gprefs.get('quickview visible'): + ans['wide_visibility']['quick_view'] = ans['narrow_visibility']['quick_view'] = True + return ans + + class Placeholder(QLabel): backgrounds = 'yellow', 'lightgreen', 'grey', 'cyan', 'magenta' bgcount = 0 @@ -251,11 +280,12 @@ class CentralContainer(QWidget): def __init__(self, parent=None, prefs_name='main_window_central_widget_state', separate_cover_browser=None, for_develop=False): self.separate_cover_browser = config['separate_cover_flow'] if separate_cover_browser is None else separate_cover_browser self.prefs_name = prefs_name - super().__init__(parent) - self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self.wide_desires = WideDesires() self.narrow_desires = NarrowDesires() - self.is_visible = Visibility() + self.wide_is_visible = Visibility() + self.narrow_is_visible = Visibility() + super().__init__(parent) + self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) if for_develop: self.tag_browser = Placeholder('tag browser', self) self.book_list = Placeholder('book list', self) @@ -287,6 +317,10 @@ class CentralContainer(QWidget): self.top_handle = h(Qt.Orientation.Horizontal) self.bottom_handle = h(Qt.Orientation.Horizontal) + @property + def is_visible(self): + return self.wide_is_visible if self.layout is Layout.wide else self.narrow_is_visible + def set_widget(self, which, w): existing = getattr(self, which) existing.setVisible(False) @@ -323,7 +357,8 @@ class CentralContainer(QWidget): def serialized_settings(self): return { 'layout': self.layout.name, - 'visibility': self.is_visible.serialize(), + 'wide_visibility': self.wide_is_visible.serialize(), + 'narrow_visibility': self.narrow_is_visible.serialize(), 'wide_desires': self.wide_desires.serialize(), 'narrow_desires': self.narrow_desires.serialize() } @@ -338,11 +373,9 @@ class CentralContainer(QWidget): def unserialize_settings(self, s): l = s.get('layout') - if l == 'wide': - self.layout = Layout.wide - elif l == 'narrow': - self.layout = Layout.narrow - self.is_visible.unserialize(s.get('visibility') or {}) + self.layout = Layout.narrow if l == 'narrow' else Layout.wide + self.wide_is_visible.unserialize(s.get('wide_visibility') or {}) + self.narrow_is_visible.unserialize(s.get('narrow_visibility') or {}) self.wide_desires.unserialize(s.get('wide_desires') or {}) self.narrow_desires.unserialize(s.get('narrow_desires') or {}) @@ -351,7 +384,8 @@ class CentralContainer(QWidget): def read_settings(self): before = self.serialized_settings() - self.unserialize_settings(gprefs.get(self.prefs_name) or {}) + settings = gprefs.get(self.prefs_name) or migrate_settings() + self.unserialize_settings(settings) if self.serialized_settings() != before: self.update_button_states_from_visibility() self.relayout()