浏览代码

About+LibGUI: Use a GBoxLayout for the About app.

Andreas Kling 6 年之前
父节点
当前提交
b8f999cbef
共有 3 个文件被更改,包括 38 次插入14 次删除
  1. 15 8
      Applications/About/main.cpp
  2. 17 6
      LibGUI/GBoxLayout.cpp
  3. 6 0
      SharedGraphics/Rect.h

+ 15 - 8
Applications/About/main.cpp

@@ -2,6 +2,7 @@
 #include <LibGUI/GWindow.h>
 #include <LibGUI/GLabel.h>
 #include <LibGUI/GButton.h>
+#include <LibGUI/GBoxLayout.h>
 #include <sys/utsname.h>
 
 int main(int argc, char** argv)
@@ -10,23 +11,27 @@ int main(int argc, char** argv)
 
     auto* window = new GWindow;
     window->set_title("About Serenity");
-    window->set_rect(362, 284, 240, 130);
+    Rect window_rect { 0, 0, 240, 120 };
+    window_rect.center_within({ 0, 0, 1024, 768 });
+    window->set_rect(window_rect);
     window->set_should_exit_app_on_close(true);
 
     auto* widget = new GWidget;
     window->set_main_widget(widget);
+    widget->set_layout(make<GBoxLayout>(Orientation::Vertical));
+    widget->layout()->set_margins({ 0, 8, 0, 8 });
+    widget->layout()->set_spacing(8);
 
     auto* icon_label = new GLabel(widget);
     icon_label->set_icon(GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/Serenity.rgb", { 32, 32 }));
-    icon_label->set_relative_rect(
-        widget->rect().center().x() - 16,
-        10,
-        32, 32);
+    icon_label->set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed);
+    icon_label->set_preferred_size({ 32, 32 });
 
     auto* label = new GLabel(widget);
     label->set_font(Font::default_bold_font());
     label->set_text("Serenity Operating System");
-    label->set_relative_rect(0, 50, widget->width(), 20);
+    label->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
+    label->set_preferred_size({ 0, 11 });
 
     utsname uts;
     int rc = uname(&uts);
@@ -34,11 +39,13 @@ int main(int argc, char** argv)
 
     auto* version_label = new GLabel(widget);
     version_label->set_text(String::format("Version %s", uts.release));
-    version_label->set_relative_rect(0, 70, widget->width(), 20);
+    version_label->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
+    version_label->set_preferred_size({ 0, 11 });
 
     auto* quit_button = new GButton(widget);
     quit_button->set_caption("Okay");
-    quit_button->set_relative_rect(80, 100, widget->width() - 160, 20);
+    quit_button->set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed);
+    quit_button->set_preferred_size({ 100, 20 });
     quit_button->on_click = [] (GButton&) {
         GApplication::the().quit(0);
     };

+ 17 - 6
LibGUI/GBoxLayout.cpp

@@ -3,6 +3,10 @@
 
 //#define GBOXLAYOUT_DEBUG
 
+#ifdef GBOXLAYOUT_DEBUG
+#include <stdio.h>
+#endif
+
 GBoxLayout::GBoxLayout(Orientation orientation)
     : m_orientation(orientation)
 {
@@ -47,7 +51,7 @@ void GBoxLayout::run(GWidget& widget)
     int number_of_entries_with_automatic_size = m_entries.size() - number_of_entries_with_fixed_size;
 
 #ifdef GBOXLAYOUT_DEBUG
-    dbgprintf("GBoxLayout: available_size=%d, fixed=%d, fill=%d\n", available_size.height(), number_of_entries_with_fixed_size, number_of_entries_with_automatic_size);
+    printf("GBoxLayout: available_size=%s, fixed=%d, fill=%d\n", available_size.to_string().characters(), number_of_entries_with_fixed_size, number_of_entries_with_automatic_size);
 #endif
 
     Size automatic_size;
@@ -63,7 +67,7 @@ void GBoxLayout::run(GWidget& widget)
     }
 
 #ifdef GBOXLAYOUT_DEBUG
-    dbgprintf("GBoxLayout: automatic_size=%s\n", automatic_size.to_string().characters());
+    printf("GBoxLayout: automatic_size=%s\n", automatic_size.to_string().characters());
 #endif
 
     int current_x = margins().left();
@@ -76,19 +80,26 @@ void GBoxLayout::run(GWidget& widget)
             ASSERT_NOT_REACHED();
         }
         ASSERT(entry.widget);
-        rect.set_size({ automatic_size.width() - margins().left() - margins().right(), automatic_size.height() - margins().top() - margins().bottom() });
+        rect.set_size(automatic_size.width() - margins().left() - margins().right(), automatic_size.height() - margins().top() - margins().bottom());
+
         if (entry.widget->size_policy(Orientation::Vertical) == SizePolicy::Fixed)
             rect.set_height(entry.widget->preferred_size().height());
+
         if (entry.widget->size_policy(Orientation::Horizontal) == SizePolicy::Fixed)
             rect.set_width(entry.widget->preferred_size().width());
 
-        if (orientation() == Orientation::Horizontal)
+        if (orientation() == Orientation::Horizontal) {
+            if (entry.widget->size_policy(Orientation::Vertical) == SizePolicy::Fill)
+                rect.set_height(widget.height() - margins().top() - margins().bottom());
             rect.center_vertically_within(widget.rect());
-        else
+        } else {
+            if (entry.widget->size_policy(Orientation::Horizontal) == SizePolicy::Fill)
+                rect.set_width(widget.width() - margins().left() - margins().right());
             rect.center_horizontally_within(widget.rect());
+        }
 
 #ifdef GBOXLAYOUT_DEBUG
-        dbgprintf("GBoxLayout: apply, %s{%p} <- %s\n", entry.widget->class_name(), entry.widget.ptr(), rect.to_string().characters());
+        printf("GBoxLayout: apply, %s{%p} <- %s\n", entry.widget->class_name(), entry.widget.ptr(), rect.to_string().characters());
 #endif
         entry.widget->set_relative_rect(rect);
 

+ 6 - 0
SharedGraphics/Rect.h

@@ -62,6 +62,12 @@ public:
         m_size = size;
     }
 
+    void set_size(int width, int height)
+    {
+        m_size.set_width(width);
+        m_size.set_height(height);
+    }
+
     void inflate(int w, int h)
     {
         set_x(x() - w / 2);