mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 02:48:11 +00:00
LibGUI: Rewrite layout system in terms of min and max sizes
This patch removes size policies and preferred sizes, and replaces them with min-size and max-size for each widget. Box layout now works in 3 passes: 1) Set all items (widgets/spacers) to their min-size 2) Distribute remaining space evenly, respecting max-size 3) Place widgets one after the other, adding spacing in between I've also added convenience helpers for setting a fixed size (which is the same as setting min-size and max-size to the same value.) This significantly reduces the verbosity of widget layout and makes GML a bit more pleasant to write, too. :^)
This commit is contained in:
parent
b2bba5ce5c
commit
7dc5a3ead8
83 changed files with 444 additions and 957 deletions
|
@ -54,38 +54,32 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
main_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
main_container.layout()->set_margins({ 4, 4, 4, 4 });
|
||||
main_container.set_background_role(Gfx::ColorRole::SyntaxKeyword);
|
||||
main_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
|
||||
// Top-Left Glyph Editor and info
|
||||
auto& editor_container = main_container.add<GUI::Widget>();
|
||||
editor_container.set_layout<GUI::VerticalBoxLayout>();
|
||||
editor_container.layout()->set_margins({ 4, 4, 4, 4 });
|
||||
editor_container.set_background_role(Gfx::ColorRole::SyntaxKeyword);
|
||||
editor_container.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
|
||||
m_glyph_editor_widget = editor_container.add<GlyphEditorWidget>(*m_edited_font);
|
||||
m_glyph_editor_widget->set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed);
|
||||
m_glyph_editor_widget->set_preferred_size(m_glyph_editor_widget->preferred_width(), m_glyph_editor_widget->preferred_height());
|
||||
m_glyph_editor_widget->set_fixed_size(m_glyph_editor_widget->preferred_width(), m_glyph_editor_widget->preferred_height());
|
||||
|
||||
editor_container.set_preferred_size(m_glyph_editor_widget->preferred_width(), 0);
|
||||
editor_container.set_fixed_width(m_glyph_editor_widget->preferred_width());
|
||||
|
||||
auto& glyph_width_label = editor_container.add<GUI::Label>();
|
||||
glyph_width_label.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
glyph_width_label.set_preferred_size(0, 22);
|
||||
glyph_width_label.set_fixed_height(22);
|
||||
glyph_width_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
glyph_width_label.set_text("Glyph width:");
|
||||
|
||||
auto& glyph_width_spinbox = editor_container.add<GUI::SpinBox>();
|
||||
glyph_width_spinbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
glyph_width_spinbox.set_preferred_size(0, 22);
|
||||
glyph_width_spinbox.set_fixed_height(22);
|
||||
glyph_width_spinbox.set_min(0);
|
||||
glyph_width_spinbox.set_max(32);
|
||||
glyph_width_spinbox.set_value(0);
|
||||
glyph_width_spinbox.set_enabled(!m_edited_font->is_fixed_width());
|
||||
|
||||
auto& info_label = editor_container.add<GUI::Label>();
|
||||
info_label.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
info_label.set_preferred_size(0, 22);
|
||||
info_label.set_fixed_height(22);
|
||||
info_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
info_label.set_text("info_label");
|
||||
|
||||
|
@ -94,50 +88,41 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
auto& map_and_test_container = main_container.add<GUI::Widget>();
|
||||
map_and_test_container.set_layout<GUI::VerticalBoxLayout>();
|
||||
map_and_test_container.layout()->set_margins({ 4, 4, 4, 4 });
|
||||
map_and_test_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
|
||||
m_glyph_map_widget = map_and_test_container.add<GlyphMapWidget>(*m_edited_font);
|
||||
m_glyph_map_widget->set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed);
|
||||
m_glyph_map_widget->set_preferred_size(m_glyph_map_widget->preferred_width(), m_glyph_map_widget->preferred_height());
|
||||
m_glyph_map_widget->set_fixed_size(m_glyph_map_widget->preferred_width(), m_glyph_map_widget->preferred_height());
|
||||
|
||||
auto& font_mtest_group_box = map_and_test_container.add<GUI::GroupBox>();
|
||||
font_mtest_group_box.set_layout<GUI::VerticalBoxLayout>();
|
||||
font_mtest_group_box.layout()->set_margins({ 5, 15, 5, 5 });
|
||||
font_mtest_group_box.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
font_mtest_group_box.set_preferred_size(0, 2 * m_edited_font->glyph_height() + 50);
|
||||
font_mtest_group_box.set_fixed_height(2 * m_edited_font->glyph_height() + 50);
|
||||
font_mtest_group_box.set_title("Test");
|
||||
|
||||
auto& demo_label_1 = font_mtest_group_box.add<GUI::Label>();
|
||||
demo_label_1.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
demo_label_1.set_font(m_edited_font);
|
||||
demo_label_1.set_text("quick fox jumps nightly above wizard.");
|
||||
|
||||
auto& demo_label_2 = font_mtest_group_box.add<GUI::Label>();
|
||||
demo_label_2.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
demo_label_2.set_font(m_edited_font);
|
||||
demo_label_2.set_text("QUICK FOX JUMPS NIGHTLY ABOVE WIZARD!");
|
||||
|
||||
auto& font_metadata_group_box = map_and_test_container.add<GUI::GroupBox>();
|
||||
font_metadata_group_box.set_layout<GUI::VerticalBoxLayout>();
|
||||
font_metadata_group_box.layout()->set_margins({ 5, 15, 5, 5 });
|
||||
font_metadata_group_box.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
font_metadata_group_box.set_preferred_size(0, 275);
|
||||
font_metadata_group_box.set_fixed_height(275);
|
||||
font_metadata_group_box.set_title("Font metadata");
|
||||
|
||||
//// Name Row
|
||||
auto& namecontainer = font_metadata_group_box.add<GUI::Widget>();
|
||||
namecontainer.set_layout<GUI::HorizontalBoxLayout>();
|
||||
namecontainer.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
namecontainer.set_preferred_size(0, 22);
|
||||
namecontainer.set_fixed_height(22);
|
||||
|
||||
auto& name_label = namecontainer.add<GUI::Label>();
|
||||
name_label.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
name_label.set_preferred_size(100, 0);
|
||||
name_label.set_fixed_width(100);
|
||||
name_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
name_label.set_text("Name:");
|
||||
|
||||
auto& name_textbox = namecontainer.add<GUI::TextBox>();
|
||||
name_textbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
name_textbox.set_text(m_edited_font->name());
|
||||
name_textbox.on_change = [&] {
|
||||
m_edited_font->set_name(name_textbox.text());
|
||||
|
@ -146,17 +131,14 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
//// Family Row
|
||||
auto& family_container = font_metadata_group_box.add<GUI::Widget>();
|
||||
family_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
family_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
family_container.set_preferred_size(0, 22);
|
||||
family_container.set_fixed_height(22);
|
||||
|
||||
auto& family_label = family_container.add<GUI::Label>();
|
||||
family_label.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
family_label.set_preferred_size(100, 0);
|
||||
family_label.set_fixed_width(100);
|
||||
family_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
family_label.set_text("Family:");
|
||||
|
||||
auto& family_textbox = family_container.add<GUI::TextBox>();
|
||||
family_textbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
family_textbox.set_text(m_edited_font->family());
|
||||
family_textbox.on_change = [&] {
|
||||
m_edited_font->set_family(family_textbox.text());
|
||||
|
@ -165,17 +147,14 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
//// Presentation size Row
|
||||
auto& presentation_size_container = font_metadata_group_box.add<GUI::Widget>();
|
||||
presentation_size_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
presentation_size_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
presentation_size_container.set_preferred_size(0, 22);
|
||||
presentation_size_container.set_fixed_height(22);
|
||||
|
||||
auto& presentation_size_label = presentation_size_container.add<GUI::Label>();
|
||||
presentation_size_label.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
presentation_size_label.set_preferred_size(100, 0);
|
||||
presentation_size_label.set_fixed_width(100);
|
||||
presentation_size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
presentation_size_label.set_text("Presentation size:");
|
||||
|
||||
auto& presentation_size_spinbox = presentation_size_container.add<GUI::SpinBox>();
|
||||
presentation_size_spinbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
presentation_size_spinbox.set_min(0);
|
||||
presentation_size_spinbox.set_max(255);
|
||||
presentation_size_spinbox.set_value(m_edited_font->presentation_size());
|
||||
|
@ -183,17 +162,14 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
//// Weight Row
|
||||
auto& weight_container = font_metadata_group_box.add<GUI::Widget>();
|
||||
weight_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
weight_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
weight_container.set_preferred_size(0, 22);
|
||||
weight_container.set_fixed_height(22);
|
||||
|
||||
auto& weight_label = weight_container.add<GUI::Label>();
|
||||
weight_label.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
weight_label.set_preferred_size(100, 0);
|
||||
weight_label.set_fixed_width(100);
|
||||
weight_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
weight_label.set_text("Weight:");
|
||||
|
||||
auto& weight_spinbox = weight_container.add<GUI::SpinBox>();
|
||||
weight_spinbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
weight_spinbox.set_min(0);
|
||||
weight_spinbox.set_max(65535);
|
||||
weight_spinbox.set_value(m_edited_font->weight());
|
||||
|
@ -201,17 +177,14 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
//// Glyph spacing Row
|
||||
auto& glyph_spacing_container = font_metadata_group_box.add<GUI::Widget>();
|
||||
glyph_spacing_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
glyph_spacing_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
glyph_spacing_container.set_preferred_size(0, 22);
|
||||
glyph_spacing_container.set_fixed_height(22);
|
||||
|
||||
auto& glyph_spacing = glyph_spacing_container.add<GUI::Label>();
|
||||
glyph_spacing.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
glyph_spacing.set_preferred_size(100, 0);
|
||||
glyph_spacing.set_fixed_width(100);
|
||||
glyph_spacing.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
glyph_spacing.set_text("Glyph spacing:");
|
||||
|
||||
auto& spacing_spinbox = glyph_spacing_container.add<GUI::SpinBox>();
|
||||
spacing_spinbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
spacing_spinbox.set_min(0);
|
||||
spacing_spinbox.set_max(255);
|
||||
spacing_spinbox.set_value(m_edited_font->glyph_spacing());
|
||||
|
@ -219,17 +192,14 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
//// Glyph Height Row
|
||||
auto& glyph_height_container = font_metadata_group_box.add<GUI::Widget>();
|
||||
glyph_height_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
glyph_height_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
glyph_height_container.set_preferred_size(0, 22);
|
||||
glyph_height_container.set_fixed_height(22);
|
||||
|
||||
auto& glyph_height = glyph_height_container.add<GUI::Label>();
|
||||
glyph_height.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
glyph_height.set_preferred_size(100, 0);
|
||||
glyph_height.set_fixed_width(100);
|
||||
glyph_height.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
glyph_height.set_text("Glyph height:");
|
||||
|
||||
auto& glyph_height_spinbox = glyph_height_container.add<GUI::SpinBox>();
|
||||
glyph_height_spinbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
glyph_height_spinbox.set_min(0);
|
||||
glyph_height_spinbox.set_max(255);
|
||||
glyph_height_spinbox.set_value(m_edited_font->glyph_height());
|
||||
|
@ -238,17 +208,14 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
//// Glyph width Row
|
||||
auto& glyph_weight_container = font_metadata_group_box.add<GUI::Widget>();
|
||||
glyph_weight_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
glyph_weight_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
glyph_weight_container.set_preferred_size(0, 22);
|
||||
glyph_weight_container.set_fixed_height(22);
|
||||
|
||||
auto& glyph_header_width_label = glyph_weight_container.add<GUI::Label>();
|
||||
glyph_header_width_label.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
glyph_header_width_label.set_preferred_size(100, 0);
|
||||
glyph_header_width_label.set_fixed_width(100);
|
||||
glyph_header_width_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
glyph_header_width_label.set_text("Glyph width:");
|
||||
|
||||
auto& glyph_header_width_spinbox = glyph_weight_container.add<GUI::SpinBox>();
|
||||
glyph_header_width_spinbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
glyph_header_width_spinbox.set_min(0);
|
||||
glyph_header_width_spinbox.set_max(255);
|
||||
glyph_header_width_spinbox.set_value(m_edited_font->glyph_fixed_width());
|
||||
|
@ -257,18 +224,14 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
//// Baseline Row
|
||||
auto& baseline_container = font_metadata_group_box.add<GUI::Widget>();
|
||||
baseline_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
baseline_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
baseline_container.set_preferred_size(0, 22);
|
||||
baseline_container.set_fixed_height(22);
|
||||
|
||||
auto& baseline_label = baseline_container.add<GUI::Label>();
|
||||
baseline_label.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
baseline_label.set_preferred_size(100, 0);
|
||||
baseline_label.set_fixed_width(100);
|
||||
baseline_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
baseline_label.set_text("Baseline:");
|
||||
|
||||
auto& baseline_spinbox = baseline_container.add<GUI::SpinBox>();
|
||||
baseline_spinbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
baseline_spinbox.set_preferred_size(100, 0);
|
||||
baseline_spinbox.set_min(0);
|
||||
baseline_spinbox.set_max(m_edited_font->glyph_height() - 1);
|
||||
baseline_spinbox.set_value(m_edited_font->baseline());
|
||||
|
@ -276,26 +239,21 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
//// Mean line Row
|
||||
auto& mean_line_container = font_metadata_group_box.add<GUI::Widget>();
|
||||
mean_line_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
mean_line_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
mean_line_container.set_preferred_size(0, 22);
|
||||
mean_line_container.set_fixed_height(22);
|
||||
|
||||
auto& mean_line_label = mean_line_container.add<GUI::Label>();
|
||||
mean_line_label.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
mean_line_label.set_preferred_size(100, 0);
|
||||
mean_line_label.set_fixed_width(100);
|
||||
mean_line_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
|
||||
mean_line_label.set_text("Mean Line:");
|
||||
|
||||
auto& mean_line_spinbox = mean_line_container.add<GUI::SpinBox>();
|
||||
mean_line_spinbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill);
|
||||
mean_line_spinbox.set_preferred_size(100, 0);
|
||||
mean_line_spinbox.set_min(0);
|
||||
mean_line_spinbox.set_max(m_edited_font->glyph_height() - 1);
|
||||
mean_line_spinbox.set_value(m_edited_font->mean_line());
|
||||
|
||||
//// Fixed checkbox Row
|
||||
auto& fixed_width_checkbox = font_metadata_group_box.add<GUI::CheckBox>();
|
||||
fixed_width_checkbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
fixed_width_checkbox.set_preferred_size(0, 22);
|
||||
fixed_width_checkbox.set_fixed_height(22);
|
||||
fixed_width_checkbox.set_text("Fixed width");
|
||||
fixed_width_checkbox.set_checked(m_edited_font->is_fixed_width());
|
||||
|
||||
|
@ -303,20 +261,17 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::Font>&& edite
|
|||
auto& bottom_container = add<GUI::Widget>();
|
||||
bottom_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||
bottom_container.layout()->set_margins({ 8, 0, 8, 8 });
|
||||
bottom_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed);
|
||||
bottom_container.set_preferred_size(0, 32);
|
||||
bottom_container.set_fixed_height(32);
|
||||
|
||||
bottom_container.layout()->add_spacer();
|
||||
|
||||
auto& save_button = bottom_container.add<GUI::Button>();
|
||||
save_button.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
save_button.set_preferred_size(80, 0);
|
||||
save_button.set_fixed_size(80, 22);
|
||||
save_button.set_text("Save");
|
||||
save_button.on_click = [this](auto) { save_as(m_path); };
|
||||
|
||||
auto& quit_button = bottom_container.add<GUI::Button>();
|
||||
quit_button.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fill);
|
||||
quit_button.set_preferred_size(80, 0);
|
||||
quit_button.set_fixed_size(80, 22);
|
||||
quit_button.set_text("Quit");
|
||||
quit_button.on_click = [](auto) {
|
||||
exit(0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue