diff --git a/Applications/PixelPaint/Image.cpp b/Applications/PixelPaint/Image.cpp index 9e945fa836..84d8d74aa7 100644 --- a/Applications/PixelPaint/Image.cpp +++ b/Applications/PixelPaint/Image.cpp @@ -71,6 +71,8 @@ void Image::add_layer(NonnullRefPtr layer) for (auto* client : m_clients) client->image_did_add_layer(m_layers.size() - 1); + + did_modify_layer_stack(); } size_t Image::index_of(const Layer& layer) const diff --git a/Applications/PixelPaint/Layer.cpp b/Applications/PixelPaint/Layer.cpp index 9de9ff41de..b8dc2cf763 100644 --- a/Applications/PixelPaint/Layer.cpp +++ b/Applications/PixelPaint/Layer.cpp @@ -41,6 +41,17 @@ RefPtr Layer::create_with_size(Image& image, const Gfx::IntSize& size, co return adopt(*new Layer(image, size, name)); } +RefPtr Layer::create_with_bitmap(Image& image, const Gfx::Bitmap& bitmap, const String& name) +{ + if (bitmap.size().is_empty()) + return nullptr; + + if (bitmap.size().width() > 16384 || bitmap.size().height() > 16384) + return nullptr; + + return adopt(*new Layer(image, bitmap, name)); +} + Layer::Layer(Image& image, const Gfx::IntSize& size, const String& name) : m_image(image) , m_name(name) @@ -48,6 +59,13 @@ Layer::Layer(Image& image, const Gfx::IntSize& size, const String& name) m_bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::RGBA32, size); } +Layer::Layer(Image& image, const Gfx::Bitmap& bitmap, const String& name) + : m_image(image) + , m_name(name) + , m_bitmap(bitmap) +{ +} + void Layer::did_modify_bitmap(Image& image) { image.layer_did_modify_bitmap({}, *this); diff --git a/Applications/PixelPaint/Layer.h b/Applications/PixelPaint/Layer.h index f7ef404a7a..5e91ad9ad6 100644 --- a/Applications/PixelPaint/Layer.h +++ b/Applications/PixelPaint/Layer.h @@ -45,6 +45,7 @@ class Layer public: static RefPtr create_with_size(Image&, const Gfx::IntSize&, const String& name); + static RefPtr create_with_bitmap(Image&, const Gfx::Bitmap&, const String& name); ~Layer() { } @@ -75,7 +76,8 @@ public: void set_opacity_percent(int); private: - explicit Layer(Image&, const Gfx::IntSize&, const String& name); + Layer(Image&, const Gfx::IntSize&, const String& name); + Layer(Image&, const Gfx::Bitmap&, const String& name); Image& m_image; diff --git a/Applications/PixelPaint/main.cpp b/Applications/PixelPaint/main.cpp index d22a797044..46924db131 100644 --- a/Applications/PixelPaint/main.cpp +++ b/Applications/PixelPaint/main.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -126,7 +127,17 @@ int main(int argc, char** argv) return; })); - menubar->add_menu("Edit"); + auto& edit_menu = menubar->add_menu("Edit"); + edit_menu.add_action(GUI::CommonActions::make_paste_action([&](auto&) { + + ASSERT(image_editor.image()); + auto bitmap = GUI::Clipboard::the().bitmap(); + if (!bitmap) + return; + + auto layer = PixelPaint::Layer::create_with_bitmap(*image_editor.image(), *bitmap, "Pasted layer"); + image_editor.image()->add_layer(layer.release_nonnull()); + })); auto& tool_menu = menubar->add_menu("Tool"); toolbox.for_each_tool([&](auto& tool) {