From d59954489011c32c74a3ed3dea7edda8e14e852c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 10 Jun 2019 19:29:33 +0200 Subject: [PATCH] PaintBrush: Start working on a simple painting application. --- Applications/PaintBrush/.gitignore | 3 ++ Applications/PaintBrush/Makefile | 23 ++++++++++ Applications/PaintBrush/PaintableWidget.cpp | 49 +++++++++++++++++++++ Applications/PaintBrush/PaintableWidget.h | 19 ++++++++ Applications/PaintBrush/main.cpp | 18 ++++++++ Kernel/build-root-filesystem.sh | 2 + 6 files changed, 114 insertions(+) create mode 100644 Applications/PaintBrush/.gitignore create mode 100644 Applications/PaintBrush/Makefile create mode 100644 Applications/PaintBrush/PaintableWidget.cpp create mode 100644 Applications/PaintBrush/PaintableWidget.h create mode 100644 Applications/PaintBrush/main.cpp diff --git a/Applications/PaintBrush/.gitignore b/Applications/PaintBrush/.gitignore new file mode 100644 index 0000000000..30424a7dff --- /dev/null +++ b/Applications/PaintBrush/.gitignore @@ -0,0 +1,3 @@ +*.o +*.d +PaintBrush diff --git a/Applications/PaintBrush/Makefile b/Applications/PaintBrush/Makefile new file mode 100644 index 0000000000..0a10066fb6 --- /dev/null +++ b/Applications/PaintBrush/Makefile @@ -0,0 +1,23 @@ +include ../../Makefile.common + +OBJS = \ + PaintableWidget.o \ + main.o + +APP = PaintBrush + +DEFINES += -DUSERLAND + +all: $(APP) + +$(APP): $(OBJS) + $(LD) -o $(APP) $(LDFLAGS) $(OBJS) -lgui -lcore -lc + +.cpp.o: + @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $< + +-include $(OBJS:%.o=%.d) + +clean: + @echo "CLEAN"; rm -f $(APP) $(OBJS) *.d + diff --git a/Applications/PaintBrush/PaintableWidget.cpp b/Applications/PaintBrush/PaintableWidget.cpp new file mode 100644 index 0000000000..bac84d85de --- /dev/null +++ b/Applications/PaintBrush/PaintableWidget.cpp @@ -0,0 +1,49 @@ +#include "PaintableWidget.h" +#include +#include + +PaintableWidget::PaintableWidget(GWidget* parent) + : GWidget(parent) +{ + set_fill_with_background_color(true); + set_background_color(Color::LightGray); + m_bitmap = GraphicsBitmap::create(GraphicsBitmap::Format::RGB32, { 600, 400 }); + m_bitmap->fill(Color::White); +} + +PaintableWidget::~PaintableWidget() +{ +} + +void PaintableWidget::paint_event(GPaintEvent& event) +{ + GPainter painter(*this); + painter.add_clip_rect(event.rect()); + painter.blit({ 0, 0 }, *m_bitmap, m_bitmap->rect()); +} + +void PaintableWidget::mousedown_event(GMouseEvent& event) +{ + if (event.button() != GMouseButton::Left) + return; + + GPainter painter(*m_bitmap); + painter.set_pixel(event.position(), Color::Black); + update({ event.position(), { 1, 1 } }); +} + +void PaintableWidget::mouseup_event(GMouseEvent&) +{ +} + +void PaintableWidget::mousemove_event(GMouseEvent& event) +{ + if (!rect().contains(event.position())) + return; + + if (event.buttons() & GMouseButton::Left) { + GPainter painter(*m_bitmap); + painter.set_pixel(event.position(), Color::Black); + update({ event.position(), { 1, 1 } }); + } +} diff --git a/Applications/PaintBrush/PaintableWidget.h b/Applications/PaintBrush/PaintableWidget.h new file mode 100644 index 0000000000..11d25e9a8b --- /dev/null +++ b/Applications/PaintBrush/PaintableWidget.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +class PaintableWidget final : public GWidget { +public: + explicit PaintableWidget(GWidget* parent); + virtual ~PaintableWidget() override; + + virtual const char* class_name() const override { return "PaintableWidget"; } + +private: + virtual void paint_event(GPaintEvent&) override; + virtual void mousedown_event(GMouseEvent&) override; + virtual void mouseup_event(GMouseEvent&) override; + virtual void mousemove_event(GMouseEvent&) override; + + RetainPtr m_bitmap; +}; diff --git a/Applications/PaintBrush/main.cpp b/Applications/PaintBrush/main.cpp new file mode 100644 index 0000000000..b2057f75fd --- /dev/null +++ b/Applications/PaintBrush/main.cpp @@ -0,0 +1,18 @@ +#include "PaintableWidget.h" +#include +#include + +int main(int argc, char** argv) +{ + GApplication app(argc, argv); + + auto* window = new GWindow; + window->set_title("PaintBrush"); + window->set_rect(100, 100, 600, 400); + + auto* paintable_widget = new PaintableWidget(nullptr); + window->set_main_widget(paintable_widget); + + window->show(); + return app.exec(); +} diff --git a/Kernel/build-root-filesystem.sh b/Kernel/build-root-filesystem.sh index 2e2870b9d3..15cd36d86e 100755 --- a/Kernel/build-root-filesystem.sh +++ b/Kernel/build-root-filesystem.sh @@ -71,6 +71,7 @@ cp ../Applications/ProcessManager/ProcessManager mnt/bin/ProcessManager cp ../Applications/Taskbar/Taskbar mnt/bin/Taskbar cp ../Applications/Terminal/Terminal mnt/bin/Terminal cp ../Applications/TextEditor/TextEditor mnt/bin/TextEditor +cp ../Applications/PaintBrush/PaintBrush mnt/bin/PaintBrush cp ../Demos/HelloWorld/HelloWorld mnt/bin/HelloWorld cp ../Demos/RetroFetch/RetroFetch mnt/bin/RetroFetch cp ../Demos/WidgetGallery/WidgetGallery mnt/bin/WidgetGallery @@ -95,6 +96,7 @@ ln -s Taskbar mnt/bin/tb ln -s VisualBuilder mnt/bin/vb ln -s WidgetGallery mnt/bin/wg ln -s TextEditor mnt/bin/te +ln -s PaintBrush mnt/bin/pb echo "done" # Run local sync script, if it exists