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 6862492e66e..240e8efadde 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 0ed7f141dd7..56805197b1a 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 f380564cfbc..0aa3ada005a 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 aa3b6768438..f704028f099 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 b937f6a1a65..671c3ac6602 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 5aebf8b8856..be1e50436a0 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 c423a4a47f8..e9af5a87dfb 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 7fb00a714ef..ae88f888424 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 16b601397b6..0d73ff36c44 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 9815f579cb5..73efc607308 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 1b0f44286d4..f5300cdbcee 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 c91898b1220..be3184c5174 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 9fa6d9b8763..bc7dc30024e 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 fb88922eef7..19f354969f8 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 52a59c82ab6..41a5b1ef2cc 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 86ea2160a95..57fc44b6aee 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 f6df95eb20e..aeb446b66f3 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 873d4cfd51f..e94fc8fa581 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 e239bd266af..5b2ab35f49e 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; }