From 038cbb0e5b5d1d625e2281474ca535fbac65f8d7 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 13 Feb 2023 16:54:40 +0100 Subject: [PATCH 1/2] Tracks view: keep current item visible when the view shrinks vertically --- src/widget/wtracktableview.cpp | 44 ++++++++++++++++++++++++++++++++++ src/widget/wtracktableview.h | 1 + 2 files changed, 45 insertions(+) diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index 2fa1d34a366..12ee903ff77 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -844,6 +844,50 @@ void WTrackTableView::keyPressEvent(QKeyEvent* event) { } } +void WTrackTableView::resizeEvent(QResizeEvent* event) { + // When the tracks view shrinks in height, e.g. when other skin regions expand, + // and if the row was visible before resizing, scroll to it afterwards. + + // these heights are the actual inner region without header, scrollbars and padding + int oldHeight = event->oldSize().height(); + int newHeight = event->size().height(); + + if (newHeight >= oldHeight) { + QTableView::resizeEvent(event); + return; + } + + QModelIndex currIndex = currentIndex(); + int rHeight = rowHeight(0); + + if (!currIndex.isValid() || rHeight <= 0) { + QTableView::resizeEvent(event); + return; + } + + int currRow = currIndex.row(); + // y-pos of the top edge, negative value means above viewport boundary + int posInView = rowViewportPosition(currRow); + // Check if the row is visible. + // Note: don't use viewport()->height() because that may already have changed (??) + bool rowWasVisible = posInView > 0 && posInView - rHeight < oldHeight; + + QTableView::resizeEvent(event); + + if (!rowWasVisible) { + return; + } + + // TODO(xxx) When resizing, the top row is static, at least on Linux. + // If that is true on other OS as well we could calculate the new relative + // position before resizing. + // Check if the item is fully visible. If not, scroll to show it + posInView = rowViewportPosition(currRow); + if (posInView - rHeight < 0 || posInView + rHeight > newHeight) { + scrollTo(currIndex); + } +} + void WTrackTableView::hideOrRemoveSelectedTracks() { QModelIndexList indices = selectionModel()->selectedRows(); if (indices.isEmpty()) { diff --git a/src/widget/wtracktableview.h b/src/widget/wtracktableview.h index 433da9d9733..2999bceb147 100644 --- a/src/widget/wtracktableview.h +++ b/src/widget/wtracktableview.h @@ -35,6 +35,7 @@ class WTrackTableView : public WLibraryTableView { bool hasFocus() const override; void setFocus() override; void keyPressEvent(QKeyEvent* event) override; + void resizeEvent(QResizeEvent* event) override; void activateSelectedTrack() override; void loadSelectedTrackToGroup(const QString& group, bool play) override; void assignNextTrackColor() override; From 09896a95b7787e0ff2620ebcf6e083c4a179b82d Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 23 Mar 2023 12:46:45 +0100 Subject: [PATCH 2/2] Tracks view: optimize and clean up resizeEvent() --- src/widget/wtracktableview.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index 12ee903ff77..a45bc30c54d 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -858,18 +858,18 @@ void WTrackTableView::resizeEvent(QResizeEvent* event) { } QModelIndex currIndex = currentIndex(); - int rHeight = rowHeight(0); + int currRow = currIndex.row(); + int rHeight = rowHeight(currRow); - if (!currIndex.isValid() || rHeight <= 0) { + if (currRow < 0 || rHeight == 0) { // true if currIndex is invalid QTableView::resizeEvent(event); return; } - int currRow = currIndex.row(); // y-pos of the top edge, negative value means above viewport boundary int posInView = rowViewportPosition(currRow); // Check if the row is visible. - // Note: don't use viewport()->height() because that may already have changed (??) + // Note: don't use viewport()->height() because that may already have changed bool rowWasVisible = posInView > 0 && posInView - rHeight < oldHeight; QTableView::resizeEvent(event); @@ -878,9 +878,6 @@ void WTrackTableView::resizeEvent(QResizeEvent* event) { return; } - // TODO(xxx) When resizing, the top row is static, at least on Linux. - // If that is true on other OS as well we could calculate the new relative - // position before resizing. // Check if the item is fully visible. If not, scroll to show it posInView = rowViewportPosition(currRow); if (posInView - rHeight < 0 || posInView + rHeight > newHeight) {