mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:52:45 +00:00 
			
		
		
		
	Add a little About app and hook it up to the system menu's "About..." entry.
Added icons and customizable text alignment to GLabel.
This commit is contained in:
		
							parent
							
								
									d6326d6c2e
								
							
						
					
					
						commit
						d74b131c27
					
				
					 11 changed files with 118 additions and 2 deletions
				
			
		
							
								
								
									
										3
									
								
								Applications/About/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Applications/About/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | ||||||
|  | *.o | ||||||
|  | *.d | ||||||
|  | About | ||||||
							
								
								
									
										34
									
								
								Applications/About/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Applications/About/Makefile
									
										
									
									
									
										Normal file
									
								
							|  | @ -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
									
								
								Applications/About/main.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								Applications/About/main.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -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(); | ||||||
|  | } | ||||||
|  | @ -42,6 +42,7 @@ FontEditorWidget::FontEditorWidget(const String& path, RetainPtr<Font>&& edited_ | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     auto* info_label = new GLabel(this); |     auto* info_label = new GLabel(this); | ||||||
|  |     info_label->set_text_alignment(TextAlignment::CenterLeft); | ||||||
|     info_label->set_relative_rect({ 5, 110, 100, 20 }); |     info_label->set_relative_rect({ 5, 110, 100, 20 }); | ||||||
| 
 | 
 | ||||||
|     auto* demo_label_1 = new GLabel(this); |     auto* demo_label_1 = new GLabel(this); | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								Base/res/icons/Serenity.rgb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Base/res/icons/Serenity.rgb
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -18,6 +18,8 @@ make -C ../Applications/Launcher clean && \ | ||||||
| make -C ../Applications/Launcher && \ | make -C ../Applications/Launcher && \ | ||||||
| make -C ../Applications/FileManager clean && \ | make -C ../Applications/FileManager clean && \ | ||||||
| make -C ../Applications/FileManager && \ | make -C ../Applications/FileManager && \ | ||||||
|  | make -C ../Applications/About clean && \ | ||||||
|  | make -C ../Applications/About && \ | ||||||
| make clean &&\ | make clean &&\ | ||||||
| make && \ | make && \ | ||||||
| sudo ./sync.sh | sudo ./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/Launcher/Launcher mnt/bin/Launcher | ||||||
| cp -v ../Applications/Clock/Clock mnt/bin/Clock | cp -v ../Applications/Clock/Clock mnt/bin/Clock | ||||||
| cp -v ../Applications/FileManager/FileManager mnt/bin/FileManager | cp -v ../Applications/FileManager/FileManager mnt/bin/FileManager | ||||||
|  | cp -v ../Applications/About/About mnt/bin/About | ||||||
| cp -v kernel.map mnt/ | cp -v kernel.map mnt/ | ||||||
| sh sync-local.sh | sh sync-local.sh | ||||||
| umount mnt | umount mnt | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #include "GLabel.h" | #include "GLabel.h" | ||||||
| #include <SharedGraphics/Painter.h> | #include <SharedGraphics/Painter.h> | ||||||
|  | #include <SharedGraphics/GraphicsBitmap.h> | ||||||
| 
 | 
 | ||||||
| GLabel::GLabel(GWidget* parent) | GLabel::GLabel(GWidget* parent) | ||||||
|     : 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) | void GLabel::set_text(String&& text) | ||||||
| { | { | ||||||
|     if (text == m_text) |     if (text == m_text) | ||||||
|  | @ -18,11 +24,15 @@ void GLabel::set_text(String&& text) | ||||||
|     update(); |     update(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLabel::paint_event(GPaintEvent& event) | void GLabel::paint_event(GPaintEvent&) | ||||||
| { | { | ||||||
|     Painter painter(*this); |     Painter painter(*this); | ||||||
|     if (fill_with_background_color()) |     if (fill_with_background_color()) | ||||||
|         painter.fill_rect({ 0, 0, width(), height() }, background_color()); |         painter.fill_rect({ 0, 0, width(), height() }, background_color()); | ||||||
|     if (!text().is_empty()) |     if (m_icon) { | ||||||
|         painter.draw_text({ 4, 4, width(), height() }, text(), TextAlignment::TopLeft, foreground_color()); |         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({ 0, 0, width(), height() }, text(), m_text_alignment, foreground_color()); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2,6 +2,9 @@ | ||||||
| 
 | 
 | ||||||
| #include "GWidget.h" | #include "GWidget.h" | ||||||
| #include <AK/AKString.h> | #include <AK/AKString.h> | ||||||
|  | #include <SharedGraphics/Painter.h> | ||||||
|  | 
 | ||||||
|  | class GraphicsBitmap; | ||||||
| 
 | 
 | ||||||
| class GLabel final : public GWidget { | class GLabel final : public GWidget { | ||||||
| public: | public: | ||||||
|  | @ -11,11 +14,20 @@ public: | ||||||
|     String text() const { return m_text; } |     String text() const { return m_text; } | ||||||
|     void set_text(String&&); |     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: | private: | ||||||
|     virtual void paint_event(GPaintEvent&) override; |     virtual void paint_event(GPaintEvent&) override; | ||||||
| 
 | 
 | ||||||
|     virtual const char* class_name() const override { return "GLabel"; } |     virtual const char* class_name() const override { return "GLabel"; } | ||||||
| 
 | 
 | ||||||
|     String m_text; |     String m_text; | ||||||
|  |     RetainPtr<GraphicsBitmap> m_icon; | ||||||
|  |     TextAlignment m_text_alignment { TextAlignment::Center }; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -10,6 +10,7 @@ GStatusBar::GStatusBar(GWidget* parent) | ||||||
|     set_preferred_size({ 0, 16 }); |     set_preferred_size({ 0, 16 }); | ||||||
|     set_layout(make<GBoxLayout>(Orientation::Horizontal)); |     set_layout(make<GBoxLayout>(Orientation::Horizontal)); | ||||||
|     m_label = new GLabel(this); |     m_label = new GLabel(this); | ||||||
|  |     m_label->set_text_alignment(TextAlignment::CenterLeft); | ||||||
|     m_label->set_fill_with_background_color(false); |     m_label->set_fill_with_background_color(false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -198,6 +198,11 @@ WSWindowManager::WSWindowManager() | ||||||
|                 Process::create_user_process("/bin/Terminal", 100, 100, current->pid(), error); |                 Process::create_user_process("/bin/Terminal", 100, 100, current->pid(), error); | ||||||
|                 return; |                 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()); |             kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters()); | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling