PixelPaint: Scale lasso tool preview path on zoom level change

The size of the preview shown by the lasso tool now scales with the
current zoom level.
This commit is contained in:
Tim Ledbetter 2023-01-11 22:41:59 +00:00 committed by Andreas Kling
parent 1cf45ee930
commit b0fad409bf
2 changed files with 17 additions and 10 deletions

View file

@ -37,8 +37,8 @@ void LassoSelectTool::on_mousedown(Layer* layer, MouseEvent& event)
m_most_recent_position = layer_event.position();
m_top_left = m_start_position;
m_bottom_right = m_start_position;
m_preview_path.clear();
m_preview_path.move_to(editor_stroke_position(m_most_recent_position, 1).to_type<float>());
m_preview_coords.clear();
m_preview_coords.append(m_most_recent_position);
m_selection_bitmap->set_pixel(m_most_recent_position, Gfx::Color::Black);
m_selecting = true;
@ -69,8 +69,7 @@ void LassoSelectTool::on_mousemove(Layer* layer, MouseEvent& event)
if (new_position.y() > m_bottom_right.y())
m_bottom_right.set_y(new_position.y());
auto preview_end = editor_stroke_position(new_position, 1);
m_preview_path.line_to(preview_end.to_type<float>());
m_preview_coords.append(new_position);
auto selection_painter = Gfx::Painter(*m_selection_bitmap);
selection_painter.draw_line(m_most_recent_position, new_position, Gfx::Color::Black);
@ -138,15 +137,23 @@ void LassoSelectTool::flood_lasso_selection(Gfx::Bitmap& lasso_bitmap, Gfx::IntP
void LassoSelectTool::on_second_paint(Layer const* layer, GUI::PaintEvent& event)
{
if (!m_selecting)
if (!m_selecting || m_preview_coords.size() < 2)
return;
GUI::Painter painter(*m_editor);
painter.add_clip_rect(event.rect());
if (layer)
painter.translate(editor_layer_location(*layer));
// FIXME: Find a way to draw this in a single call
painter.stroke_path(m_preview_path, Gfx::Color::Black, 3);
painter.stroke_path(m_preview_path, Gfx::Color::White, 1);
auto draw_preview_lines = [&](auto color, auto thickness) {
for (size_t i = 0; i < m_preview_coords.size() - 1; i++) {
auto preview_start = editor_stroke_position(m_preview_coords.at(i), 1);
auto preview_end = editor_stroke_position(m_preview_coords.at(i + 1), 1);
painter.draw_line(preview_start, preview_end, color, thickness);
}
};
draw_preview_lines(Gfx::Color::Black, 3);
draw_preview_lines(Gfx::Color::White, 1);
}
bool LassoSelectTool::on_keydown(GUI::KeyEvent& key_event)
@ -156,7 +163,7 @@ bool LassoSelectTool::on_keydown(GUI::KeyEvent& key_event)
if (m_selecting) {
m_selecting = false;
m_selection_bitmap.clear();
m_preview_path.clear();
m_preview_coords.clear();
return true;
}
}

View file

@ -37,7 +37,7 @@ private:
Gfx::IntPoint m_start_position;
Gfx::IntPoint m_most_recent_position;
RefPtr<Gfx::Bitmap> m_selection_bitmap;
Gfx::Path m_preview_path;
Vector<Gfx::IntPoint> m_preview_coords;
Gfx::IntPoint m_top_left;
Gfx::IntPoint m_bottom_right;