mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:27:43 +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:
parent
967dfa7956
commit
7ce346e50e
19 changed files with 62 additions and 41 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue