Bladeren bron

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. :^)
Andreas Kling 5 jaren geleden
bovenliggende
commit
7a906ab539

+ 17 - 2
Libraries/LibGUI/GScrollableWidget.cpp

@@ -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());
 }
 

+ 4 - 0
Libraries/LibGUI/GScrollableWidget.h

@@ -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 };
 };

+ 2 - 0
Libraries/LibGUI/GTableView.cpp

@@ -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()

+ 2 - 0
Libraries/LibGUI/GTreeView.cpp

@@ -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()