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

PixelPaint: Allow setting ImageEditor scale and listening for changes

This commit is contained in:
Ben Wiederhake 2021-11-22 00:28:16 +01:00 committed by Andreas Kling
parent 7f962cd9d3
commit be697a440f
2 changed files with 26 additions and 15 deletions

View file

@ -548,13 +548,24 @@ Layer* ImageEditor::layer_at_editor_position(Gfx::IntPoint const& editor_positio
return nullptr; return nullptr;
} }
void ImageEditor::clamped_scale(float scale_delta) void ImageEditor::set_absolute_scale(float scale, bool do_relayout)
{ {
m_scale *= AK::exp2(scale_delta); if (scale < 0.1f)
if (m_scale < 0.1f) scale = 0.1f;
m_scale = 0.1f; if (scale > 100.0f)
if (m_scale > 100.0f) scale = 100.0f;
m_scale = 100.0f; if (scale == m_scale)
return;
m_scale = scale;
if (on_scale_changed)
on_scale_changed(m_scale);
if (do_relayout)
relayout();
}
void ImageEditor::clamped_scale_by(float scale_delta, bool do_relayout)
{
set_absolute_scale(m_scale * AK::exp2(scale_delta), do_relayout);
} }
void ImageEditor::scale_centered_on_position(Gfx::IntPoint const& position, float scale_delta) void ImageEditor::scale_centered_on_position(Gfx::IntPoint const& position, float scale_delta)
@ -572,7 +583,7 @@ void ImageEditor::scale_centered_on_position(Gfx::IntPoint const& position, floa
position.y() - height() / 2.0f position.y() - height() / 2.0f
}; };
clamped_scale(scale_delta); clamped_scale_by(scale_delta, false);
m_pan_origin = { m_pan_origin = {
offset_from_center_in_image_coords.x() * m_scale - offset_from_center_in_editor_coords.x(), offset_from_center_in_image_coords.x() * m_scale - offset_from_center_in_editor_coords.x(),
@ -585,10 +596,9 @@ void ImageEditor::scale_centered_on_position(Gfx::IntPoint const& position, floa
void ImageEditor::scale_by(float scale_delta) void ImageEditor::scale_by(float scale_delta)
{ {
if (scale_delta != 0) { if (scale_delta == 0)
clamped_scale(scale_delta); return;
relayout(); clamped_scale_by(scale_delta, true);
}
} }
void ImageEditor::set_pan_origin(Gfx::FloatPoint const& pan_origin) void ImageEditor::set_pan_origin(Gfx::FloatPoint const& pan_origin)
@ -618,7 +628,7 @@ void ImageEditor::fit_image_to_view()
auto image_size = image().size(); auto image_size = image().size();
auto height_ratio = floorf(border_ratio * viewport_rect.height()) / (float)image_size.height(); auto height_ratio = floorf(border_ratio * viewport_rect.height()) / (float)image_size.height();
auto width_ratio = floorf(border_ratio * viewport_rect.width()) / (float)image_size.width(); auto width_ratio = floorf(border_ratio * viewport_rect.width()) / (float)image_size.width();
m_scale = min(height_ratio, width_ratio); set_absolute_scale(min(height_ratio, width_ratio), false);
float offset = m_show_rulers ? -m_ruler_thickness / (m_scale * 2.0f) : 0.0f; float offset = m_show_rulers ? -m_ruler_thickness / (m_scale * 2.0f) : 0.0f;
m_pan_origin = Gfx::FloatPoint(offset, offset); m_pan_origin = Gfx::FloatPoint(offset, offset);
@ -628,8 +638,7 @@ void ImageEditor::fit_image_to_view()
void ImageEditor::reset_scale_and_position() void ImageEditor::reset_scale_and_position()
{ {
if (m_scale != 1.0f) set_absolute_scale(1.0f, false);
m_scale = 1.0f;
m_pan_origin = Gfx::FloatPoint(0, 0); m_pan_origin = Gfx::FloatPoint(0, 0);
relayout(); relayout();

View file

@ -59,6 +59,8 @@ public:
void fit_image_to_view(); void fit_image_to_view();
void reset_scale_and_position(); void reset_scale_and_position();
void scale_by(float); void scale_by(float);
void set_absolute_scale(float, bool do_relayout = true);
Function<void(float)> on_scale_changed;
void set_pan_origin(Gfx::FloatPoint const&); void set_pan_origin(Gfx::FloatPoint const&);
Gfx::FloatPoint pan_origin() const { return m_pan_origin; } Gfx::FloatPoint pan_origin() const { return m_pan_origin; }
@ -134,7 +136,7 @@ private:
GUI::MouseEvent event_adjusted_for_layer(GUI::MouseEvent const&, Layer const&) const; GUI::MouseEvent event_adjusted_for_layer(GUI::MouseEvent const&, Layer const&) const;
GUI::MouseEvent event_with_pan_and_scale_applied(GUI::MouseEvent const&) const; GUI::MouseEvent event_with_pan_and_scale_applied(GUI::MouseEvent const&) const;
void clamped_scale(float); void clamped_scale_by(float, bool do_relayout);
void relayout(); void relayout();
int calculate_ruler_step_size() const; int calculate_ruler_step_size() const;