Implement migration of layout and visibility settings

This commit is contained in:
Kovid Goyal 2023-12-23 10:55:35 +05:30
parent 7bc13463f2
commit a328c7c8b2
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -2,6 +2,7 @@
# License: GPLv3 Copyright: 2023, Kovid Goyal <kovid at kovidgoyal.net> # License: GPLv3 Copyright: 2023, Kovid Goyal <kovid at kovidgoyal.net>
from copy import copy from copy import copy
from contextlib import suppress
from dataclasses import asdict, dataclass, fields from dataclasses import asdict, dataclass, fields
from enum import Enum, auto from enum import Enum, auto
from qt.core import ( from qt.core import (
@ -17,6 +18,34 @@ HIDE_THRESHOLD = 10
SHOW_THRESHOLD = 50 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): class Placeholder(QLabel):
backgrounds = 'yellow', 'lightgreen', 'grey', 'cyan', 'magenta' backgrounds = 'yellow', 'lightgreen', 'grey', 'cyan', 'magenta'
bgcount = 0 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): 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.separate_cover_browser = config['separate_cover_flow'] if separate_cover_browser is None else separate_cover_browser
self.prefs_name = prefs_name self.prefs_name = prefs_name
super().__init__(parent)
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self.wide_desires = WideDesires() self.wide_desires = WideDesires()
self.narrow_desires = NarrowDesires() 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: if for_develop:
self.tag_browser = Placeholder('tag browser', self) self.tag_browser = Placeholder('tag browser', self)
self.book_list = Placeholder('book list', self) self.book_list = Placeholder('book list', self)
@ -287,6 +317,10 @@ class CentralContainer(QWidget):
self.top_handle = h(Qt.Orientation.Horizontal) self.top_handle = h(Qt.Orientation.Horizontal)
self.bottom_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): def set_widget(self, which, w):
existing = getattr(self, which) existing = getattr(self, which)
existing.setVisible(False) existing.setVisible(False)
@ -323,7 +357,8 @@ class CentralContainer(QWidget):
def serialized_settings(self): def serialized_settings(self):
return { return {
'layout': self.layout.name, '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(), 'wide_desires': self.wide_desires.serialize(),
'narrow_desires': self.narrow_desires.serialize() 'narrow_desires': self.narrow_desires.serialize()
} }
@ -338,11 +373,9 @@ class CentralContainer(QWidget):
def unserialize_settings(self, s): def unserialize_settings(self, s):
l = s.get('layout') l = s.get('layout')
if l == 'wide': self.layout = Layout.narrow if l == 'narrow' else Layout.wide
self.layout = Layout.wide self.wide_is_visible.unserialize(s.get('wide_visibility') or {})
elif l == 'narrow': self.narrow_is_visible.unserialize(s.get('narrow_visibility') or {})
self.layout = Layout.narrow
self.is_visible.unserialize(s.get('visibility') or {})
self.wide_desires.unserialize(s.get('wide_desires') or {}) self.wide_desires.unserialize(s.get('wide_desires') or {})
self.narrow_desires.unserialize(s.get('narrow_desires') or {}) self.narrow_desires.unserialize(s.get('narrow_desires') or {})
@ -351,7 +384,8 @@ class CentralContainer(QWidget):
def read_settings(self): def read_settings(self):
before = self.serialized_settings() 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: if self.serialized_settings() != before:
self.update_button_states_from_visibility() self.update_button_states_from_visibility()
self.relayout() self.relayout()