From faec8bbe45d1b3ebed0e1fb73bab5a2f635e9ec1 Mon Sep 17 00:00:00 2001 From: sin-ack Date: Sun, 8 Aug 2021 13:40:39 +0000 Subject: [PATCH] Mandelbrot: Add mousewheel zooming This allows the user to zoom in with a up scroll of the mousewheel and zoom out with a down scroll. --- Userland/Demos/Mandelbrot/Mandelbrot.cpp | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Userland/Demos/Mandelbrot/Mandelbrot.cpp b/Userland/Demos/Mandelbrot/Mandelbrot.cpp index 0b68f22e5a..b402f32b40 100644 --- a/Userland/Demos/Mandelbrot/Mandelbrot.cpp +++ b/Userland/Demos/Mandelbrot/Mandelbrot.cpp @@ -147,6 +147,7 @@ private: virtual void mousedown_event(GUI::MouseEvent& event) override; virtual void mousemove_event(GUI::MouseEvent& event) override; virtual void mouseup_event(GUI::MouseEvent& event) override; + virtual void mousewheel_event(GUI::MouseEvent& event) override; virtual void resize_event(GUI::ResizeEvent& event) override; bool m_dragging { false }; @@ -217,6 +218,33 @@ void Mandelbrot::mouseup_event(GUI::MouseEvent& event) return GUI::Widget::mouseup_event(event); } +void Mandelbrot::mousewheel_event(GUI::MouseEvent& event) +{ + static constexpr double zoom_in_multiplier = 0.8; + static constexpr double zoom_out_multiplier = 1.25; + + bool zooming_in = event.wheel_delta() < 0; + double multiplier = zooming_in ? zoom_in_multiplier : zoom_out_multiplier; + + auto relative_rect = this->relative_rect(); + Gfx::IntRect zoomed_rect = relative_rect; + + zoomed_rect.set_width(zoomed_rect.width() * multiplier); + zoomed_rect.set_height(zoomed_rect.height() * multiplier); + + auto leftover_width = abs(relative_rect.width() - zoomed_rect.width()); + auto leftover_height = abs(relative_rect.height() - zoomed_rect.height()); + + double cursor_x_percentage = static_cast(event.position().x()) / relative_rect.width(); + double cursor_y_percentage = static_cast(event.position().y()) / relative_rect.height(); + + zoomed_rect.set_x((zooming_in ? 1 : -1) * leftover_width * cursor_x_percentage); + zoomed_rect.set_y((zooming_in ? 1 : -1) * leftover_height * cursor_y_percentage); + + m_set.zoom(zoomed_rect); + update(); +} + void Mandelbrot::resize_event(GUI::ResizeEvent& event) { m_set.resize(event.size());