%PDF- %PDF-
Direktori : /lib/calibre/calibre/gui2/ |
Current File : //lib/calibre/calibre/gui2/pin_columns.py |
#!/usr/bin/env python3 # License: GPLv3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net> from qt.core import QSplitter, QTableView from calibre.gui2.library import DEFAULT_SORT from calibre.gui2 import gprefs class PinTableView(QTableView): def __init__(self, books_view, parent=None): QTableView.__init__(self, parent) self.books_view = books_view self.verticalHeader().close() self.splitter = None self.disable_save_state = False @property def column_map(self): return self.books_view.column_map def set_context_menu(self, menu): self.context_menu = menu def contextMenuEvent(self, event): self.books_view.show_context_menu(self.context_menu, event) def get_default_state(self): old_state = { 'hidden_columns': ['last_modified', 'languages'], 'sort_history':[DEFAULT_SORT], 'column_positions': {}, 'column_sizes': {}, } h = self.column_header cm = self.column_map for i in range(h.count()): name = cm[i] old_state['column_positions'][name] = i if name != 'ondevice': old_state['column_sizes'][name] = \ min(350, max(self.sizeHintForColumn(i), h.sectionSizeHint(i))) if name in ('timestamp', 'last_modified'): old_state['column_sizes'][name] += 12 return old_state def apply_state(self, state): self.disable_save_state = True # moveSection() can cause save_state() to be called h = self.column_header cmap = {} hidden = state.get('hidden_columns', []) for i, c in enumerate(self.column_map): cmap[c] = i if c != 'ondevice': h.setSectionHidden(i, c in hidden) positions = state.get('column_positions', {}) pmap = {} for col, pos in positions.items(): if col in cmap: pmap[pos] = col for pos in sorted(pmap.keys()): col = pmap[pos] idx = cmap[col] current_pos = h.visualIndex(idx) if current_pos != pos: h.moveSection(current_pos, pos) # Because of a bug in Qt 5 we have to ensure that the header is actually # relaid out by changing this value, without this sometimes ghost # columns remain visible when changing libraries for i in range(h.count()): val = h.isSectionHidden(i) h.setSectionHidden(i, not val) h.setSectionHidden(i, val) sizes = state.get('column_sizes', {}) for col, size in sizes.items(): if col in cmap: sz = sizes[col] if sz < 3: sz = h.sectionSizeHint(cmap[col]) h.resizeSection(cmap[col], sz) for i in range(h.count()): if not h.isSectionHidden(i) and h.sectionSize(i) < 3: sz = h.sectionSizeHint(i) h.resizeSection(i, sz) self.disable_save_state = False def get_state(self): h = self.column_header cm = self.column_map state = {} state['hidden_columns'] = [cm[i] for i in range(h.count()) if h.isSectionHidden(i) and cm[i] != 'ondevice'] state['column_positions'] = {} state['column_sizes'] = {} for i in range(h.count()): name = cm[i] state['column_positions'][name] = h.visualIndex(i) if name != 'ondevice': state['column_sizes'][name] = h.sectionSize(i) return state def save_state(self): db = getattr(self.model(), 'db', None) if db is not None and not self.disable_save_state: state = self.get_state() db.new_api.set_pref('books view split pane state', state) if self.splitter is not None: self.splitter.save_state() def restore_state(self): db = getattr(self.model(), 'db', None) if db is not None: state = db.new_api.pref('books view split pane state', None) if self.splitter is not None: self.splitter.restore_state() if state: self.apply_state(state) class PinContainer(QSplitter): def __init__(self, books_view, parent=None): QSplitter.__init__(self, parent) self.setChildrenCollapsible(False) self.books_view = books_view self.addWidget(books_view) self.addWidget(books_view.pin_view) books_view.pin_view.splitter = self @property def splitter_state(self): return bytearray(self.saveState()) @splitter_state.setter def splitter_state(self, val): if val is not None: self.restoreState(val) def save_state(self): gprefs['book_list_pin_splitter_state'] = self.splitter_state def restore_state(self): val = gprefs.get('book_list_pin_splitter_state', None) self.splitter_state = val