summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthankyouverycool <66646555+thankyouverycool@users.noreply.github.com>2022-02-20 08:12:34 -0500
committerIdan Horowitz <idan.horowitz@gmail.com>2022-02-23 18:56:22 +0200
commitfe864af0dcae9382eb66b753919ab1dbf75baa46 (patch)
treed9297d6905e175faf9e81c646281baa7c207b50e
parentc3ce56224021eb138de7cf000894220dbe9293be (diff)
downloadserenity-fe864af0dcae9382eb66b753919ab1dbf75baa46.zip
LibGUI+Apps: Prevent Splitter children from being unresizable
Splitters could be resized in such an order that all their remaining children were fixed size, leading to unfillable gaps on resize events. HackStudio and TextEditor already had logic to handle this edge case, so this patch factors it into a general solution for all Splitters. At least one widget is now guaranteed to be resizeable after a child is removed.
-rw-r--r--Userland/Applications/TextEditor/MainWidget.cpp1
-rw-r--r--Userland/DevTools/HackStudio/HackStudioWidget.cpp12
-rw-r--r--Userland/Libraries/LibGUI/Splitter.cpp22
-rw-r--r--Userland/Libraries/LibGUI/Splitter.h2
4 files changed, 24 insertions, 13 deletions
diff --git a/Userland/Applications/TextEditor/MainWidget.cpp b/Userland/Applications/TextEditor/MainWidget.cpp
index f7dd185dd1..fd82460f51 100644
--- a/Userland/Applications/TextEditor/MainWidget.cpp
+++ b/Userland/Applications/TextEditor/MainWidget.cpp
@@ -753,7 +753,6 @@ void MainWidget::set_preview_mode(PreviewMode mode)
update_markdown_preview();
} else {
m_no_preview_action->set_checked(true);
- m_editor->set_fixed_width(-1);
set_web_view_visible(false);
}
}
diff --git a/Userland/DevTools/HackStudio/HackStudioWidget.cpp b/Userland/DevTools/HackStudio/HackStudioWidget.cpp
index ec6ad5bd52..8af021ad4c 100644
--- a/Userland/DevTools/HackStudio/HackStudioWidget.cpp
+++ b/Userland/DevTools/HackStudio/HackStudioWidget.cpp
@@ -693,18 +693,6 @@ NonnullRefPtr<GUI::Action> HackStudioWidget::create_remove_current_editor_action
auto wrapper = m_current_editor_wrapper;
m_switch_to_next_editor->activate();
m_editors_splitter->remove_child(*wrapper);
-
- auto child_editors = m_editors_splitter->child_widgets();
- bool has_child_to_fill_space = false;
- for (auto& editor : child_editors) {
- if (editor.max_height() == -1) {
- has_child_to_fill_space = true;
- break;
- }
- }
- if (!has_child_to_fill_space)
- child_editors.last().set_max_height(-1);
-
m_all_editor_wrappers.remove_first_matching([&wrapper](auto& entry) { return entry == wrapper.ptr(); });
update_actions();
});
diff --git a/Userland/Libraries/LibGUI/Splitter.cpp b/Userland/Libraries/LibGUI/Splitter.cpp
index 064cc5a082..ea025be234 100644
--- a/Userland/Libraries/LibGUI/Splitter.cpp
+++ b/Userland/Libraries/LibGUI/Splitter.cpp
@@ -164,6 +164,7 @@ void Splitter::recompute_grabbables()
auto child_widgets = this->child_widgets();
child_widgets.remove_all_matching([&](auto& widget) { return !widget.is_visible(); });
+ m_last_child_count = child_widgets.size();
if (child_widgets.size() < 2)
return;
@@ -236,6 +237,27 @@ void Splitter::did_layout()
recompute_grabbables();
}
+void Splitter::custom_layout()
+{
+ auto child_widgets = this->child_widgets();
+ child_widgets.remove_all_matching([&](auto& widget) { return !widget.is_visible(); });
+
+ if (!child_widgets.size())
+ return;
+
+ if (m_last_child_count > child_widgets.size()) {
+ bool has_child_to_fill_space = false;
+ for (auto& child : child_widgets) {
+ if (child.max_size() == Gfx::IntSize { -1, -1 }) {
+ has_child_to_fill_space = true;
+ break;
+ }
+ }
+ if (!has_child_to_fill_space)
+ child_widgets.last().set_fixed_size({ -1, -1 });
+ }
+}
+
void Splitter::mouseup_event(MouseEvent& event)
{
if (event.button() != MouseButton::Primary)
diff --git a/Userland/Libraries/LibGUI/Splitter.h b/Userland/Libraries/LibGUI/Splitter.h
index 911c6b5029..ad21a0747f 100644
--- a/Userland/Libraries/LibGUI/Splitter.h
+++ b/Userland/Libraries/LibGUI/Splitter.h
@@ -37,6 +37,7 @@ protected:
virtual void leave_event(Core::Event&) override;
virtual void did_layout() override;
+ virtual void custom_layout() override;
FixedResizee fixed_resizee() const { return m_fixed_resizee; }
void set_fixed_resizee(FixedResizee resizee) { m_fixed_resizee = resizee; }
@@ -56,6 +57,7 @@ private:
int m_first_resizee_minimum_size { 0 };
int m_second_resizee_minimum_size { 0 };
FixedResizee m_fixed_resizee { FixedResizee::First };
+ size_t m_last_child_count { 0 };
void recompute_grabbables();