From d74b131c272a433d328a2863af8ef57f43fd8a56 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 12 Feb 2019 15:23:07 +0100 Subject: [PATCH] Add a little About app and hook it up to the system menu's "About..." entry. Added icons and customizable text alignment to GLabel. --- Applications/About/.gitignore | 3 ++ Applications/About/Makefile | 34 ++++++++++++++++++ Applications/About/main.cpp | 47 +++++++++++++++++++++++++ Applications/FontEditor/FontEditor.cpp | 1 + Base/res/icons/Serenity.rgb | Bin 0 -> 4096 bytes Kernel/makeall.sh | 2 ++ Kernel/sync.sh | 1 + LibGUI/GLabel.cpp | 14 ++++++-- LibGUI/GLabel.h | 12 +++++++ LibGUI/GStatusBar.cpp | 1 + WindowServer/WSWindowManager.cpp | 5 +++ 11 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 Applications/About/.gitignore create mode 100644 Applications/About/Makefile create mode 100644 Applications/About/main.cpp create mode 100644 Base/res/icons/Serenity.rgb diff --git a/Applications/About/.gitignore b/Applications/About/.gitignore new file mode 100644 index 0000000000..17f634a6a2 --- /dev/null +++ b/Applications/About/.gitignore @@ -0,0 +1,3 @@ +*.o +*.d +About diff --git a/Applications/About/Makefile b/Applications/About/Makefile new file mode 100644 index 0000000000..3b84f7c2e7 --- /dev/null +++ b/Applications/About/Makefile @@ -0,0 +1,34 @@ +OBJS = \ + main.o + +APP = About + +ARCH_FLAGS = +STANDARD_FLAGS = -std=c++17 -nostdinc++ -nostdlib -nostdinc +USERLAND_FLAGS = -ffreestanding -fno-stack-protector -fno-ident +WARNING_FLAGS = -Wextra -Wall -Wundef -Wcast-qual -Wwrite-strings +FLAVOR_FLAGS = -march=i386 -m32 -fno-exceptions -fno-rtti -fmerge-all-constants -fno-unroll-loops -fno-pie -fno-pic +OPTIMIZATION_FLAGS = -Oz -fno-asynchronous-unwind-tables +INCLUDE_FLAGS = -I../.. -I. -I../../LibC + +DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND + +CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(USERLAND_FLAGS) $(FLAVOR_FLAGS) $(ARCH_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) +CXX = clang +LD = ld +AR = ar +LDFLAGS = -static --strip-debug -melf_i386 -e _start --gc-sections + +all: $(APP) + +$(APP): $(OBJS) + $(LD) -o $(APP) $(LDFLAGS) $(OBJS) ../../LibGUI/LibGUI.a ../../LibC/LibC.a + +.cpp.o: + @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $< + +-include $(OBJS:%.o=%.d) + +clean: + @echo "CLEAN"; rm -f $(APPS) $(OBJS) *.d + diff --git a/Applications/About/main.cpp b/Applications/About/main.cpp new file mode 100644 index 0000000000..ead9a03808 --- /dev/null +++ b/Applications/About/main.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + GApplication app(argc, argv); + + auto* window = new GWindow; + window->set_title("About Serenity"); + window->set_rect(362, 284, 240, 130); + window->set_should_exit_app_on_close(true); + + auto* widget = new GWidget; + window->set_main_widget(widget); + + auto* icon_label = new GLabel(widget); + icon_label->set_icon(GraphicsBitmap::load_from_file("/res/icons/Serenity.rgb", { 32, 32 })); + icon_label->set_relative_rect( + widget->rect().center().x() - 16, + 10, + 32, 32); + + auto* label = new GLabel(widget); + label->set_text("Serenity Operating System"); + label->set_relative_rect(0, 50, widget->width(), 20); + + utsname uts; + int rc = uname(&uts); + ASSERT(rc == 0); + + 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); + + auto* quit_button = new GButton(widget); + quit_button->set_caption("Okay"); + quit_button->set_relative_rect(80, 100, widget->width() - 160, 20); + quit_button->on_click = [] (GButton&) { + GApplication::the().exit(0); + }; + + window->show(); + return app.exec(); +} diff --git a/Applications/FontEditor/FontEditor.cpp b/Applications/FontEditor/FontEditor.cpp index 6d2e0c346e..1fd1431762 100644 --- a/Applications/FontEditor/FontEditor.cpp +++ b/Applications/FontEditor/FontEditor.cpp @@ -42,6 +42,7 @@ FontEditorWidget::FontEditorWidget(const String& path, RetainPtr&& edited_ }; auto* info_label = new GLabel(this); + info_label->set_text_alignment(TextAlignment::CenterLeft); info_label->set_relative_rect({ 5, 110, 100, 20 }); auto* demo_label_1 = new GLabel(this); diff --git a/Base/res/icons/Serenity.rgb b/Base/res/icons/Serenity.rgb new file mode 100644 index 0000000000000000000000000000000000000000..7cdfbbaca2a11d34d8397a21669720496d2331d9 GIT binary patch literal 4096 zcmc(g-3^2w41lX74&)Z<2u$EBx7$6r8%N=qa2`LRX)$Ruh%MQcp?jXu1@1A^Q_u$9wz4+uV%|E;M;K%Ng{FJ*i|LiWs&$&zTQ|@7m z_xvllOZX!{@6LPvm)(ua%lQ7|dY`=#t?jPtZmd$qj-%gy?19;s=ho@aka_msb+JMkS8$omQZ E15fgbxc~qF literal 0 HcmV?d00001 diff --git a/Kernel/makeall.sh b/Kernel/makeall.sh index 5e3a145c75..e119d66d9f 100755 --- a/Kernel/makeall.sh +++ b/Kernel/makeall.sh @@ -18,6 +18,8 @@ make -C ../Applications/Launcher clean && \ make -C ../Applications/Launcher && \ make -C ../Applications/FileManager clean && \ make -C ../Applications/FileManager && \ +make -C ../Applications/About clean && \ +make -C ../Applications/About && \ make clean &&\ make && \ sudo ./sync.sh diff --git a/Kernel/sync.sh b/Kernel/sync.sh index 0f46f2ef5d..c4b8fef6c1 100755 --- a/Kernel/sync.sh +++ b/Kernel/sync.sh @@ -69,6 +69,7 @@ cp -v ../Applications/FontEditor/FontEditor mnt/bin/FontEditor cp -v ../Applications/Launcher/Launcher mnt/bin/Launcher cp -v ../Applications/Clock/Clock mnt/bin/Clock cp -v ../Applications/FileManager/FileManager mnt/bin/FileManager +cp -v ../Applications/About/About mnt/bin/About cp -v kernel.map mnt/ sh sync-local.sh umount mnt diff --git a/LibGUI/GLabel.cpp b/LibGUI/GLabel.cpp index dde70f1fc4..ef9813a07a 100644 --- a/LibGUI/GLabel.cpp +++ b/LibGUI/GLabel.cpp @@ -1,5 +1,6 @@ #include "GLabel.h" #include +#include GLabel::GLabel(GWidget* parent) : GWidget(parent) @@ -10,6 +11,11 @@ GLabel::~GLabel() { } +void GLabel::set_icon(RetainPtr&& icon) +{ + m_icon = move(icon); +} + void GLabel::set_text(String&& text) { if (text == m_text) @@ -18,11 +24,15 @@ void GLabel::set_text(String&& text) update(); } -void GLabel::paint_event(GPaintEvent& event) +void GLabel::paint_event(GPaintEvent&) { Painter painter(*this); if (fill_with_background_color()) painter.fill_rect({ 0, 0, width(), height() }, background_color()); + if (m_icon) { + auto icon_location = rect().center().translated(-(m_icon->width() / 2), -(m_icon->height() / 2)); + painter.blit_with_alpha(icon_location, *m_icon, m_icon->rect()); + } if (!text().is_empty()) - painter.draw_text({ 4, 4, width(), height() }, text(), TextAlignment::TopLeft, foreground_color()); + painter.draw_text({ 0, 0, width(), height() }, text(), m_text_alignment, foreground_color()); } diff --git a/LibGUI/GLabel.h b/LibGUI/GLabel.h index 4e1446ffee..f84a5dc3b5 100644 --- a/LibGUI/GLabel.h +++ b/LibGUI/GLabel.h @@ -2,6 +2,9 @@ #include "GWidget.h" #include +#include + +class GraphicsBitmap; class GLabel final : public GWidget { public: @@ -11,11 +14,20 @@ public: String text() const { return m_text; } void set_text(String&&); + void set_icon(RetainPtr&&); + const GraphicsBitmap* icon() const { return m_icon.ptr(); } + GraphicsBitmap* icon() { return m_icon.ptr(); } + + TextAlignment text_alignment() const { return m_text_alignment; } + void set_text_alignment(TextAlignment text_alignment) { m_text_alignment = text_alignment; } + private: virtual void paint_event(GPaintEvent&) override; virtual const char* class_name() const override { return "GLabel"; } String m_text; + RetainPtr m_icon; + TextAlignment m_text_alignment { TextAlignment::Center }; }; diff --git a/LibGUI/GStatusBar.cpp b/LibGUI/GStatusBar.cpp index a8b7232428..77e38090be 100644 --- a/LibGUI/GStatusBar.cpp +++ b/LibGUI/GStatusBar.cpp @@ -10,6 +10,7 @@ GStatusBar::GStatusBar(GWidget* parent) set_preferred_size({ 0, 16 }); set_layout(make(Orientation::Horizontal)); m_label = new GLabel(this); + m_label->set_text_alignment(TextAlignment::CenterLeft); m_label->set_fill_with_background_color(false); } diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index 1fb86b8657..6d2f6744f0 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -198,6 +198,11 @@ WSWindowManager::WSWindowManager() Process::create_user_process("/bin/Terminal", 100, 100, current->pid(), error); return; } + if (item.identifier() == 4) { + int error; + Process::create_user_process("/bin/About", 100, 100, current->pid(), error); + return; + } kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters()); }; }