From 01e00bac9dffab8dbc0bbd5d580c61e13022b9a7 Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Tue, 16 Feb 2021 08:58:01 -0500 Subject: [PATCH] LibGUI: Set correct ranges for hidable scrollbars Fixes vertical and horizontal overscroll in widgets that allow unnecessary scrollbars to be hidden. --- .../Libraries/LibGUI/ScrollableWidget.cpp | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Userland/Libraries/LibGUI/ScrollableWidget.cpp b/Userland/Libraries/LibGUI/ScrollableWidget.cpp index 9e724a6c40..ea04ada81f 100644 --- a/Userland/Libraries/LibGUI/ScrollableWidget.cpp +++ b/Userland/Libraries/LibGUI/ScrollableWidget.cpp @@ -111,19 +111,26 @@ void ScrollableWidget::update_scrollbar_ranges() auto available_size = this->available_size(); int excess_height = max(0, m_content_size.height() - available_size.height()); - m_vertical_scrollbar->set_range(0, excess_height); - m_vertical_scrollbar->set_page_step(available_size.height()); - - if (should_hide_unnecessary_scrollbars()) - m_vertical_scrollbar->set_visible(excess_height > 0); - int excess_width = max(0, m_content_size.width() - available_size.width()); - m_horizontal_scrollbar->set_range(0, excess_width); - m_horizontal_scrollbar->set_page_step(available_size.width()); - if (should_hide_unnecessary_scrollbars()) + auto vertical_initial_visibility = m_vertical_scrollbar->is_visible(); + auto horizontal_initial_visibility = m_horizontal_scrollbar->is_visible(); + + if (should_hide_unnecessary_scrollbars()) { + m_vertical_scrollbar->set_visible(excess_height > 0); m_horizontal_scrollbar->set_visible(excess_width > 0); + } + if (m_vertical_scrollbar->is_visible() != vertical_initial_visibility || m_horizontal_scrollbar->is_visible() != horizontal_initial_visibility) { + available_size = this->available_size(); + excess_height = max(0, m_content_size.height() - available_size.height()); + excess_width = max(0, m_content_size.width() - available_size.width()); + } + + m_horizontal_scrollbar->set_range(0, excess_width); + m_horizontal_scrollbar->set_page_step(visible_content_rect().width() - m_horizontal_scrollbar->step()); + + m_vertical_scrollbar->set_range(0, excess_height); m_vertical_scrollbar->set_page_step(visible_content_rect().height() - m_vertical_scrollbar->step()); }