From 1fd1d1cdefaa93bb815083a311697631c062d3ec Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 7 May 2023 14:56:54 +0530 Subject: [PATCH 1/3] Fix a regression in previous release that broke scrolling when using the scroll_per_row tweak. Fixes #2018660 [Opening the Edit Metadata dialog causes the book list to scroll down too much](https://bugs.launchpad.net/calibre/+bug/2018660) --- src/calibre/gui2/library/views.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 4199a044f9..aabef4bb24 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -1319,19 +1319,38 @@ class BooksView(QTableView): # {{{ vertical_offset = vh.offset() vertical_position = vh.sectionPosition(row) cell_height = vh.sectionSize(row) - pos = 'center' if vertical_position - vertical_offset < 0 or cell_height > viewport_height: pos = 'top' elif vertical_position - vertical_offset + cell_height > viewport_height: pos = 'bottom' vsb = self.verticalScrollBar() - if pos == 'top': - vsb.setValue(vertical_position) - elif pos == 'bottom': - vsb.setValue(vertical_position - viewport_height + cell_height) + + if self.verticalScrollMode() == QAbstractItemView.ScrollMode.ScrollPerPixel: + if pos == 'top': + vsb.setValue(vertical_position) + elif pos == 'bottom': + vsb.setValue(vertical_position - viewport_height + cell_height) + else: + vsb.setValue(vertical_position - ((viewport_height - cell_height) // 2)) else: - vsb.setValue(vertical_position - ((viewport_height - cell_height) // 2)) + vertical_index = vh.visualIndex(row) + if pos in ('bottom', 'center'): + h = (viewport_height // 2) if pos == 'center' else viewport_height + y = cell_height + while vertical_index > 0: + r = vh.logicalIndex(vertical_index - 1) + y += vh.sectionSize(r) + if y > h: + break + vertical_index -= 1 + hidden_sections = 0 + if vh.sectionsHidden(): + for s in range(vertical_index - 1, -1, -1): + r = vh.logicalIndex(s) + if vh.isSectionHidden(row): + hidden_sections += 1 + vsb.setValue(vertical_index - hidden_sections) @property def current_book(self): From b2d0fb5cf756d25126f3f56249f6e857b9d13433 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 7 May 2023 15:48:53 +0530 Subject: [PATCH 2/3] ... --- src/calibre/gui2/library/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index aabef4bb24..daef65d54c 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -1348,7 +1348,7 @@ class BooksView(QTableView): # {{{ if vh.sectionsHidden(): for s in range(vertical_index - 1, -1, -1): r = vh.logicalIndex(s) - if vh.isSectionHidden(row): + if vh.isSectionHidden(r): hidden_sections += 1 vsb.setValue(vertical_index - hidden_sections) From cd085fc844bcbf52e8a0ac416b5d3f9bfbbc0702 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 7 May 2023 15:51:53 +0530 Subject: [PATCH 3/3] Cleanup code --- src/calibre/gui2/library/views.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index daef65d54c..db6dad443a 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -1339,18 +1339,15 @@ class BooksView(QTableView): # {{{ h = (viewport_height // 2) if pos == 'center' else viewport_height y = cell_height while vertical_index > 0: - r = vh.logicalIndex(vertical_index - 1) - y += vh.sectionSize(r) + y += vh.sectionSize(vh.logicalIndex(vertical_index -1)) if y > h: break vertical_index -= 1 - hidden_sections = 0 if vh.sectionsHidden(): for s in range(vertical_index - 1, -1, -1): - r = vh.logicalIndex(s) - if vh.isSectionHidden(r): - hidden_sections += 1 - vsb.setValue(vertical_index - hidden_sections) + if vh.isSectionHidden(vh.logicalIndex(s)): + vertical_index -= 1 + vsb.setValue(vertical_index) @property def current_book(self):