Переглянути джерело

LibGUI: Add custom layout change handling to ScrollableContainerWidget

FrHun 3 роки тому
батько
коміт
247e3ef6e7

+ 19 - 0
Userland/Libraries/LibGUI/ScrollableContainerWidget.cpp

@@ -58,11 +58,29 @@ void ScrollableContainerWidget::update_widget_size()
     }
 }
 
+void ScrollableContainerWidget::update_widget_min_size()
+{
+    if (!m_widget)
+        set_min_content_size({});
+    else
+        set_min_content_size(Gfx::IntSize(m_widget->effective_min_size().replace_component_if_matching_with(SpecialDimension::Shrink, UISize { 0, 0 })));
+}
+
 void ScrollableContainerWidget::resize_event(GUI::ResizeEvent& event)
 {
     AbstractScrollableWidget::resize_event(event);
+    update_widget_size();
     update_widget_position();
+}
+
+void ScrollableContainerWidget::layout_relevant_change_occured()
+{
+    update_widget_min_size();
+    update_scrollbar_visibility();
+    update_scrollbar_ranges();
     update_widget_size();
+    update_widget_position();
+    update();
 }
 
 void ScrollableContainerWidget::set_widget(GUI::Widget* widget)
@@ -79,6 +97,7 @@ void ScrollableContainerWidget::set_widget(GUI::Widget* widget)
         add_child(*m_widget);
         m_widget->move_to_back();
     }
+    update_widget_min_size();
     update_widget_size();
     update_widget_position();
 }

+ 2 - 0
Userland/Libraries/LibGUI/ScrollableContainerWidget.h

@@ -24,10 +24,12 @@ public:
 protected:
     virtual void did_scroll() override;
     virtual void resize_event(GUI::ResizeEvent&) override;
+    virtual void layout_relevant_change_occured() override;
 
 private:
     void update_widget_size();
     void update_widget_position();
+    void update_widget_min_size();
     virtual bool load_from_gml_ast(NonnullRefPtr<GUI::GML::Node> ast, RefPtr<Core::Object> (*unregistered_child_handler)(String const&)) override;
 
     ScrollableContainerWidget();