From 91b4e8038435021c4f177a9eef11dc60bbe2f389 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Sat, 21 Apr 2018 04:30:55 +0200 Subject: [PATCH] ui: adapt scroll target value in code single file mode as workaround when view scrolls below last line --- src/lib_gui/qt/element/QtCodeArea.cpp | 3 +-- src/lib_gui/qt/element/QtCodeField.cpp | 5 +++++ src/lib_gui/qt/element/QtCodeField.h | 2 ++ src/lib_gui/qt/element/QtCodeFileSingle.cpp | 13 +++++++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/lib_gui/qt/element/QtCodeArea.cpp b/src/lib_gui/qt/element/QtCodeArea.cpp index 3e23b6b4..a884594c 100644 --- a/src/lib_gui/qt/element/QtCodeArea.cpp +++ b/src/lib_gui/qt/element/QtCodeArea.cpp @@ -274,8 +274,7 @@ void QtCodeArea::lineNumberAreaPaintEvent(QPaintEvent *event) int QtCodeArea::lineNumberDigits() const { - int max = qMax(1, int(getStartLineNumber()) + blockCount()); - return utility::digits(max); + return utility::digits(getEndLineNumber()); } int QtCodeArea::lineNumberAreaWidth() const diff --git a/src/lib_gui/qt/element/QtCodeField.cpp b/src/lib_gui/qt/element/QtCodeField.cpp index 963591cb..2d778e53 100644 --- a/src/lib_gui/qt/element/QtCodeField.cpp +++ b/src/lib_gui/qt/element/QtCodeField.cpp @@ -130,6 +130,11 @@ uint QtCodeField::getEndLineNumber() const return m_startLineNumber + blockCount() - 1; } +int QtCodeField::totalLineHeight() const +{ + return blockBoundingRect(firstVisibleBlock()).height() * blockCount(); +} + std::string QtCodeField::getCode() const { return m_code; diff --git a/src/lib_gui/qt/element/QtCodeField.h b/src/lib_gui/qt/element/QtCodeField.h index 4e72027d..c2663fb0 100644 --- a/src/lib_gui/qt/element/QtCodeField.h +++ b/src/lib_gui/qt/element/QtCodeField.h @@ -35,6 +35,8 @@ public: uint getStartLineNumber() const; uint getEndLineNumber() const; + int totalLineHeight() const; + std::string getCode() const; std::shared_ptr getSourceLocationFile() const; diff --git a/src/lib_gui/qt/element/QtCodeFileSingle.cpp b/src/lib_gui/qt/element/QtCodeFileSingle.cpp index 2ef8e18f..fa3e9697 100644 --- a/src/lib_gui/qt/element/QtCodeFileSingle.cpp +++ b/src/lib_gui/qt/element/QtCodeFileSingle.cpp @@ -195,6 +195,19 @@ bool QtCodeFileSingle::requestScroll( double percentA = double(lineNumber - 1) / m_area->getEndLineNumber(); double percentB = endLineNumber ? double(endLineNumber - 1) / m_area->getEndLineNumber() : 0.0f; + // fix percentages wrong when code area is scrollable beyond last line due to some unknown bug + { + int totalHeight = m_area->sizeHint().height(); + int totalLineHeight = m_area->totalLineHeight(); + + if (std::abs(totalHeight - totalLineHeight) > 100) + { + double factor = totalLineHeight / double(totalHeight); + percentA *= factor; + percentB *= factor; + } + } + ensurePercentVisibleAnimated(percentA, percentB, animated, target); m_scrollRequested = true;