From ae3aa445962724fd6eb18a802b036e0210abe610 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 2 Aug 2013 14:30:25 +0530 Subject: [PATCH] Port preserve_view_state to work with the grid view --- src/calibre/gui2/library/alternate_views.py | 10 ++++++- src/calibre/gui2/library/views.py | 31 +++++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index 921299e074..6e6912c9eb 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -374,7 +374,9 @@ class GridView(QListView): self.setUniformItemSizes(True) self.setWrapping(True) self.setFlow(self.LeftToRight) - self.setLayoutMode(self.Batched) + # We cannot set layout mode to batched, because that breaks + # restore_vpos() + # self.setLayoutMode(self.Batched) self.setResizeMode(self.Adjust) self.setSelectionMode(self.ExtendedSelection) self.setVerticalScrollMode(self.ScrollPerPixel) @@ -506,4 +508,10 @@ class GridView(QListView): def do_sort(self, column, ascending): self.sort_requested.emit(column, ascending) + def restore_vpos(self, vpos): + self.verticalScrollBar().setValue(vpos) + + def restore_hpos(self, hpos): + pass + setup_dnd_interface(GridView) diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 254709c209..06e6e43fcd 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -87,18 +87,24 @@ class PreserveViewState(object): # {{{ require_selected_ids=True): self.view = view self.require_selected_ids = require_selected_ids - self.selected_ids = set() - self.current_id = None self.preserve_hpos = preserve_hpos self.preserve_vpos = preserve_vpos + self.init_vals() + + def init_vals(self): + self.selected_ids = set() + self.current_id = None self.vscroll = self.hscroll = 0 + self.original_view = None def __enter__(self): + self.init_vals() try: + view = self.original_view = self.view.alternate_views.current_view self.selected_ids = self.view.get_selected_ids() self.current_id = self.view.current_id - self.vscroll = self.view.verticalScrollBar().value() - self.hscroll = self.view.horizontalScrollBar().value() + self.vscroll = view.verticalScrollBar().value() + self.hscroll = view.horizontalScrollBar().value() except: import traceback traceback.print_exc() @@ -110,10 +116,19 @@ class PreserveViewState(object): # {{{ if self.selected_ids: self.view.select_rows(self.selected_ids, using_ids=True, scroll=False, change_current=self.current_id is None) - if self.preserve_vpos: - self.view.verticalScrollBar().setValue(self.vscroll) - if self.preserve_hpos: - self.view.horizontalScrollBar().setValue(self.hscroll) + view = self.original_view + if self.view.alternate_views.current_view is view: + if self.preserve_vpos: + if hasattr(view, 'restore_vpos'): + view.restore_vpos(self.vscroll) + else: + view.verticalScrollBar().setValue(self.vscroll) + if self.preserve_hpos: + if hasattr(view, 'restore_hpos'): + view.restore_hpos(self.hscroll) + else: + view.horizontalScrollBar().setValue(self.hscroll) + self.init_vals() @dynamic_property def state(self):