From 97964bc710771e020cf1fbeb268c257560ce21fb Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 19 Sep 2022 10:48:02 +0200 Subject: [PATCH] Ladybird/BrowserWindow: Add UI for switching preferred CSS color scheme --- Ladybird/BrowserWindow.cpp | 48 ++++++++++++++++++++++++++++++++++++++ Ladybird/BrowserWindow.h | 3 +++ Ladybird/WebView.cpp | 17 ++++++++++++++ Ladybird/WebView.h | 8 +++++++ 4 files changed, 76 insertions(+) diff --git a/Ladybird/BrowserWindow.cpp b/Ladybird/BrowserWindow.cpp index c18f84b459..6269a7fe89 100644 --- a/Ladybird/BrowserWindow.cpp +++ b/Ladybird/BrowserWindow.cpp @@ -12,6 +12,7 @@ #include "WebView.h" #include #include +#include #include #include @@ -59,6 +60,32 @@ BrowserWindow::BrowserWindow() view_menu->addAction(open_previous_tab_action); QObject::connect(open_previous_tab_action, &QAction::triggered, this, &BrowserWindow::open_previous_tab); + view_menu->addSeparator(); + + auto* color_scheme_menu = view_menu->addMenu("&Color Scheme"); + + auto* group = new QActionGroup(this); + + auto* auto_color_scheme = new QAction("&Auto"); + auto_color_scheme->setCheckable(true); + group->addAction(auto_color_scheme); + color_scheme_menu->addAction(auto_color_scheme); + QObject::connect(auto_color_scheme, &QAction::triggered, this, &BrowserWindow::enable_auto_color_scheme); + + auto* light_color_scheme = new QAction("&Light"); + light_color_scheme->setCheckable(true); + group->addAction(light_color_scheme); + color_scheme_menu->addAction(light_color_scheme); + QObject::connect(light_color_scheme, &QAction::triggered, this, &BrowserWindow::enable_light_color_scheme); + + auto* dark_color_scheme = new QAction("&Dark"); + dark_color_scheme->setCheckable(true); + group->addAction(dark_color_scheme); + color_scheme_menu->addAction(dark_color_scheme); + QObject::connect(dark_color_scheme, &QAction::triggered, this, &BrowserWindow::enable_dark_color_scheme); + + auto_color_scheme->setChecked(true); + auto* inspect_menu = menuBar()->addMenu("&Inspect"); auto* view_source_action = new QAction("View &Source"); @@ -294,3 +321,24 @@ void BrowserWindow::open_previous_tab() next_index = m_tabs_container->count() - 1; m_tabs_container->setCurrentIndex(next_index); } + +void BrowserWindow::enable_auto_color_scheme() +{ + for (auto& tab : m_tabs) { + tab.view().set_color_scheme(ColorScheme::Auto); + } +} + +void BrowserWindow::enable_light_color_scheme() +{ + for (auto& tab : m_tabs) { + tab.view().set_color_scheme(ColorScheme::Light); + } +} + +void BrowserWindow::enable_dark_color_scheme() +{ + for (auto& tab : m_tabs) { + tab.view().set_color_scheme(ColorScheme::Dark); + } +} diff --git a/Ladybird/BrowserWindow.h b/Ladybird/BrowserWindow.h index 8b17ba0dcc..ef15e84c6e 100644 --- a/Ladybird/BrowserWindow.h +++ b/Ladybird/BrowserWindow.h @@ -36,6 +36,9 @@ public slots: void close_current_tab(); void open_next_tab(); void open_previous_tab(); + void enable_auto_color_scheme(); + void enable_light_color_scheme(); + void enable_dark_color_scheme(); private: void debug_request(String const& request, String const& argument = ""); diff --git a/Ladybird/WebView.cpp b/Ladybird/WebView.cpp index 76e596f2a4..31a4aec1d5 100644 --- a/Ladybird/WebView.cpp +++ b/Ladybird/WebView.cpp @@ -970,3 +970,20 @@ void WebView::show_js_console() m_js_console_widget->show(); m_js_console_input_edit->setFocus(); } + +void WebView::set_color_scheme(ColorScheme color_scheme) +{ + switch (color_scheme) { + case ColorScheme::Auto: + m_page_client->m_preferred_color_scheme = Web::CSS::PreferredColorScheme::Auto; + break; + case ColorScheme::Light: + m_page_client->m_preferred_color_scheme = Web::CSS::PreferredColorScheme::Light; + break; + case ColorScheme::Dark: + m_page_client->m_preferred_color_scheme = Web::CSS::PreferredColorScheme::Dark; + break; + } + if (auto* document = m_page_client->page().top_level_browsing_context().active_document()) + document->invalidate_style(); +} diff --git a/Ladybird/WebView.h b/Ladybird/WebView.h index 52cc45bfb3..f93c9b04f4 100644 --- a/Ladybird/WebView.h +++ b/Ladybird/WebView.h @@ -19,6 +19,12 @@ class QLineEdit; class HeadlessBrowserPageClient; +enum class ColorScheme { + Auto, + Light, + Dark, +}; + class WebView final : public QAbstractScrollArea { Q_OBJECT public: @@ -49,6 +55,8 @@ public: Gfx::IntPoint to_content(Gfx::IntPoint) const; Gfx::IntPoint to_widget(Gfx::IntPoint) const; + void set_color_scheme(ColorScheme); + signals: void link_hovered(QString, int timeout = 0); void link_unhovered();