From 7ce346e50e3a7b02934d3d95c09c6a8ff9608916 Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Mon, 24 Oct 2022 20:17:21 -0500 Subject: [PATCH] PixelPaint: Allow keydown events to bubble from ImageEditor Previously, all keydown KeyEvents were accepted, causing parent widgets not to receive them. With the addition of shortcut handling to keydown, shortcuts were not called when the ImageEditor was focused. --- .../Applications/PixelPaint/ImageEditor.cpp | 6 ++++-- .../PixelPaint/Tools/CloneTool.cpp | 6 +++--- .../Applications/PixelPaint/Tools/CloneTool.h | 2 +- .../PixelPaint/Tools/EllipseTool.cpp | 6 +++--- .../PixelPaint/Tools/EllipseTool.h | 2 +- .../PixelPaint/Tools/LineTool.cpp | 6 +++--- .../Applications/PixelPaint/Tools/LineTool.h | 2 +- .../PixelPaint/Tools/MoveTool.cpp | 11 +++++----- .../Applications/PixelPaint/Tools/MoveTool.h | 2 +- .../PixelPaint/Tools/PolygonalSelectTool.cpp | 5 +++-- .../PixelPaint/Tools/PolygonalSelectTool.h | 2 +- .../PixelPaint/Tools/RectangleSelectTool.cpp | 14 +++++++++---- .../PixelPaint/Tools/RectangleSelectTool.h | 2 +- .../PixelPaint/Tools/RectangleTool.cpp | 6 +++--- .../PixelPaint/Tools/RectangleTool.h | 2 +- .../Applications/PixelPaint/Tools/Tool.cpp | 20 ++++++++++++++----- Userland/Applications/PixelPaint/Tools/Tool.h | 2 +- .../PixelPaint/Tools/WandSelectTool.cpp | 5 +++-- .../PixelPaint/Tools/WandSelectTool.h | 2 +- 19 files changed, 62 insertions(+), 41 deletions(-) diff --git a/Userland/Applications/PixelPaint/ImageEditor.cpp b/Userland/Applications/PixelPaint/ImageEditor.cpp index 6862492e66..240e8efadd 100644 --- a/Userland/Applications/PixelPaint/ImageEditor.cpp +++ b/Userland/Applications/PixelPaint/ImageEditor.cpp @@ -420,8 +420,10 @@ void ImageEditor::keydown_event(GUI::KeyEvent& event) return; } - if (m_active_tool) - m_active_tool->on_keydown(event); + if (m_active_tool && m_active_tool->on_keydown(event)) + return; + + event.ignore(); } void ImageEditor::keyup_event(GUI::KeyEvent& event) diff --git a/Userland/Applications/PixelPaint/Tools/CloneTool.cpp b/Userland/Applications/PixelPaint/Tools/CloneTool.cpp index 0ed7f141dd..56805197b1 100644 --- a/Userland/Applications/PixelPaint/Tools/CloneTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/CloneTool.cpp @@ -114,14 +114,14 @@ void CloneTool::on_second_paint(Layer const*, GUI::PaintEvent& event) painter.draw_ellipse_intersecting(rect, m_marker_color, 1); } -void CloneTool::on_keydown(GUI::KeyEvent& event) +bool CloneTool::on_keydown(GUI::KeyEvent const& event) { - Tool::on_keydown(event); if (event.key() == KeyCode::Key_Alt && !m_is_selecting_location) { m_is_selecting_location = true; m_editor->update_tool_cursor(); - return; + return true; } + return Tool::on_keydown(event); } void CloneTool::on_keyup(GUI::KeyEvent& event) diff --git a/Userland/Applications/PixelPaint/Tools/CloneTool.h b/Userland/Applications/PixelPaint/Tools/CloneTool.h index f380564cfb..0aa3ada005 100644 --- a/Userland/Applications/PixelPaint/Tools/CloneTool.h +++ b/Userland/Applications/PixelPaint/Tools/CloneTool.h @@ -27,7 +27,7 @@ protected: virtual void on_mousedown(Layer*, MouseEvent&) override; virtual void on_mousemove(Layer*, MouseEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; - virtual void on_keydown(GUI::KeyEvent&) override; + virtual bool on_keydown(GUI::KeyEvent const&) override; virtual void on_keyup(GUI::KeyEvent&) override; private: diff --git a/Userland/Applications/PixelPaint/Tools/EllipseTool.cpp b/Userland/Applications/PixelPaint/Tools/EllipseTool.cpp index aa3b676843..f704028f09 100644 --- a/Userland/Applications/PixelPaint/Tools/EllipseTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/EllipseTool.cpp @@ -123,14 +123,14 @@ void EllipseTool::on_second_paint(Layer const* layer, GUI::PaintEvent& event) draw_using(painter, preview_start, preview_end, AK::max(m_thickness * m_editor->scale(), 1)); } -void EllipseTool::on_keydown(GUI::KeyEvent& event) +bool EllipseTool::on_keydown(GUI::KeyEvent const& event) { - Tool::on_keydown(event); if (event.key() == Key_Escape && m_drawing_button != GUI::MouseButton::None) { m_drawing_button = GUI::MouseButton::None; m_editor->update(); - event.accept(); + return true; } + return Tool::on_keydown(event); } GUI::Widget* EllipseTool::get_properties_widget() diff --git a/Userland/Applications/PixelPaint/Tools/EllipseTool.h b/Userland/Applications/PixelPaint/Tools/EllipseTool.h index b937f6a1a6..671c3ac660 100644 --- a/Userland/Applications/PixelPaint/Tools/EllipseTool.h +++ b/Userland/Applications/PixelPaint/Tools/EllipseTool.h @@ -24,7 +24,7 @@ public: virtual void on_mousemove(Layer*, MouseEvent&) override; virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; - virtual void on_keydown(GUI::KeyEvent&) override; + virtual bool on_keydown(GUI::KeyEvent const&) override; virtual GUI::Widget* get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } diff --git a/Userland/Applications/PixelPaint/Tools/LineTool.cpp b/Userland/Applications/PixelPaint/Tools/LineTool.cpp index 5aebf8b885..be1e50436a 100644 --- a/Userland/Applications/PixelPaint/Tools/LineTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/LineTool.cpp @@ -124,14 +124,14 @@ void LineTool::on_second_paint(Layer const* layer, GUI::PaintEvent& event) draw_using(painter, preview_start, preview_end, m_editor->color_for(m_drawing_button), AK::max(m_thickness * m_editor->scale(), 1)); } -void LineTool::on_keydown(GUI::KeyEvent& event) +bool LineTool::on_keydown(GUI::KeyEvent const& event) { - Tool::on_keydown(event); if (event.key() == Key_Escape && m_drawing_button != GUI::MouseButton::None) { m_drawing_button = GUI::MouseButton::None; m_editor->update(); - event.accept(); + return true; } + return Tool::on_keydown(event); } GUI::Widget* LineTool::get_properties_widget() diff --git a/Userland/Applications/PixelPaint/Tools/LineTool.h b/Userland/Applications/PixelPaint/Tools/LineTool.h index c423a4a47f..e9af5a87df 100644 --- a/Userland/Applications/PixelPaint/Tools/LineTool.h +++ b/Userland/Applications/PixelPaint/Tools/LineTool.h @@ -22,7 +22,7 @@ public: virtual void on_mousemove(Layer*, MouseEvent&) override; virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; - virtual void on_keydown(GUI::KeyEvent&) override; + virtual bool on_keydown(GUI::KeyEvent const&) override; virtual GUI::Widget* get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } diff --git a/Userland/Applications/PixelPaint/Tools/MoveTool.cpp b/Userland/Applications/PixelPaint/Tools/MoveTool.cpp index 7fb00a714e..ae88f88842 100644 --- a/Userland/Applications/PixelPaint/Tools/MoveTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/MoveTool.cpp @@ -106,20 +106,20 @@ void MoveTool::on_mouseup(Layer* layer, MouseEvent& event) m_editor->did_complete_action(tool_name()); } -void MoveTool::on_keydown(GUI::KeyEvent& event) +bool MoveTool::on_keydown(GUI::KeyEvent const& event) { if (event.key() == Key_Shift) m_keep_ascept_ratio = true; if (m_scaling) - return; + return true; if (event.modifiers() != 0) - return; + return false; auto* layer = m_editor->active_layer(); if (!layer) - return; + return false; auto new_location = layer->location(); @@ -137,11 +137,12 @@ void MoveTool::on_keydown(GUI::KeyEvent& event) new_location.translate_by(1, 0); break; default: - return; + return false; } layer->set_location(new_location); m_editor->layers_did_change(); + return true; } void MoveTool::on_keyup(GUI::KeyEvent& event) diff --git a/Userland/Applications/PixelPaint/Tools/MoveTool.h b/Userland/Applications/PixelPaint/Tools/MoveTool.h index 16b601397b..0d73ff36c4 100644 --- a/Userland/Applications/PixelPaint/Tools/MoveTool.h +++ b/Userland/Applications/PixelPaint/Tools/MoveTool.h @@ -20,7 +20,7 @@ public: virtual void on_mousedown(Layer*, MouseEvent&) override; virtual void on_mousemove(Layer*, MouseEvent&) override; virtual void on_mouseup(Layer*, MouseEvent&) override; - virtual void on_keydown(GUI::KeyEvent&) override; + virtual bool on_keydown(GUI::KeyEvent const&) override; virtual void on_keyup(GUI::KeyEvent&) override; virtual Variant> cursor() override; diff --git a/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.cpp b/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.cpp index 9815f579cb..73efc60730 100644 --- a/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.cpp @@ -150,9 +150,8 @@ void PolygonalSelectTool::on_second_paint(Layer const* layer, GUI::PaintEvent& e painter.draw_line(last_line_start, last_line_stop, Color::Black, AK::max(m_editor->scale(), 1)); } -void PolygonalSelectTool::on_keydown(GUI::KeyEvent& key_event) +bool PolygonalSelectTool::on_keydown(GUI::KeyEvent const& key_event) { - Tool::on_keydown(key_event); if (key_event.key() == KeyCode::Key_Escape) { if (m_selecting) { m_selecting = false; @@ -160,7 +159,9 @@ void PolygonalSelectTool::on_keydown(GUI::KeyEvent& key_event) } else { m_editor->image().selection().clear(); } + return true; } + return Tool::on_keydown(key_event); } GUI::Widget* PolygonalSelectTool::get_properties_widget() diff --git a/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.h b/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.h index 1b0f44286d..f5300cdbce 100644 --- a/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.h +++ b/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.h @@ -20,7 +20,7 @@ public: virtual void on_doubleclick(Layer*, MouseEvent& event) override; virtual void on_mousedown(Layer*, MouseEvent& event) override; virtual void on_mousemove(Layer*, MouseEvent& event) override; - virtual void on_keydown(GUI::KeyEvent&) override; + virtual bool on_keydown(GUI::KeyEvent const&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; virtual GUI::Widget* get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } diff --git a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp index c91898b122..be3184c517 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp @@ -103,20 +103,26 @@ void RectangleSelectTool::on_mouseup(Layer*, MouseEvent& event) m_editor->did_complete_action(tool_name()); } -void RectangleSelectTool::on_keydown(GUI::KeyEvent& key_event) +bool RectangleSelectTool::on_keydown(GUI::KeyEvent const& key_event) { - Tool::on_keydown(key_event); - if (key_event.key() == KeyCode::Key_Space) + if (key_event.key() == KeyCode::Key_Space) { m_moving_mode = MovingMode::MovingOrigin; - else if (key_event.key() == KeyCode::Key_Control) + return true; + } + if (key_event.key() == KeyCode::Key_Control) { m_moving_mode = MovingMode::AroundCenter; + return true; + } if (key_event.key() == KeyCode::Key_Escape) { if (m_selecting) m_selecting = false; else m_editor->image().selection().clear(); + return true; } + + return Tool::on_keydown(key_event); } void RectangleSelectTool::on_keyup(GUI::KeyEvent& key_event) diff --git a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.h b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.h index 9fa6d9b876..bc7dc30024 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.h +++ b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.h @@ -23,7 +23,7 @@ public: virtual void on_mousedown(Layer*, MouseEvent& event) override; virtual void on_mousemove(Layer*, MouseEvent& event) override; virtual void on_mouseup(Layer*, MouseEvent& event) override; - virtual void on_keydown(GUI::KeyEvent&) override; + virtual bool on_keydown(GUI::KeyEvent const&) override; virtual void on_keyup(GUI::KeyEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; virtual GUI::Widget* get_properties_widget() override; diff --git a/Userland/Applications/PixelPaint/Tools/RectangleTool.cpp b/Userland/Applications/PixelPaint/Tools/RectangleTool.cpp index fb88922eef..19f354969f 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/RectangleTool.cpp @@ -130,14 +130,14 @@ void RectangleTool::on_second_paint(Layer const* layer, GUI::PaintEvent& event) draw_using(painter, start_position, end_position, AK::max(m_thickness * m_editor->scale(), 1), m_corner_radius * m_editor->scale()); } -void RectangleTool::on_keydown(GUI::KeyEvent& event) +bool RectangleTool::on_keydown(GUI::KeyEvent const& event) { - Tool::on_keydown(event); if (event.key() == Key_Escape && m_drawing_button != GUI::MouseButton::None) { m_drawing_button = GUI::MouseButton::None; m_editor->update(); - event.accept(); + return true; } + return Tool::on_keydown(event); } GUI::Widget* RectangleTool::get_properties_widget() diff --git a/Userland/Applications/PixelPaint/Tools/RectangleTool.h b/Userland/Applications/PixelPaint/Tools/RectangleTool.h index 52a59c82ab..41a5b1ef2c 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleTool.h +++ b/Userland/Applications/PixelPaint/Tools/RectangleTool.h @@ -23,7 +23,7 @@ public: virtual void on_mousemove(Layer*, MouseEvent&) override; virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; - virtual void on_keydown(GUI::KeyEvent&) override; + virtual bool on_keydown(GUI::KeyEvent const&) override; virtual GUI::Widget* get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } diff --git a/Userland/Applications/PixelPaint/Tools/Tool.cpp b/Userland/Applications/PixelPaint/Tools/Tool.cpp index 86ea2160a9..57fc44b6ae 100644 --- a/Userland/Applications/PixelPaint/Tools/Tool.cpp +++ b/Userland/Applications/PixelPaint/Tools/Tool.cpp @@ -23,28 +23,38 @@ void Tool::set_action(GUI::Action* action) m_action = action; } -void Tool::on_keydown(GUI::KeyEvent& event) +bool Tool::on_keydown(GUI::KeyEvent const& event) { switch (event.key()) { case KeyCode::Key_LeftBracket: - if (m_primary_slider) + if (m_primary_slider) { m_primary_slider->decrease_slider_by(1); + return true; + } break; case KeyCode::Key_RightBracket: - if (m_primary_slider) + if (m_primary_slider) { m_primary_slider->increase_slider_by(1); + return true; + } break; case KeyCode::Key_LeftBrace: - if (m_secondary_slider) + if (m_secondary_slider) { m_secondary_slider->decrease_slider_by(1); + return true; + } break; case KeyCode::Key_RightBrace: - if (m_secondary_slider) + if (m_secondary_slider) { m_secondary_slider->increase_slider_by(1); + return true; + } break; default: break; } + + return false; } Gfx::IntPoint Tool::editor_layer_location(Layer const& layer) const diff --git a/Userland/Applications/PixelPaint/Tools/Tool.h b/Userland/Applications/PixelPaint/Tools/Tool.h index f6df95eb20..aeb446b66f 100644 --- a/Userland/Applications/PixelPaint/Tools/Tool.h +++ b/Userland/Applications/PixelPaint/Tools/Tool.h @@ -61,7 +61,7 @@ public: virtual void on_context_menu(Layer*, GUI::ContextMenuEvent&) { } virtual void on_tool_button_contextmenu(GUI::ContextMenuEvent&) { } virtual void on_second_paint(Layer const*, GUI::PaintEvent&) { } - virtual void on_keydown(GUI::KeyEvent&); + virtual bool on_keydown(GUI::KeyEvent const&); virtual void on_keyup(GUI::KeyEvent&) { } virtual void on_tool_activation() { } virtual GUI::Widget* get_properties_widget() { return nullptr; } diff --git a/Userland/Applications/PixelPaint/Tools/WandSelectTool.cpp b/Userland/Applications/PixelPaint/Tools/WandSelectTool.cpp index 873d4cfd51..e94fc8fa58 100644 --- a/Userland/Applications/PixelPaint/Tools/WandSelectTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/WandSelectTool.cpp @@ -37,12 +37,13 @@ static void set_flood_selection(Gfx::Bitmap& bitmap, Image& image, Gfx::IntPoint image.selection().merge(selection_mask, merge_mode); } -void WandSelectTool::on_keydown(GUI::KeyEvent& key_event) +bool WandSelectTool::on_keydown(GUI::KeyEvent const& key_event) { - Tool::on_keydown(key_event); if (key_event.key() == KeyCode::Key_Escape) { m_editor->image().selection().clear(); + return true; } + return Tool::on_keydown(key_event); } void WandSelectTool::on_mousedown(Layer* layer, MouseEvent& event) diff --git a/Userland/Applications/PixelPaint/Tools/WandSelectTool.h b/Userland/Applications/PixelPaint/Tools/WandSelectTool.h index e239bd266a..5b2ab35f49 100644 --- a/Userland/Applications/PixelPaint/Tools/WandSelectTool.h +++ b/Userland/Applications/PixelPaint/Tools/WandSelectTool.h @@ -22,7 +22,7 @@ public: virtual ~WandSelectTool() = default; virtual void on_mousedown(Layer*, MouseEvent& event) override; - virtual void on_keydown(GUI::KeyEvent&) override; + virtual bool on_keydown(GUI::KeyEvent const&) override; virtual GUI::Widget* get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; }