1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:18:11 +00:00

LibGUI: Teach GScrollableWidget how to hide unnecessary scrollbars

This is now an opt-in mode enabled by calling:

    should_hide_unnecessary_scrollbars(true)

This patch enables the mode for GTreeView and GTableView. :^)
This commit is contained in:
Andreas Kling 2019-09-05 21:37:15 +02:00
parent fb39e46d3d
commit 7a906ab539
4 changed files with 25 additions and 2 deletions

View file

@ -39,8 +39,17 @@ void GScrollableWidget::custom_layout()
int height_wanted_by_horizontal_scrollbar = m_horizontal_scrollbar->is_visible() ? m_horizontal_scrollbar->preferred_size().height() : 0;
int width_wanted_by_vertical_scrollbar = m_vertical_scrollbar->is_visible() ? m_vertical_scrollbar->preferred_size().width() : 0;
m_vertical_scrollbar->set_relative_rect(inner_rect.right() + 1 - m_vertical_scrollbar->preferred_size().width(), inner_rect.top(), m_vertical_scrollbar->preferred_size().width(), inner_rect.height() - height_wanted_by_horizontal_scrollbar);
m_horizontal_scrollbar->set_relative_rect(inner_rect.left(), inner_rect.bottom() + 1 - m_horizontal_scrollbar->preferred_size().height(), inner_rect.width() - m_vertical_scrollbar->preferred_size().width(), width_wanted_by_vertical_scrollbar);
m_vertical_scrollbar->set_relative_rect(
inner_rect.right() + 1 - m_vertical_scrollbar->preferred_size().width(),
inner_rect.top(),
m_vertical_scrollbar->preferred_size().width(),
inner_rect.height() - height_wanted_by_horizontal_scrollbar);
m_horizontal_scrollbar->set_relative_rect(
inner_rect.left(),
inner_rect.bottom() + 1 - m_horizontal_scrollbar->preferred_size().height(),
inner_rect.width() - width_wanted_by_vertical_scrollbar,
m_horizontal_scrollbar->preferred_size().height());
m_corner_widget->set_visible(m_vertical_scrollbar->is_visible() && m_horizontal_scrollbar->is_visible());
if (m_corner_widget->is_visible()) {
@ -69,9 +78,15 @@ void GScrollableWidget::update_scrollbar_ranges()
int excess_height = max(0, m_content_size.height() - available_size.height());
m_vertical_scrollbar->set_range(0, excess_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);
if (should_hide_unnecessary_scrollbars())
m_horizontal_scrollbar->set_visible(excess_width > 0);
m_vertical_scrollbar->set_big_step(visible_content_rect().height() - m_vertical_scrollbar->step());
}

View file

@ -38,6 +38,9 @@ public:
int width_occupied_by_vertical_scrollbar() const;
int height_occupied_by_horizontal_scrollbar() const;
void set_should_hide_unnecessary_scrollbars(bool b) { m_should_hide_unnecessary_scrollbars = b; }
bool should_hide_unnecessary_scrollbars() const { return m_should_hide_unnecessary_scrollbars; }
protected:
explicit GScrollableWidget(GWidget* parent);
virtual void custom_layout() override;
@ -56,4 +59,5 @@ private:
Size m_content_size;
Size m_size_occupied_by_fixed_elements;
bool m_scrollbars_enabled { true };
bool m_should_hide_unnecessary_scrollbars { false };
};

View file

@ -15,6 +15,8 @@ GTableView::GTableView(GWidget* parent)
set_frame_shape(FrameShape::Container);
set_frame_shadow(FrameShadow::Sunken);
set_frame_thickness(2);
set_should_hide_unnecessary_scrollbars(true);
}
GTableView::~GTableView()

View file

@ -29,6 +29,8 @@ GTreeView::GTreeView(GWidget* parent)
m_expand_bitmap = GraphicsBitmap::load_from_file("/res/icons/treeview-expand.png");
m_collapse_bitmap = GraphicsBitmap::load_from_file("/res/icons/treeview-collapse.png");
set_should_hide_unnecessary_scrollbars(true);
}
GTreeView::~GTreeView()