From 7fda0162179469dc7ec326b9d0140c8602dcaccb Mon Sep 17 00:00:00 2001 From: Timothy Slater Date: Wed, 31 Aug 2022 17:53:23 -0500 Subject: [PATCH] PixelPaint: Add option to make new layer from selection New actions in the Layer Menu allows for the creation of a new layer from the current selection. Layers can be made by copying the selection or cutting it from the current layer. The new layer will be sized to the bounding box of the selection. The newly produced layer will be added to the layer stack. --- .../Applications/PixelPaint/MainWidget.cpp | 37 +++++++++++++++++++ Userland/Applications/PixelPaint/MainWidget.h | 3 ++ 2 files changed, 40 insertions(+) diff --git a/Userland/Applications/PixelPaint/MainWidget.cpp b/Userland/Applications/PixelPaint/MainWidget.cpp index 61dbf04973..6bb0af657c 100644 --- a/Userland/Applications/PixelPaint/MainWidget.cpp +++ b/Userland/Applications/PixelPaint/MainWidget.cpp @@ -2,6 +2,7 @@ * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2021-2022, Mustafa Quraish * Copyright (c) 2021-2022, Tobias Christiansen + * Copyright (c) 2022, Timothy Slater * * SPDX-License-Identifier: BSD-2-Clause */ @@ -579,6 +580,17 @@ void MainWidget::initialize_menubar(GUI::Window& window) })); m_layer_menu = window.add_menu("&Layer"); + + m_layer_menu->on_visibility_change = [this](bool visible) { + if (!visible) + return; + + bool image_has_selection = !current_image_editor()->active_layer()->image().selection().is_empty(); + + m_layer_via_copy->set_enabled(image_has_selection); + m_layer_via_cut->set_enabled(image_has_selection); + }; + m_layer_menu->add_action(GUI::Action::create( "New &Layer...", { Mod_Ctrl | Mod_Shift, Key_N }, g_icon_bag.new_layer, [&](auto&) { auto* editor = current_image_editor(); @@ -597,6 +609,31 @@ void MainWidget::initialize_menubar(GUI::Window& window) } })); + m_layer_via_copy = GUI::Action::create( + "Layer via Copy", { Mod_Ctrl | Mod_Shift, Key_C }, g_icon_bag.new_layer, [&](auto&) { + auto add_layer_success = current_image_editor()->add_new_layer_from_selection(); + if (add_layer_success.is_error()) { + GUI::MessageBox::show_error(&window, add_layer_success.release_error().string_literal()); + return; + } + current_image_editor()->did_complete_action("New Layer via Copy"sv); + m_layer_list_widget->select_top_layer(); + }); + m_layer_menu->add_action(*m_layer_via_copy); + + m_layer_via_cut = GUI::Action::create( + "Layer via Cut", { Mod_Ctrl | Mod_Shift, Key_X }, g_icon_bag.new_layer, [&](auto&) { + auto add_layer_success = current_image_editor()->add_new_layer_from_selection(); + if (add_layer_success.is_error()) { + GUI::MessageBox::show_error(&window, add_layer_success.release_error().string_literal()); + return; + } + current_image_editor()->active_layer()->erase_selection(current_image_editor()->image().selection()); + current_image_editor()->did_complete_action("New Layer via Cut"sv); + m_layer_list_widget->select_top_layer(); + }); + m_layer_menu->add_action(*m_layer_via_cut); + m_layer_menu->add_separator(); m_layer_menu->add_action(GUI::Action::create( "Add M&ask", { Mod_Ctrl | Mod_Shift, Key_M }, g_icon_bag.add_mask, [&](auto&) { diff --git a/Userland/Applications/PixelPaint/MainWidget.h b/Userland/Applications/PixelPaint/MainWidget.h index ce1b06818b..bfdfc3b0f5 100644 --- a/Userland/Applications/PixelPaint/MainWidget.h +++ b/Userland/Applications/PixelPaint/MainWidget.h @@ -101,6 +101,9 @@ private: RefPtr m_show_guides_action; RefPtr m_show_rulers_action; RefPtr m_show_active_layer_boundary_action; + + RefPtr m_layer_via_copy; + RefPtr m_layer_via_cut; }; }