1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:47:34 +00:00

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.
This commit is contained in:
Zaggy1024 2022-10-24 20:17:21 -05:00 committed by Sam Atkins
parent 967dfa7956
commit 7ce346e50e
19 changed files with 62 additions and 41 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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:

View file

@ -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()

View file

@ -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<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; }

View file

@ -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()

View file

@ -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<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; }

View file

@ -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)

View file

@ -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<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override;

View file

@ -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()

View file

@ -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<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; }

View file

@ -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)

View file

@ -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;

View file

@ -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()

View file

@ -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<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; }

View file

@ -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

View file

@ -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; }

View file

@ -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)

View file

@ -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<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; }