diff options
author | thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> | 2021-02-17 12:15:52 -0500 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-02-20 22:27:52 +0100 |
commit | 2df219d608bcb49dfd684d3532b3635c18de9828 (patch) | |
tree | df8950fcf917835ee43645e85f58532ab57e4ce9 | |
parent | 8789a91a4efe59ba3b151fc152995d7fe6dd4248 (diff) | |
download | serenity-2df219d608bcb49dfd684d3532b3635c18de9828.zip |
LibGUI: Recheck size excesses when scrollbars become visible
Fixes edge cases in which hidden scrollbars could become visible
and obscure content or fail to hide when no longer needed
-rw-r--r-- | Userland/Libraries/LibGUI/ScrollableWidget.cpp | 37 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/ScrollableWidget.h | 1 |
2 files changed, 23 insertions, 15 deletions
diff --git a/Userland/Libraries/LibGUI/ScrollableWidget.cpp b/Userland/Libraries/LibGUI/ScrollableWidget.cpp index ea04ada81f..f2b4cb571f 100644 --- a/Userland/Libraries/LibGUI/ScrollableWidget.cpp +++ b/Userland/Libraries/LibGUI/ScrollableWidget.cpp @@ -106,31 +106,38 @@ Gfx::IntSize ScrollableWidget::available_size() const return { available_width, available_height }; } -void ScrollableWidget::update_scrollbar_ranges() +Gfx::IntSize ScrollableWidget::excess_size() const { auto available_size = this->available_size(); - int excess_height = max(0, m_content_size.height() - available_size.height()); int excess_width = max(0, m_content_size.width() - available_size.width()); + return { excess_width, excess_height }; +} - auto vertical_initial_visibility = m_vertical_scrollbar->is_visible(); - auto horizontal_initial_visibility = m_horizontal_scrollbar->is_visible(); - +void ScrollableWidget::update_scrollbar_ranges() +{ 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()); + if (excess_size().height() - height_occupied_by_horizontal_scrollbar() <= 0 && excess_size().width() - width_occupied_by_vertical_scrollbar() <= 0) { + m_horizontal_scrollbar->set_visible(false); + m_vertical_scrollbar->set_visible(false); + } else { + auto vertical_initial_visibility = m_vertical_scrollbar->is_visible(); + auto horizontal_initial_visibility = m_horizontal_scrollbar->is_visible(); + + m_vertical_scrollbar->set_visible(excess_size().height() > 0); + m_horizontal_scrollbar->set_visible(excess_size().width() > 0); + + if (m_vertical_scrollbar->is_visible() != vertical_initial_visibility) + m_horizontal_scrollbar->set_visible(excess_size().width() > 0); + if (m_horizontal_scrollbar->is_visible() != horizontal_initial_visibility) + m_vertical_scrollbar->set_visible(excess_size().height() > 0); + } } - m_horizontal_scrollbar->set_range(0, excess_width); + m_horizontal_scrollbar->set_range(0, excess_size().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_range(0, excess_size().height()); m_vertical_scrollbar->set_page_step(visible_content_rect().height() - m_vertical_scrollbar->step()); } diff --git a/Userland/Libraries/LibGUI/ScrollableWidget.h b/Userland/Libraries/LibGUI/ScrollableWidget.h index 349a16a5c7..1ffa78ad24 100644 --- a/Userland/Libraries/LibGUI/ScrollableWidget.h +++ b/Userland/Libraries/LibGUI/ScrollableWidget.h @@ -57,6 +57,7 @@ public: bool is_scrollbars_enabled() const { return m_scrollbars_enabled; } Gfx::IntSize available_size() const; + Gfx::IntSize excess_size() const; ScrollBar& vertical_scrollbar() { return *m_vertical_scrollbar; } const ScrollBar& vertical_scrollbar() const { return *m_vertical_scrollbar; } |