Просмотр исходного кода

Add a little About app and hook it up to the system menu's "About..." entry.

Added icons and customizable text alignment to GLabel.
Andreas Kling 6 лет назад
Родитель
Сommit
d74b131c27

+ 3 - 0
Applications/About/.gitignore

@@ -0,0 +1,3 @@
+*.o
+*.d
+About

+ 34 - 0
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
+

+ 47 - 0
Applications/About/main.cpp

@@ -0,0 +1,47 @@
+#include <LibGUI/GApplication.h>
+#include <LibGUI/GWindow.h>
+#include <LibGUI/GLabel.h>
+#include <LibGUI/GButton.h>
+#include <sys/utsname.h>
+
+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();
+}

+ 1 - 0
Applications/FontEditor/FontEditor.cpp

@@ -42,6 +42,7 @@ FontEditorWidget::FontEditorWidget(const String& path, RetainPtr<Font>&& 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);

BIN
Base/res/icons/Serenity.rgb


+ 2 - 0
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

+ 1 - 0
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

+ 12 - 2
LibGUI/GLabel.cpp

@@ -1,5 +1,6 @@
 #include "GLabel.h"
 #include <SharedGraphics/Painter.h>
+#include <SharedGraphics/GraphicsBitmap.h>
 
 GLabel::GLabel(GWidget* parent)
     : GWidget(parent)
@@ -10,6 +11,11 @@ GLabel::~GLabel()
 {
 }
 
+void GLabel::set_icon(RetainPtr<GraphicsBitmap>&& 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());
 }

+ 12 - 0
LibGUI/GLabel.h

@@ -2,6 +2,9 @@
 
 #include "GWidget.h"
 #include <AK/AKString.h>
+#include <SharedGraphics/Painter.h>
+
+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<GraphicsBitmap>&&);
+    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<GraphicsBitmap> m_icon;
+    TextAlignment m_text_alignment { TextAlignment::Center };
 };
 

+ 1 - 0
LibGUI/GStatusBar.cpp

@@ -10,6 +10,7 @@ GStatusBar::GStatusBar(GWidget* parent)
     set_preferred_size({ 0, 16 });
     set_layout(make<GBoxLayout>(Orientation::Horizontal));
     m_label = new GLabel(this);
+    m_label->set_text_alignment(TextAlignment::CenterLeft);
     m_label->set_fill_with_background_color(false);
 }
 

+ 5 - 0
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());
         };
     }