Browse Source

LibGUI: Set correct ranges for hidable scrollbars

Fixes vertical and horizontal overscroll in widgets that allow
unnecessary scrollbars to be hidden.
thankyouverycool 4 years ago
parent
commit
01e00bac9d
1 changed files with 15 additions and 8 deletions
  1. 15 8
      Userland/Libraries/LibGUI/ScrollableWidget.cpp

+ 15 - 8
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());
+    int excess_width = max(0, m_content_size.width() - available_size.width());
+
+    auto vertical_initial_visibility = m_vertical_scrollbar->is_visible();
+    auto horizontal_initial_visibility = m_horizontal_scrollbar->is_visible();
 
-    if (should_hide_unnecessary_scrollbars())
+    if (should_hide_unnecessary_scrollbars()) {
         m_vertical_scrollbar->set_visible(excess_height > 0);
+        m_horizontal_scrollbar->set_visible(excess_width > 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 (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());
+    }
 
-    if (should_hide_unnecessary_scrollbars())
-        m_horizontal_scrollbar->set_visible(excess_width > 0);
+    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());
 }