Serenity Operating System
1/*
2 * Copyright (c) 2021-2023, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include "ZoomTool.h"
8#include "../ImageEditor.h"
9#include <LibGUI/BoxLayout.h>
10#include <LibGUI/Label.h>
11#include <LibGUI/ValueSlider.h>
12
13namespace PixelPaint {
14
15void ZoomTool::on_mousedown(Layer*, MouseEvent& event)
16{
17 auto& raw_event = event.raw_event();
18 if (raw_event.button() != GUI::MouseButton::Primary && raw_event.button() != GUI::MouseButton::Secondary)
19 return;
20
21 auto scale_factor = (raw_event.button() == GUI::MouseButton::Primary) ? m_sensitivity : -m_sensitivity;
22 auto new_scale = m_editor->scale() * AK::exp2(scale_factor);
23 m_editor->scale_centered(new_scale, raw_event.position());
24}
25
26ErrorOr<GUI::Widget*> ZoomTool::get_properties_widget()
27{
28 if (!m_properties_widget) {
29 auto properties_widget = TRY(GUI::Widget::try_create());
30 (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>());
31
32 auto sensitivity_container = TRY(properties_widget->try_add<GUI::Widget>());
33 sensitivity_container->set_fixed_height(20);
34 (void)TRY(sensitivity_container->try_set_layout<GUI::HorizontalBoxLayout>());
35
36 auto sensitivity_label = TRY(sensitivity_container->try_add<GUI::Label>("Sensitivity:"));
37 sensitivity_label->set_text_alignment(Gfx::TextAlignment::CenterLeft);
38 sensitivity_label->set_fixed_size(80, 20);
39
40 auto sensitivity_slider = TRY(sensitivity_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, "%"_short_string));
41 sensitivity_slider->set_range(1, 100);
42 sensitivity_slider->set_value(100 * m_sensitivity);
43
44 sensitivity_slider->on_change = [this](int value) {
45 m_sensitivity = value / 100.0f;
46 };
47 set_primary_slider(sensitivity_slider);
48 m_properties_widget = properties_widget;
49 }
50
51 return m_properties_widget.ptr();
52}
53
54}