瀏覽代碼

PixelPaint: ImageEditor scaling method
Moved the code on mousewheel_event to its own function.

lucastarche 4 年之前
父節點
當前提交
3947d301e5
共有 2 個文件被更改,包括 26 次插入18 次删除
  1. 24 18
      Userland/Applications/PixelPaint/ImageEditor.cpp
  2. 2 0
      Userland/Applications/PixelPaint/ImageEditor.h

+ 24 - 18
Userland/Applications/PixelPaint/ImageEditor.cpp

@@ -249,24 +249,8 @@ void ImageEditor::mouseup_event(GUI::MouseEvent& event)
 
 void ImageEditor::mousewheel_event(GUI::MouseEvent& event)
 {
-    auto old_scale = m_scale;
-
-    m_scale += -event.wheel_delta() * 0.1f;
-    if (m_scale < 0.1f)
-        m_scale = 0.1f;
-    if (m_scale > 100.0f)
-        m_scale = 100.0f;
-
-    auto focus_point = Gfx::FloatPoint(
-        m_pan_origin.x() - ((float)event.x() - (float)width() / 2.0) / old_scale,
-        m_pan_origin.y() - ((float)event.y() - (float)height() / 2.0) / old_scale);
-
-    m_pan_origin = Gfx::FloatPoint(
-        focus_point.x() - m_scale / old_scale * (focus_point.x() - m_pan_origin.x()),
-        focus_point.y() - m_scale / old_scale * (focus_point.y() - m_pan_origin.y()));
-
-    if (old_scale != m_scale)
-        relayout();
+    auto scale_delta = -event.wheel_delta() * 0.1f;
+    scale_centered_on_position(event.position(), scale_delta);
 }
 
 void ImageEditor::context_menu_event(GUI::ContextMenuEvent& event)
@@ -386,6 +370,28 @@ Layer* ImageEditor::layer_at_editor_position(const Gfx::IntPoint& editor_positio
     return nullptr;
 }
 
+void ImageEditor::scale_centered_on_position(const Gfx::IntPoint& position, float scale_delta)
+{
+    auto old_scale = m_scale;
+
+    m_scale += scale_delta;
+    if (m_scale < 0.1f)
+        m_scale = 0.1f;
+    if (m_scale > 100.0f)
+        m_scale = 100.0f;
+
+    auto focus_point = Gfx::FloatPoint(
+        m_pan_origin.x() - ((float)position.x() - (float)width() / 2.0) / old_scale,
+        m_pan_origin.y() - ((float)position.y() - (float)height() / 2.0) / old_scale);
+
+    m_pan_origin = Gfx::FloatPoint(
+        focus_point.x() - m_scale / old_scale * (focus_point.x() - m_pan_origin.x()),
+        focus_point.y() - m_scale / old_scale * (focus_point.y() - m_pan_origin.y()));
+
+    if (old_scale != m_scale)
+        relayout();
+}
+
 void ImageEditor::relayout()
 {
     if (!image())

+ 2 - 0
Userland/Applications/PixelPaint/ImageEditor.h

@@ -63,6 +63,8 @@ public:
 
     Layer* layer_at_editor_position(const Gfx::IntPoint&);
 
+    void scale_centered_on_position(const Gfx::IntPoint&, float);
+
     Color primary_color() const { return m_primary_color; }
     void set_primary_color(Color);