diff --git a/Userland/Applications/Magnifier/MagnifierWidget.cpp b/Userland/Applications/Magnifier/MagnifierWidget.cpp index 9148cecfff..66953b1c0d 100644 --- a/Userland/Applications/Magnifier/MagnifierWidget.cpp +++ b/Userland/Applications/Magnifier/MagnifierWidget.cpp @@ -32,6 +32,14 @@ void MagnifierWidget::lock_location(bool lock) m_locked_location = {}; } +void MagnifierWidget::show_grid(bool new_value) +{ + if (m_show_grid == new_value) + return; + m_show_grid = new_value; + update(); +} + void MagnifierWidget::set_color_filter(OwnPtr color_filter) { m_color_filter = move(color_filter); @@ -75,10 +83,37 @@ void MagnifierWidget::paint_event(GUI::PaintEvent& event) { GUI::Frame::paint_event(event); + if (!m_grabbed_bitmap) + return; + GUI::Painter painter(*this); if (m_grabbed_bitmap) - painter.draw_scaled_bitmap(frame_inner_rect(), *m_grabbed_bitmap, m_grabbed_bitmap->rect()); + painter.draw_scaled_bitmap(frame_inner_rect(), *m_grabbed_bitmap, m_grabbed_bitmap->rect(), 1.0, Gfx::Painter::ScalingMode::NearestFractional); + + if (m_show_grid) { + auto line_color = Color(Color::NamedColor::Magenta); + line_color.set_alpha(100); + + auto grid_rect = frame_inner_rect(); + if (m_grabbed_bitmap) + grid_rect = frame_inner_rect().intersected({ 0, + 0, + m_grabbed_bitmap->rect().width() * m_scale_factor, + m_grabbed_bitmap->rect().height() * m_scale_factor }); + + int start_y = grid_rect.top(), + start_x = grid_rect.left(); + + int end_y = grid_rect.bottom(), + end_x = grid_rect.right(); + + for (int current_y = start_y; current_y <= end_y; current_y += m_scale_factor) + painter.draw_line({ start_x, current_y }, { end_x, current_y }, line_color); + + for (int current_x = start_y; current_x <= end_x; current_x += m_scale_factor) + painter.draw_line({ current_x, start_y }, { current_x, end_y }, line_color); + } } void MagnifierWidget::second_paint_event(GUI::PaintEvent&) diff --git a/Userland/Applications/Magnifier/MagnifierWidget.h b/Userland/Applications/Magnifier/MagnifierWidget.h index c3fd416cfc..5cd94ff8ef 100644 --- a/Userland/Applications/Magnifier/MagnifierWidget.h +++ b/Userland/Applications/Magnifier/MagnifierWidget.h @@ -21,6 +21,8 @@ public: virtual ~MagnifierWidget() override = default; void set_scale_factor(int scale_factor); virtual void set_color_filter(OwnPtr) override; + void show_grid(bool); + void pause_capture(bool pause) { m_pause_capture = pause; @@ -47,4 +49,5 @@ private: ssize_t m_frame_offset_from_head { 0 }; bool m_pause_capture { false }; Optional m_locked_location {}; + bool m_show_grid { false }; }; diff --git a/Userland/Applications/Magnifier/main.cpp b/Userland/Applications/Magnifier/main.cpp index b1961f8c26..10d8758e61 100644 --- a/Userland/Applications/Magnifier/main.cpp +++ b/Userland/Applications/Magnifier/main.cpp @@ -116,6 +116,11 @@ ErrorOr serenity_main(Main::Arguments arguments) magnifier->lock_location(action.is_checked()); }); + auto show_grid_action = GUI::Action::create_checkable( + "Show &Grid", { Key_G }, [&](auto& action) { + magnifier->show_grid(action.is_checked()); + }); + size_action_group->add_action(two_x_action); size_action_group->add_action(four_x_action); size_action_group->add_action(eight_x_action); @@ -130,6 +135,7 @@ ErrorOr serenity_main(Main::Arguments arguments) TRY(view_menu->try_add_separator()); TRY(view_menu->try_add_action(pause_action)); TRY(view_menu->try_add_action(lock_location_action)); + TRY(view_menu->try_add_action(show_grid_action)); auto timeline_menu = TRY(window->try_add_menu("&Timeline")); auto previous_frame_action = GUI::Action::create(