summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGUI
diff options
context:
space:
mode:
authorthankyouverycool <66646555+thankyouverycool@users.noreply.github.com>2021-02-17 12:15:52 -0500
committerAndreas Kling <kling@serenityos.org>2021-02-20 22:27:52 +0100
commit2df219d608bcb49dfd684d3532b3635c18de9828 (patch)
treedf8950fcf917835ee43645e85f58532ab57e4ce9 /Userland/Libraries/LibGUI
parent8789a91a4efe59ba3b151fc152995d7fe6dd4248 (diff)
downloadserenity-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
Diffstat (limited to 'Userland/Libraries/LibGUI')
-rw-r--r--Userland/Libraries/LibGUI/ScrollableWidget.cpp37
-rw-r--r--Userland/Libraries/LibGUI/ScrollableWidget.h1
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; }