From 5e34e43b0f9f44823f54ab5e784ed76bc33c73ed Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 2 Sep 2019 19:45:55 +0200 Subject: [PATCH] LibGUI: Add GAboutDialog, a simple way to show a nice about box in apps --- Libraries/LibGUI/GAboutDialog.cpp | 64 +++++++++++++++++++++++++++++++ Libraries/LibGUI/GAboutDialog.h | 20 ++++++++++ Libraries/LibGUI/Makefile | 1 + 3 files changed, 85 insertions(+) create mode 100644 Libraries/LibGUI/GAboutDialog.cpp create mode 100644 Libraries/LibGUI/GAboutDialog.h diff --git a/Libraries/LibGUI/GAboutDialog.cpp b/Libraries/LibGUI/GAboutDialog.cpp new file mode 100644 index 0000000000..615c87bff2 --- /dev/null +++ b/Libraries/LibGUI/GAboutDialog.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include + +GAboutDialog::GAboutDialog(const StringView& name, const GraphicsBitmap* icon, CObject* parent) + : GDialog(parent) + , m_name(name) + , m_icon(icon) +{ + resize(230, 120); + set_title(String::format("About %s", m_name.characters())); + set_resizable(false); + + auto* widget = new GWidget; + set_main_widget(widget); + widget->set_fill_with_background_color(true); + widget->set_layout(make(Orientation::Horizontal)); + + auto* left_container = new GWidget(widget); + left_container->set_size_policy(SizePolicy::Fixed, SizePolicy::Fill); + left_container->set_preferred_size(48, 0); + left_container->set_layout(make(Orientation::Vertical)); + auto* icon_label = new GLabel(left_container); + icon_label->set_icon(m_icon); + icon_label->set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed); + icon_label->set_preferred_size(40, 40); + left_container->layout()->add_spacer(); + + auto* right_container = new GWidget(widget); + right_container->set_layout(make(Orientation::Vertical)); + right_container->layout()->set_margins({ 0, 4, 4, 4 }); + + auto make_label = [&](const StringView& text, bool bold = false) { + auto* label = new GLabel(text, right_container); + label->set_text_alignment(TextAlignment::CenterLeft); + label->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); + label->set_preferred_size(0, 14); + if (bold) + label->set_font(Font::default_bold_font()); + }; + make_label(m_name, true); + make_label("Serenity Operating System"); + make_label("(C) The Serenity Developers"); + + right_container->layout()->add_spacer(); + + auto* button_container = new GWidget(right_container); + button_container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); + button_container->set_preferred_size(0, 20); + button_container->set_layout(make(Orientation::Horizontal)); + button_container->layout()->add_spacer(); + auto* ok_button = new GButton("OK", button_container); + ok_button->set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed); + ok_button->set_preferred_size(80, 20); + ok_button->on_click = [this](auto&) { + done(GDialog::ExecOK); + }; +} + +GAboutDialog::~GAboutDialog() +{ +} diff --git a/Libraries/LibGUI/GAboutDialog.h b/Libraries/LibGUI/GAboutDialog.h new file mode 100644 index 0000000000..b4fdfe54dd --- /dev/null +++ b/Libraries/LibGUI/GAboutDialog.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +class GAboutDialog final : public GDialog { + C_OBJECT(GAboutDialog) +public: + GAboutDialog(const StringView& name, const GraphicsBitmap* icon = nullptr, CObject* parent = nullptr); + virtual ~GAboutDialog() override; + + static void show(const StringView& name, const GraphicsBitmap* icon = nullptr, CObject* parent = nullptr) + { + GAboutDialog dialog(name, icon, parent); + dialog.exec(); + } + +private: + String m_name; + RefPtr m_icon; +}; diff --git a/Libraries/LibGUI/Makefile b/Libraries/LibGUI/Makefile index 6e67e30373..43ae8f5cbc 100644 --- a/Libraries/LibGUI/Makefile +++ b/Libraries/LibGUI/Makefile @@ -53,6 +53,7 @@ OBJS = \ GListView.o \ GComboBox.o \ GJsonArrayModel.o \ + GAboutDialog.o \ GWindow.o LIBRARY = libgui.a