mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-03 16:58:30 +03:00
LibGUI: Improve GBoxLayout so it can better support GToolBar.
Added spacing and margin concepts to GLayout. Support layout a sequence of nothing but fixed-size objects in the desired orientation. :^)
This commit is contained in:
parent
b704d3d295
commit
dc753b58a5
Notes:
sideshowbarker
2024-07-19 15:40:04 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/dc753b58a57
@ -66,25 +66,22 @@ void GBoxLayout::run(GWidget& widget)
|
|||||||
dbgprintf("GBoxLayout: automatic_size=%s\n", automatic_size.to_string().characters());
|
dbgprintf("GBoxLayout: automatic_size=%s\n", automatic_size.to_string().characters());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int current_x = 0;
|
// FIXME: We should also respect the bottom and right margins.
|
||||||
int current_y = 0;
|
int current_x = margins().left();
|
||||||
for (auto& entry : m_entries) {
|
int current_y = margins().top();
|
||||||
|
|
||||||
|
for (auto& entry : m_entries) {
|
||||||
Rect rect(current_x, current_y, 0, 0);
|
Rect rect(current_x, current_y, 0, 0);
|
||||||
if (entry.layout) {
|
if (entry.layout) {
|
||||||
// FIXME: Implement recursive layout.
|
// FIXME: Implement recursive layout.
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
ASSERT(entry.widget);
|
ASSERT(entry.widget);
|
||||||
if (entry.widget->size_policy(orientation()) == SizePolicy::Fixed) {
|
rect.set_size(automatic_size);
|
||||||
rect.set_size(automatic_size);
|
if (entry.widget->size_policy(Orientation::Vertical) == SizePolicy::Fixed)
|
||||||
if (orientation() == Orientation::Vertical) {
|
rect.set_height(entry.widget->preferred_size().height());
|
||||||
rect.set_height(entry.widget->preferred_size().height());
|
if (entry.widget->size_policy(Orientation::Horizontal) == SizePolicy::Fixed)
|
||||||
} else {
|
rect.set_width(entry.widget->preferred_size().height());
|
||||||
rect.set_width(entry.widget->preferred_size().height());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rect.set_size(automatic_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef GBOXLAYOUT_DEBUG
|
#ifdef GBOXLAYOUT_DEBUG
|
||||||
dbgprintf("GBoxLayout: apply, %s{%p} <- %s\n", entry.widget->class_name(), entry.widget.ptr(), rect.to_string().characters());
|
dbgprintf("GBoxLayout: apply, %s{%p} <- %s\n", entry.widget->class_name(), entry.widget.ptr(), rect.to_string().characters());
|
||||||
@ -92,8 +89,8 @@ void GBoxLayout::run(GWidget& widget)
|
|||||||
entry.widget->set_relative_rect(rect);
|
entry.widget->set_relative_rect(rect);
|
||||||
|
|
||||||
if (orientation() == Orientation::Horizontal)
|
if (orientation() == Orientation::Horizontal)
|
||||||
current_x += rect.width();
|
current_x += rect.width() + spacing();
|
||||||
else
|
else
|
||||||
current_y += rect.height();
|
current_y += rect.height() + spacing();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,3 +39,21 @@ void GLayout::add_widget(GWidget& widget)
|
|||||||
if (m_owner)
|
if (m_owner)
|
||||||
m_owner->notify_layout_changed(Badge<GLayout>());
|
m_owner->notify_layout_changed(Badge<GLayout>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLayout::set_spacing(int spacing)
|
||||||
|
{
|
||||||
|
if (m_spacing == spacing)
|
||||||
|
return;
|
||||||
|
m_spacing = spacing;
|
||||||
|
if (m_owner)
|
||||||
|
m_owner->notify_layout_changed(Badge<GLayout>());
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLayout::set_margins(const GMargins& margins)
|
||||||
|
{
|
||||||
|
if (m_margins == margins)
|
||||||
|
return;
|
||||||
|
m_margins = margins;
|
||||||
|
if (m_owner)
|
||||||
|
m_owner->notify_layout_changed(Badge<GLayout>());
|
||||||
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <AK/OwnPtr.h>
|
#include <AK/OwnPtr.h>
|
||||||
#include <AK/Vector.h>
|
#include <AK/Vector.h>
|
||||||
#include <AK/WeakPtr.h>
|
#include <AK/WeakPtr.h>
|
||||||
|
#include <LibGUI/GMargins.h>
|
||||||
|
|
||||||
class GWidget;
|
class GWidget;
|
||||||
|
|
||||||
@ -20,6 +21,12 @@ public:
|
|||||||
void notify_adopted(Badge<GWidget>, GWidget&);
|
void notify_adopted(Badge<GWidget>, GWidget&);
|
||||||
void notify_disowned(Badge<GWidget>, GWidget&);
|
void notify_disowned(Badge<GWidget>, GWidget&);
|
||||||
|
|
||||||
|
GMargins margins() const { return m_margins; }
|
||||||
|
void set_margins(const GMargins&);
|
||||||
|
|
||||||
|
int spacing() const { return m_spacing; }
|
||||||
|
void set_spacing(int);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct Entry {
|
struct Entry {
|
||||||
WeakPtr<GWidget> widget;
|
WeakPtr<GWidget> widget;
|
||||||
@ -27,5 +34,8 @@ protected:
|
|||||||
};
|
};
|
||||||
WeakPtr<GWidget> m_owner;
|
WeakPtr<GWidget> m_owner;
|
||||||
Vector<Entry> m_entries;
|
Vector<Entry> m_entries;
|
||||||
|
|
||||||
|
GMargins m_margins;
|
||||||
|
int m_spacing { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
40
LibGUI/GMargins.h
Normal file
40
LibGUI/GMargins.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
class GMargins {
|
||||||
|
public:
|
||||||
|
GMargins() { }
|
||||||
|
GMargins(int left, int top, int right, int bottom)
|
||||||
|
: m_left(left)
|
||||||
|
, m_top(top)
|
||||||
|
, m_right(right)
|
||||||
|
, m_bottom(bottom)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
~GMargins() { }
|
||||||
|
|
||||||
|
bool is_null() const { return !m_left && !m_top && !m_right && !m_bottom; }
|
||||||
|
|
||||||
|
int left() const { return m_left; }
|
||||||
|
int top() const { return m_top; }
|
||||||
|
int right() const { return m_right; }
|
||||||
|
int bottom() const { return m_bottom; }
|
||||||
|
|
||||||
|
void set_left(int value) { m_left = value; }
|
||||||
|
void set_top(int value) { m_top = value; }
|
||||||
|
void set_right(int value) { m_right = value; }
|
||||||
|
void set_bottom(int value) { m_bottom = value; }
|
||||||
|
|
||||||
|
bool operator==(const GMargins& other) const
|
||||||
|
{
|
||||||
|
return m_left == other.m_left
|
||||||
|
&& m_top == other.m_top
|
||||||
|
&& m_right == other.m_right
|
||||||
|
&& m_bottom == other.m_bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_left { 0 };
|
||||||
|
int m_top { 0 };
|
||||||
|
int m_right { 0 };
|
||||||
|
int m_bottom { 0 };
|
||||||
|
};
|
@ -8,8 +8,10 @@ GToolBar::GToolBar(GWidget* parent)
|
|||||||
: GWidget(parent)
|
: GWidget(parent)
|
||||||
{
|
{
|
||||||
set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
|
set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
|
||||||
set_preferred_size({ 0, 24 });
|
set_preferred_size({ 0, 25 });
|
||||||
set_layout(make<GBoxLayout>(Orientation::Horizontal));
|
set_layout(make<GBoxLayout>(Orientation::Horizontal));
|
||||||
|
layout()->set_spacing(1);
|
||||||
|
layout()->set_margins({1, 1, 1, 1});
|
||||||
}
|
}
|
||||||
|
|
||||||
GToolBar::~GToolBar()
|
GToolBar::~GToolBar()
|
||||||
@ -33,11 +35,8 @@ void GToolBar::add_action(RetainPtr<GAction>&& action)
|
|||||||
raw_action_ptr->activate();
|
raw_action_ptr->activate();
|
||||||
};
|
};
|
||||||
|
|
||||||
#if 0
|
|
||||||
// FIXME: Gotta fix GBoxLayout for this to work.
|
|
||||||
button->set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed);
|
button->set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed);
|
||||||
button->set_preferred_size({ 16, 16 });
|
button->set_preferred_size({ 22, 22 });
|
||||||
#endif
|
|
||||||
|
|
||||||
m_items.append(move(item));
|
m_items.append(move(item));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user