From 49deb936be01cd96920dd0e8b34ab69743027b6e Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 25 Aug 2022 20:58:17 +0200 Subject: [PATCH] PixelPaint: Make selection changes undoable Using the Rectangle Select Tool will now generate undo/redo commands like any other tool. :^) --- Userland/Applications/PixelPaint/Image.cpp | 4 ++++ Userland/Applications/PixelPaint/Selection.cpp | 5 +++++ Userland/Applications/PixelPaint/Selection.h | 1 + .../Applications/PixelPaint/Tools/RectangleSelectTool.cpp | 2 ++ 4 files changed, 12 insertions(+) diff --git a/Userland/Applications/PixelPaint/Image.cpp b/Userland/Applications/PixelPaint/Image.cpp index ce7e16f094c..ed1d2dce5bf 100644 --- a/Userland/Applications/PixelPaint/Image.cpp +++ b/Userland/Applications/PixelPaint/Image.cpp @@ -245,6 +245,7 @@ ErrorOr> Image::take_snapshot() const auto layer_snapshot = TRY(Layer::try_create_snapshot(*snapshot, layer)); snapshot->add_layer(move(layer_snapshot)); } + snapshot->m_selection.set_mask(m_selection.mask()); return snapshot; } @@ -267,6 +268,9 @@ ErrorOr Image::restore_snapshot(Image const& snapshot) select_layer(&layer(0)); m_size = snapshot.size(); + + m_selection.set_mask(snapshot.m_selection.mask()); + did_change_rect(); did_modify_layer_stack(); return {}; diff --git a/Userland/Applications/PixelPaint/Selection.cpp b/Userland/Applications/PixelPaint/Selection.cpp index 41863c2c143..386ab9cbef7 100644 --- a/Userland/Applications/PixelPaint/Selection.cpp +++ b/Userland/Applications/PixelPaint/Selection.cpp @@ -54,4 +54,9 @@ void Selection::remove_client(SelectionClient& client) m_clients.remove(&client); } +void Selection::set_mask(Mask mask) +{ + m_mask = move(mask); +} + } diff --git a/Userland/Applications/PixelPaint/Selection.h b/Userland/Applications/PixelPaint/Selection.h index c47f87690ee..ce19399a77c 100644 --- a/Userland/Applications/PixelPaint/Selection.h +++ b/Userland/Applications/PixelPaint/Selection.h @@ -49,6 +49,7 @@ public: [[nodiscard]] u8 get_selection_alpha(Gfx::IntPoint const& point) const { return get_selection_alpha(point.x(), point.y()); } Mask const& mask() const { return m_mask; } + void set_mask(Mask); void begin_interactive_selection() { m_in_interactive_selection = true; } void end_interactive_selection() { m_in_interactive_selection = false; } diff --git a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp index 14a268c46b2..ac215c62ad8 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp @@ -99,6 +99,8 @@ void RectangleSelectTool::on_mouseup(Layer*, MouseEvent& event) } m_editor->image().selection().merge(mask, m_merge_mode); + + m_editor->did_complete_action(tool_name()); } void RectangleSelectTool::on_keydown(GUI::KeyEvent& key_event)