From 4f53adc3312291e946d6f12b3140a21dacb36e1b Mon Sep 17 00:00:00 2001 From: Filoppi Date: Wed, 28 Apr 2021 19:15:53 +0300 Subject: [PATCH] Qt: make all tooltips look similar to balloon tips (and share parts of their code) --- .../DolphinQt/Config/Graphics/BalloonTip.cpp | 51 ++---------------- Source/Core/DolphinQt/Main.cpp | 1 + Source/Core/DolphinQt/Settings.cpp | 52 ++++++++++++++++++- Source/Core/DolphinQt/Settings.h | 4 ++ 4 files changed, 60 insertions(+), 48 deletions(-) diff --git a/Source/Core/DolphinQt/Config/Graphics/BalloonTip.cpp b/Source/Core/DolphinQt/Config/Graphics/BalloonTip.cpp index 98b5062934..bbaf4f0650 100644 --- a/Source/Core/DolphinQt/Config/Graphics/BalloonTip.cpp +++ b/Source/Core/DolphinQt/Config/Graphics/BalloonTip.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -31,6 +30,8 @@ #include "Core/Config/MainSettings.h" +#include "DolphinQt/Settings.h" + namespace { std::unique_ptr s_the_balloon_tip = nullptr; @@ -73,54 +74,11 @@ BalloonTip::BalloonTip(PrivateTag, const QIcon& icon, QString title, QString mes setAttribute(Qt::WA_DeleteOnClose); setAutoFillBackground(true); - const QPalette& pal = parent->palette(); - - const auto theme_window_color = pal.color(QPalette::Base); - const auto theme_window_hsv = theme_window_color.toHsv(); - - const auto brightness = theme_window_hsv.value(); - QColor window_color; QColor text_color; QColor dolphin_emphasis; - const bool use_high_contrast = Config::Get(Config::MAIN_USE_HIGH_CONTRAST_TOOLTIPS); - if (brightness > 128) - { - if (use_high_contrast) - { - // Our theme color is light, so make it darker - window_color = QColor(72, 72, 72); - text_color = Qt::white; - dolphin_emphasis = Qt::yellow; - m_border_color = palette().color(QPalette::Window).darker(160); - } - else - { - window_color = pal.color(QPalette::Window); - text_color = pal.color(QPalette::Text); - dolphin_emphasis = QColor(QStringLiteral("#0090ff")); - m_border_color = pal.color(QPalette::Text); - } - } - else - { - if (use_high_contrast) - { - // Our theme color is dark, so make it lighter - window_color = Qt::white; - text_color = Qt::black; - dolphin_emphasis = QColor(QStringLiteral("#0090ff")); - m_border_color = palette().color(QPalette::Window).darker(160); - } - else - { - window_color = pal.color(QPalette::Window); - text_color = pal.color(QPalette::Text); - dolphin_emphasis = Qt::yellow; - m_border_color = pal.color(QPalette::Text); - } - } - + Settings::Instance().GetToolTipStyle(window_color, text_color, dolphin_emphasis, m_border_color, + parent->palette(), palette()); const auto style_sheet = QStringLiteral("background-color: #%1; color: #%2;") .arg(window_color.rgba(), 0, 16) .arg(text_color.rgba(), 0, 16); @@ -188,6 +146,7 @@ void BalloonTip::UpdateBoundsAndRedraw(const QPoint& pos, ShowArrow show_arrow) const QRect screen_rect = screen->geometry(); #endif QSize sh = sizeHint(); + // The look should resemble the default tooltip style set in Settings::SetCurrentUserStyle() const int border = 1; const int arrow_height = 18; const int arrow_width = 18; diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index 98aaa480d5..9efad48c35 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -246,6 +246,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine DolphinAnalytics::Instance().ReportDolphinStart("qt"); MainWindow win{std::move(boot), static_cast(options.get("movie"))}; + Settings::Instance().SetCurrentUserStyle(Settings::Instance().GetCurrentUserStyle()); if (options.is_set("debugger")) Settings::Instance().SetDebugModeEnabled(true); win.Show(); diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index ce2b5a7e47..35780b997d 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "AudioCommon/AudioCommon.h" @@ -45,8 +46,6 @@ Settings::Settings() g_controller_interface.RegisterDevicesChangedCallback( [this] { QueueOnObject(this, [this] { emit DevicesChanged(); }); }); - - SetCurrentUserStyle(GetCurrentUserStyle()); } Settings::~Settings() = default; @@ -80,10 +79,13 @@ QString Settings::GetCurrentUserStyle() const return QFileInfo(GetQSettings().value(QStringLiteral("userstyle/path")).toString()).fileName(); } +// Calling this before the main window has been created breaks the style of some widgets on +// Windows 10/Qt 5.15.0. But only if we set a stylesheet that isn't an empty string. void Settings::SetCurrentUserStyle(const QString& stylesheet_name) { QString stylesheet_contents; + // If we haven't found one, we continue with an empty (default) style if (!stylesheet_name.isEmpty() && AreUserStylesEnabled()) { // Load custom user stylesheet @@ -94,6 +96,26 @@ void Settings::SetCurrentUserStyle(const QString& stylesheet_name) stylesheet_contents = QString::fromUtf8(stylesheet.readAll().data()); } + // Define tooltips style if not already defined + if (!stylesheet_contents.contains(QStringLiteral("QToolTip"), Qt::CaseSensitive)) + { + const QPalette& palette = qApp->palette(); + QColor window_color; + QColor text_color; + QColor unused_text_emphasis_color; + QColor border_color; + GetToolTipStyle(window_color, text_color, unused_text_emphasis_color, border_color, palette, + palette); + + const auto tooltip_stylesheet = + QStringLiteral("QToolTip { background-color: #%1; color: #%2; padding: 8px; " + "border: 1px; border-style: solid; border-color: #%3; }") + .arg(window_color.rgba(), 0, 16) + .arg(text_color.rgba(), 0, 16) + .arg(border_color.rgba(), 0, 16); + stylesheet_contents.append(QStringLiteral("%1").arg(tooltip_stylesheet)); + } + qApp->setStyleSheet(stylesheet_contents); GetQSettings().setValue(QStringLiteral("userstyle/name"), stylesheet_name); @@ -109,6 +131,32 @@ void Settings::SetUserStylesEnabled(bool enabled) GetQSettings().setValue(QStringLiteral("userstyle/enabled"), enabled); } +void Settings::GetToolTipStyle(QColor& window_color, QColor& text_color, + QColor& emphasis_text_color, QColor& border_color, + const QPalette& palette, const QPalette& high_contrast_palette) const +{ + const auto theme_window_color = palette.color(QPalette::Base); + const auto theme_window_hsv = theme_window_color.toHsv(); + const auto brightness = theme_window_hsv.value(); + const bool brightness_over_threshold = brightness > 128; + const QColor emphasis_text_color_1 = Qt::yellow; + const QColor emphasis_text_color_2 = QColor(QStringLiteral("#0090ff")); // ~light blue + if (Config::Get(Config::MAIN_USE_HIGH_CONTRAST_TOOLTIPS)) + { + window_color = brightness_over_threshold ? QColor(72, 72, 72) : Qt::white; + text_color = brightness_over_threshold ? Qt::white : Qt::black; + emphasis_text_color = brightness_over_threshold ? emphasis_text_color_1 : emphasis_text_color_2; + border_color = high_contrast_palette.color(QPalette::Window).darker(160); + } + else + { + window_color = palette.color(QPalette::Window); + text_color = palette.color(QPalette::Text); + emphasis_text_color = brightness_over_threshold ? emphasis_text_color_2 : emphasis_text_color_1; + border_color = palette.color(QPalette::Text); + } +} + QStringList Settings::GetPaths() const { QStringList list; diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h index 63396c3e76..f3753d1d5f 100644 --- a/Source/Core/DolphinQt/Settings.h +++ b/Source/Core/DolphinQt/Settings.h @@ -54,6 +54,10 @@ public: void SetUserStylesEnabled(bool enabled); bool AreUserStylesEnabled() const; + void GetToolTipStyle(QColor& window_color, QColor& text_color, QColor& emphasis_text_color, + QColor& border_color, const QPalette& palette, + const QPalette& high_contrast_palette) const; + bool IsLogVisible() const; void SetLogVisible(bool visible); bool IsLogConfigVisible() const;