mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-30 22:54:35 +03:00
Ladybird: Implement zoom :^)
This commit is contained in:
parent
05ef6c9b64
commit
0cc151bc1c
Notes:
sideshowbarker
2024-07-17 10:05:47 +09:00
Author: https://github.com/linusg Commit: https://github.com/SerenityOS/serenity/commit/0cc151bc1c Pull-request: https://github.com/SerenityOS/serenity/pull/16973 Reviewed-by: https://github.com/AtkinsSJ ✅
@ -2,6 +2,7 @@
|
||||
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
|
||||
* Copyright (c) 2022, Matthew Costa <ucosty@gmail.com>
|
||||
* Copyright (c) 2022, Filiph Sandström <filiph.sandstrom@filfatstudios.com>
|
||||
* Copyright (c) 2023, Linus Groh <linusg@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
@ -65,6 +66,25 @@ BrowserWindow::BrowserWindow(Browser::CookieJar& cookie_jar, StringView webdrive
|
||||
|
||||
view_menu->addSeparator();
|
||||
|
||||
auto* zoom_menu = view_menu->addMenu("&Zoom");
|
||||
|
||||
auto* zoom_in_action = new QAction("Zoom &In", this);
|
||||
zoom_in_action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Plus));
|
||||
zoom_menu->addAction(zoom_in_action);
|
||||
QObject::connect(zoom_in_action, &QAction::triggered, this, &BrowserWindow::zoom_in);
|
||||
|
||||
auto* zoom_out_action = new QAction("Zoom &Out", this);
|
||||
zoom_out_action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Minus));
|
||||
zoom_menu->addAction(zoom_out_action);
|
||||
QObject::connect(zoom_out_action, &QAction::triggered, this, &BrowserWindow::zoom_out);
|
||||
|
||||
auto* reset_zoom_action = new QAction("&Reset Zoom", this);
|
||||
reset_zoom_action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
|
||||
zoom_menu->addAction(reset_zoom_action);
|
||||
QObject::connect(reset_zoom_action, &QAction::triggered, this, &BrowserWindow::reset_zoom);
|
||||
|
||||
view_menu->addSeparator();
|
||||
|
||||
auto* color_scheme_menu = view_menu->addMenu("&Color Scheme");
|
||||
|
||||
auto* color_scheme_group = new QActionGroup(this);
|
||||
@ -416,3 +436,21 @@ void BrowserWindow::enable_dark_color_scheme()
|
||||
tab.view().set_color_scheme(ColorScheme::Dark);
|
||||
}
|
||||
}
|
||||
|
||||
void BrowserWindow::zoom_in()
|
||||
{
|
||||
if (m_current_tab)
|
||||
m_current_tab->view().zoom_in();
|
||||
}
|
||||
|
||||
void BrowserWindow::zoom_out()
|
||||
{
|
||||
if (m_current_tab)
|
||||
m_current_tab->view().zoom_out();
|
||||
}
|
||||
|
||||
void BrowserWindow::reset_zoom()
|
||||
{
|
||||
if (m_current_tab)
|
||||
m_current_tab->view().reset_zoom();
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
|
||||
* Copyright (c) 2023, Linus Groh <linusg@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
@ -42,6 +43,9 @@ public slots:
|
||||
void enable_auto_color_scheme();
|
||||
void enable_light_color_scheme();
|
||||
void enable_dark_color_scheme();
|
||||
void zoom_in();
|
||||
void zoom_out();
|
||||
void reset_zoom();
|
||||
|
||||
private:
|
||||
void debug_request(DeprecatedString const& request, DeprecatedString const& argument = "");
|
||||
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
|
||||
* Copyright (c) 2023, Linus Groh <linusg@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
@ -575,6 +576,35 @@ void WebContentView::set_color_scheme(ColorScheme color_scheme)
|
||||
}
|
||||
}
|
||||
|
||||
void WebContentView::zoom_in()
|
||||
{
|
||||
if (m_zoom_level >= ZOOM_MAX_LEVEL)
|
||||
return;
|
||||
m_zoom_level += ZOOM_STEP;
|
||||
update_zoom();
|
||||
}
|
||||
|
||||
void WebContentView::zoom_out()
|
||||
{
|
||||
if (m_zoom_level <= ZOOM_MIN_LEVEL)
|
||||
return;
|
||||
m_zoom_level -= ZOOM_STEP;
|
||||
update_zoom();
|
||||
}
|
||||
|
||||
void WebContentView::reset_zoom()
|
||||
{
|
||||
m_zoom_level = 1.0f;
|
||||
update_zoom();
|
||||
}
|
||||
|
||||
void WebContentView::update_zoom()
|
||||
{
|
||||
client().async_set_device_pixels_per_css_pixel(m_device_pixel_ratio * m_zoom_level);
|
||||
update_viewport_rect();
|
||||
request_repaint();
|
||||
}
|
||||
|
||||
void WebContentView::showEvent(QShowEvent* event)
|
||||
{
|
||||
QAbstractScrollArea::showEvent(event);
|
||||
|
@ -113,6 +113,10 @@ public:
|
||||
|
||||
void set_color_scheme(ColorScheme);
|
||||
|
||||
void zoom_in();
|
||||
void zoom_out();
|
||||
void reset_zoom();
|
||||
|
||||
virtual void notify_server_did_layout(Badge<WebContentClient>, Gfx::IntSize content_size) override;
|
||||
virtual void notify_server_did_paint(Badge<WebContentClient>, i32 bitmap_id) override;
|
||||
virtual void notify_server_did_invalidate_content_rect(Badge<WebContentClient>, Gfx::IntRect const&) override;
|
||||
@ -184,9 +188,14 @@ signals:
|
||||
Gfx::IntRect fullscreen_window();
|
||||
|
||||
private:
|
||||
static constexpr auto ZOOM_MIN_LEVEL = 0.3f;
|
||||
static constexpr auto ZOOM_MAX_LEVEL = 5.0f;
|
||||
static constexpr auto ZOOM_STEP = 0.1f;
|
||||
|
||||
void request_repaint();
|
||||
void update_viewport_rect();
|
||||
void handle_resize();
|
||||
void update_zoom();
|
||||
|
||||
void ensure_js_console_widget();
|
||||
void ensure_inspector_widget();
|
||||
@ -197,6 +206,7 @@ private:
|
||||
void close_sub_widgets();
|
||||
ErrorOr<Ladybird::DOMNodeProperties> inspect_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement> pseudo_element);
|
||||
|
||||
float m_zoom_level { 1.0 };
|
||||
float m_device_pixel_ratio { 1.0 };
|
||||
qreal m_inverse_pixel_scaling_ratio { 1.0 };
|
||||
bool m_should_show_line_box_borders { false };
|
||||
|
Loading…
Reference in New Issue
Block a user