/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019-2020 Jan Grulich * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitacolors.h" #include "animations/adwaitaanimationdata.h" #include #include namespace Adwaita { //* contrast for arrow and treeline rendering static const qreal arrowShade = 0.15; QColor Colors::alphaColor(QColor color, qreal alpha) { if (alpha >= 0 && alpha < 1.0) { color.setAlphaF(alpha * color.alphaF()); } return color; } QColor Colors::darken(const QColor &color, qreal amount) { qreal h, s, l, a; color.getHslF(&h, &s, &l, &a); qreal lightness = l - amount; if (lightness < 0) { lightness = 0; } return QColor::fromHslF(h, s, lightness, a); } QColor Colors::desaturate(const QColor &color, qreal amount) { qreal h, s, l, a; color.getHslF(&h, &s, &l, &a); qreal saturation = s - amount; if (saturation < 0) { saturation = 0; } return QColor::fromHslF(h, saturation, l, a); } QColor Colors::lighten(const QColor &color, qreal amount) { qreal h, s, l, a; color.getHslF(&h, &s, &l, &a); qreal lightness = l + amount; if (lightness > 1) { lightness = 1; } return QColor::fromHslF(h, s, lightness, a); } QColor Colors::mix(const QColor &c1, const QColor &c2, qreal bias) { auto mixQreal = [](qreal a, qreal b, qreal bias) { return a + (b - a) * bias; }; if (bias <= 0.0) { return c1; } if (bias >= 1.0) { return c2; } if (std::isnan(bias)) { return c1; } qreal r = mixQreal(c1.redF(), c2.redF(), bias); qreal g = mixQreal(c1.greenF(), c2.greenF(), bias); qreal b = mixQreal(c1.blueF(), c2.blueF(), bias); qreal a = mixQreal(c1.alphaF(), c2.alphaF(), bias); return QColor::fromRgbF(r, g, b, a); } QColor Colors::transparentize(const QColor &color, qreal amount) { qreal h, s, l, a; color.getHslF(&h, &s, &l, &a); qreal alpha = a - amount; if (alpha < 0) { alpha = 0; } return QColor::fromHslF(h, s, l, alpha); } static bool isDarkMode() { const QColor textColor = QGuiApplication::palette().color(QPalette::Text); if (qSqrt(((textColor.red() * textColor.red()) * 0.299) + ((textColor.green() * textColor.green()) * 0.587) + ((textColor.blue() * textColor.blue()) * 0.114)) > 128) { return true; } return false; } static QPalette paletteAdwaita() { QPalette palette; // Colors defined in GTK adwaita style in _colors.scss QColor base_color = QColor("white"); QColor text_color = QColor("black"); QColor bg_color = QColor("#f6f5f4"); QColor fg_color = QColor("#2e3436"); QColor selected_bg_color = QColor("#3584e4"); QColor selected_fg_color = QColor("white"); QColor osd_text_color = QColor("white"); QColor osd_bg_color = QColor("black"); QColor shadow = Colors::transparentize(QColor("black"), 0.9); QColor backdrop_fg_color = Colors::mix(fg_color, bg_color); QColor backdrop_base_color = Colors::darken(base_color, 0.01); QColor backdrop_selected_fg_color = backdrop_base_color; // This is the color we use as initial color for the gradient in normal state // Defined in _drawing.scss button(normal) QColor button_base_color = Colors::darken(bg_color, 0.04); QColor link_color = Colors::darken(selected_bg_color, 0.1); QColor link_visited_color = Colors::darken(selected_bg_color, 0.2); palette.setColor(QPalette::All, QPalette::Window, bg_color); palette.setColor(QPalette::All, QPalette::WindowText, fg_color); palette.setColor(QPalette::All, QPalette::Base, base_color); palette.setColor(QPalette::All, QPalette::AlternateBase, base_color); palette.setColor(QPalette::All, QPalette::ToolTipBase, osd_bg_color); palette.setColor(QPalette::All, QPalette::ToolTipText, osd_text_color); palette.setColor(QPalette::All, QPalette::Text, fg_color); palette.setColor(QPalette::All, QPalette::Button, button_base_color); palette.setColor(QPalette::All, QPalette::ButtonText, fg_color); palette.setColor(QPalette::All, QPalette::BrightText, text_color); palette.setColor(QPalette::All, QPalette::Light, Colors::lighten(button_base_color)); palette.setColor(QPalette::All, QPalette::Midlight, Colors::mix(Colors::lighten(button_base_color), button_base_color)); palette.setColor(QPalette::All, QPalette::Mid, Colors::mix(Colors::darken(button_base_color), button_base_color)); palette.setColor(QPalette::All, QPalette::Dark, Colors::darken(button_base_color)); palette.setColor(QPalette::All, QPalette::Shadow, shadow); palette.setColor(QPalette::All, QPalette::Highlight, selected_bg_color); palette.setColor(QPalette::All, QPalette::HighlightedText, selected_fg_color); palette.setColor(QPalette::All, QPalette::Link, link_color); palette.setColor(QPalette::All, QPalette::LinkVisited, link_visited_color); QColor insensitive_fg_color = Colors::mix(fg_color, bg_color); QColor insensitive_bg_color = Colors::mix(bg_color, base_color, 0.4); palette.setColor(QPalette::Disabled, QPalette::Window, insensitive_bg_color); palette.setColor(QPalette::Disabled, QPalette::WindowText, insensitive_fg_color); palette.setColor(QPalette::Disabled, QPalette::Base, base_color); palette.setColor(QPalette::Disabled, QPalette::AlternateBase, base_color); palette.setColor(QPalette::Disabled, QPalette::Text, insensitive_fg_color); palette.setColor(QPalette::Disabled, QPalette::Button, insensitive_bg_color); palette.setColor(QPalette::Disabled, QPalette::ButtonText, insensitive_fg_color); palette.setColor(QPalette::Disabled, QPalette::BrightText, text_color); palette.setColor(QPalette::Disabled, QPalette::Light, Colors::lighten(insensitive_bg_color)); palette.setColor(QPalette::Disabled, QPalette::Midlight, Colors::mix(Colors::lighten(insensitive_bg_color), insensitive_bg_color)); palette.setColor(QPalette::Disabled, QPalette::Mid, Colors::mix(Colors::darken(insensitive_bg_color), insensitive_bg_color)); palette.setColor(QPalette::Disabled, QPalette::Dark, Colors::darken(insensitive_bg_color)); palette.setColor(QPalette::Disabled, QPalette::Shadow, shadow); palette.setColor(QPalette::Disabled, QPalette::Highlight, selected_bg_color); palette.setColor(QPalette::Disabled, QPalette::HighlightedText, selected_fg_color); palette.setColor(QPalette::Disabled, QPalette::Link, link_color); palette.setColor(QPalette::Disabled, QPalette::LinkVisited, link_visited_color); palette.setColor(QPalette::Inactive, QPalette::Window, bg_color); palette.setColor(QPalette::Inactive, QPalette::WindowText, backdrop_fg_color); palette.setColor(QPalette::Inactive, QPalette::Base, backdrop_base_color); palette.setColor(QPalette::Inactive, QPalette::AlternateBase, backdrop_base_color); palette.setColor(QPalette::Inactive, QPalette::Text, backdrop_fg_color); palette.setColor(QPalette::Inactive, QPalette::Button, button_base_color); palette.setColor(QPalette::Inactive, QPalette::ButtonText, backdrop_fg_color); palette.setColor(QPalette::Inactive, QPalette::BrightText, text_color); palette.setColor(QPalette::Inactive, QPalette::Light, Colors::lighten(insensitive_bg_color)); palette.setColor(QPalette::Inactive, QPalette::Midlight, Colors::mix(Colors::lighten(insensitive_bg_color), insensitive_bg_color)); palette.setColor(QPalette::Inactive, QPalette::Mid, Colors::mix(Colors::darken(insensitive_bg_color), insensitive_bg_color)); palette.setColor(QPalette::Inactive, QPalette::Dark, Colors::darken(insensitive_bg_color)); palette.setColor(QPalette::Inactive, QPalette::Shadow, shadow); palette.setColor(QPalette::Inactive, QPalette::Highlight, selected_bg_color); palette.setColor(QPalette::Inactive, QPalette::HighlightedText, backdrop_selected_fg_color); palette.setColor(QPalette::Inactive, QPalette::Link, link_color); palette.setColor(QPalette::Inactive, QPalette::LinkVisited, link_visited_color); return palette; } // private static QPalette paletteAdwaitaDark() { QPalette palette; // Colors defined in GTK adwaita style in _colors.scss QColor base_color = Colors::lighten(Colors::desaturate(QColor("#241f31"), 1.0), 0.02); QColor text_color = QColor("white"); QColor bg_color = Colors::darken(Colors::desaturate(QColor("#3d3846"), 1.0), 0.04); QColor fg_color = QColor("#eeeeec"); QColor selected_bg_color = Colors::darken(QColor("#3584e4"), 0.2); QColor selected_fg_color = QColor("white"); QColor osd_text_color = QColor("white"); QColor osd_bg_color = QColor("black"); QColor shadow = Colors::transparentize(QColor("black"), 0.9); QColor backdrop_fg_color = Colors::mix(fg_color, bg_color); QColor backdrop_base_color = Colors::lighten(base_color, 0.01); QColor backdrop_selected_fg_color = Colors::mix(text_color, backdrop_base_color, 0.2); // This is the color we use as initial color for the gradient in normal state // Defined in _drawing.scss button(normal) QColor button_base_color = Colors::darken(bg_color, 0.01); QColor link_color = Colors::lighten(selected_bg_color, 0.2); QColor link_visited_color = Colors::lighten(selected_bg_color, 0.1); palette.setColor(QPalette::All, QPalette::Window, bg_color); palette.setColor(QPalette::All, QPalette::WindowText, fg_color); palette.setColor(QPalette::All, QPalette::Base, base_color); palette.setColor(QPalette::All, QPalette::AlternateBase, base_color); palette.setColor(QPalette::All, QPalette::ToolTipBase, osd_bg_color); palette.setColor(QPalette::All, QPalette::ToolTipText, osd_text_color); palette.setColor(QPalette::All, QPalette::Text, fg_color); palette.setColor(QPalette::All, QPalette::Button, button_base_color); palette.setColor(QPalette::All, QPalette::ButtonText, fg_color); palette.setColor(QPalette::All, QPalette::BrightText, text_color); palette.setColor(QPalette::All, QPalette::Light, Colors::lighten(button_base_color)); palette.setColor(QPalette::All, QPalette::Midlight, Colors::mix(Colors::lighten(button_base_color), button_base_color)); palette.setColor(QPalette::All, QPalette::Mid, Colors::mix(Colors::darken(button_base_color), button_base_color)); palette.setColor(QPalette::All, QPalette::Dark, Colors::darken(button_base_color)); palette.setColor(QPalette::All, QPalette::Shadow, shadow); palette.setColor(QPalette::All, QPalette::Highlight, selected_bg_color); palette.setColor(QPalette::All, QPalette::HighlightedText, selected_fg_color); palette.setColor(QPalette::All, QPalette::Link, link_color); palette.setColor(QPalette::All, QPalette::LinkVisited, link_visited_color); QColor insensitive_fg_color = Colors::mix(fg_color, bg_color); QColor insensitive_bg_color = Colors::mix(bg_color, base_color, 0.4); palette.setColor(QPalette::Disabled, QPalette::Window, insensitive_bg_color); palette.setColor(QPalette::Disabled, QPalette::WindowText, insensitive_fg_color); palette.setColor(QPalette::Disabled, QPalette::Base, base_color); palette.setColor(QPalette::Disabled, QPalette::AlternateBase, base_color); palette.setColor(QPalette::Disabled, QPalette::Text, insensitive_fg_color); palette.setColor(QPalette::Disabled, QPalette::Button, insensitive_bg_color); palette.setColor(QPalette::Disabled, QPalette::ButtonText, insensitive_fg_color); palette.setColor(QPalette::Disabled, QPalette::BrightText, text_color); palette.setColor(QPalette::Disabled, QPalette::Light, Colors::lighten(insensitive_bg_color)); palette.setColor(QPalette::Disabled, QPalette::Midlight, Colors::mix(Colors::lighten(insensitive_bg_color), insensitive_bg_color)); palette.setColor(QPalette::Disabled, QPalette::Mid, Colors::mix(Colors::darken(insensitive_bg_color), insensitive_bg_color)); palette.setColor(QPalette::Disabled, QPalette::Dark, Colors::darken(insensitive_bg_color)); palette.setColor(QPalette::Disabled, QPalette::Shadow, shadow); palette.setColor(QPalette::Disabled, QPalette::Highlight, selected_bg_color); palette.setColor(QPalette::Disabled, QPalette::HighlightedText, selected_fg_color); palette.setColor(QPalette::Disabled, QPalette::Link, link_color); palette.setColor(QPalette::Disabled, QPalette::LinkVisited, link_visited_color); palette.setColor(QPalette::Inactive, QPalette::Window, bg_color); palette.setColor(QPalette::Inactive, QPalette::WindowText, backdrop_fg_color); palette.setColor(QPalette::Inactive, QPalette::Base, backdrop_base_color); palette.setColor(QPalette::Inactive, QPalette::AlternateBase, backdrop_base_color); palette.setColor(QPalette::Inactive, QPalette::Text, backdrop_fg_color); palette.setColor(QPalette::Inactive, QPalette::Button, button_base_color); palette.setColor(QPalette::Inactive, QPalette::ButtonText, backdrop_fg_color); palette.setColor(QPalette::Inactive, QPalette::BrightText, text_color); palette.setColor(QPalette::Inactive, QPalette::Light, Colors::lighten(insensitive_bg_color)); palette.setColor(QPalette::Inactive, QPalette::Midlight, Colors::mix(Colors::lighten(insensitive_bg_color), insensitive_bg_color)); palette.setColor(QPalette::Inactive, QPalette::Mid, Colors::mix(Colors::darken(insensitive_bg_color), insensitive_bg_color)); palette.setColor(QPalette::Inactive, QPalette::Dark, Colors::darken(insensitive_bg_color)); palette.setColor(QPalette::Inactive, QPalette::Shadow, shadow); palette.setColor(QPalette::Inactive, QPalette::Highlight, selected_bg_color); palette.setColor(QPalette::Inactive, QPalette::HighlightedText, backdrop_selected_fg_color); palette.setColor(QPalette::Inactive, QPalette::Link, link_color); palette.setColor(QPalette::Inactive, QPalette::LinkVisited, link_visited_color); return palette; } // private static QPalette paletteAdwaitaHighContrast() { QPalette palette; return palette; } QPalette Colors::disabledPalette(const QPalette &source, qreal ratio) { QPalette copy(source); const QList roles = { QPalette::Background, QPalette::Highlight, QPalette::WindowText, QPalette::ButtonText, QPalette::Text, QPalette::Button }; foreach (const QPalette::ColorRole &role, roles) { copy.setColor(role, Colors::mix(source.color(QPalette::Active, role), source.color(QPalette::Disabled, role), 1.0 - ratio)); } return copy; } QPalette Colors::palette(ColorVariant variant) { if (variant == ColorVariant::Unknown) { return isDarkMode() ? paletteAdwaitaDark() : paletteAdwaita(); } else if (variant == ColorVariant::Adwaita) { return paletteAdwaita(); } else if (variant == ColorVariant::AdwaitaDark) { return paletteAdwaitaDark(); } else { // TODO return paletteAdwaitaHighContrast(); } } QColor Colors::hoverColor(const StyleOptions &options) { return options.palette().highlight().color(); } QColor Colors::focusColor(const StyleOptions &options) { return options.palette().highlight().color(); } QColor Colors::negativeText(const StyleOptions &options) { Q_UNUSED(options) return Qt::red; } QColor Colors::shadowColor(const StyleOptions &options) { return alphaColor(options.palette().color(QPalette::Shadow), 0.15); } QColor Colors::titleBarColor(const StyleOptions &options) { return options.palette().color(options.active() ? QPalette::Active : QPalette::Inactive, QPalette::Window); } QColor Colors::titleBarTextColor(const StyleOptions &options) { return options.palette().color(options.active() ? QPalette::Active : QPalette::Inactive, QPalette::WindowText); } QColor Colors::arrowOutlineColor(const StyleOptions &options) { switch (options.colorRole()) { case QPalette::Text: return mix(options.palette().color(options.colorGroup(), QPalette::Text), options.palette().color(options.colorGroup(), QPalette::Base), arrowShade); case QPalette::WindowText: return mix(options.palette().color(options.colorGroup(), QPalette::WindowText), options.palette().color(options.colorGroup(), QPalette::Window), arrowShade); case QPalette::ButtonText: return mix(options.palette().color(options.colorGroup(), QPalette::ButtonText), options.palette().color(options.colorGroup(), QPalette::Button), arrowShade); default: return options.palette().text().color(); } } QColor Colors::buttonOutlineColor(const StyleOptions &options) { ColorVariant variant = options.colorVariant(); if (variant == ColorVariant::Unknown) { variant = isDarkMode() ? ColorVariant::AdwaitaDark : ColorVariant::Adwaita; } if (variant == ColorVariant::AdwaitaDark) { return darken(options.palette().color(QPalette::Window), 0.1); } else { return darken(options.palette().color(QPalette::Window), 0.18); } } QColor Colors::indicatorOutlineColor(const StyleOptions &options) { bool isDisabled = options.palette().currentColorGroup() == QPalette::Disabled; if (options.inMenu() || options.checkboxState() == CheckBoxState::CheckOff) { ColorVariant variant = options.colorVariant(); if (variant == ColorVariant::Unknown) { variant = isDarkMode() ? ColorVariant::AdwaitaDark : ColorVariant::Adwaita; } if (isDisabled) { return buttonOutlineColor(options); } if (variant == ColorVariant::AdwaitaDark) { return darken(options.palette().color(QPalette::Window), 0.18); } else { return darken(options.palette().color(QPalette::Window), 0.24); } } else { return options.palette().color(QPalette::Highlight); } } QColor Colors::frameOutlineColor(const StyleOptions &options) { return inputOutlineColor(options); } QColor Colors::inputOutlineColor(const StyleOptions &options) { QColor outline(buttonOutlineColor(options)); // focus takes precedence over hover if (options.animationMode() == AnimationFocus) { outline = mix(outline, focusColor(options)); } else if (options.hasFocus()) { outline = focusColor(options); } return outline; } QColor Colors::sidePanelOutlineColor(const StyleOptions &options) { QColor outline(options.palette().color(QPalette::Inactive, QPalette::Highlight)); QColor focus(options.palette().color(QPalette::Active, QPalette::Highlight)); if (options.animationMode() == AnimationFocus) { outline = mix(outline, focus, options.opacity()); } else if (options.hasFocus()) { outline = focus; } return outline; } QColor Colors::sliderOutlineColor(const StyleOptions &options) { QColor outline(mix(options.palette().color(QPalette::Window), options.palette().color(QPalette::Shadow), 0.5)); // hover takes precedence over focus if (options.animationMode() == AnimationHover) { QColor hover(hoverColor(options)); QColor focus(focusColor(options)); if (options.hasFocus()) { outline = mix(focus, hover, options.opacity()); } else { outline = mix(outline, hover, options.opacity()); } } else if (options.mouseOver()) { outline = hoverColor(options); } else if (options.animationMode() == AnimationFocus) { QColor focus(focusColor(options)); outline = mix(outline, focus, options.opacity()); } else if (options.hasFocus()) { outline = focusColor(options); } return outline; } QColor Colors::buttonBackgroundColor(const StyleOptions &options) { bool isDisabled = options.palette().currentColorGroup() == QPalette::Disabled; QColor buttonBackground(options.palette().color(QPalette::Button)); QColor background(options.palette().color(QPalette::Window)); ColorVariant variant = options.colorVariant(); if (variant == ColorVariant::Unknown) { variant = isDarkMode() ? ColorVariant::AdwaitaDark : ColorVariant::Adwaita; } const bool darkMode = variant == ColorVariant::AdwaitaDark; const QPalette &palette = options.palette(); if (isDisabled && (options.animationMode() == AnimationPressed || options.sunken())) { // Defined in drawing.css - insensitive-active button // if($variant == 'light', Colors::darken(Colors::mix($c, $base_color, 85%), 8%), Colors::darken(Colors::mix($c, $base_color, 85%), 6%)); // FIXME: doesn't seem to be correct color return darkMode ? Colors::darken(Colors::mix(palette.color(QPalette::Active, QPalette::Window), palette.color(QPalette::Active, QPalette::Base), 0.15), 0.06) : Colors::darken(Colors::mix(palette.color(QPalette::Active, QPalette::Window), palette.color(QPalette::Active, QPalette::Base), 0.15), 0.08); } if (options.animationMode() == AnimationPressed) { if (darkMode) { // Active button for dark mode is Colors::darken(bg_color, 0.09) return Colors::mix(Colors::darken(background, 0.01), Colors::darken(background, 0.09), options.opacity()); } else { // Active button for normal mode is Colors::darken(bg_color, 0.14) return Colors::mix(buttonBackground, Colors::darken(background, 0.14), options.opacity()); } } else if (options.sunken()) { if (darkMode) { // Active button for dark mode is Colors::darken(bg_color, 0.09) return Colors::darken(background, 0.09); } else { // Active button for normal mode is Colors::darken(bg_color, 0.14) return Colors::darken(background, 0.14); } } else if (options.animationMode() == AnimationHover) { if (darkMode) { // Hovered button for dark mode is Colors::darken(bg_color, 0.01) return Colors::mix(buttonBackground, Colors::darken(background, 0.01), options.opacity()); } else { // Hovered button for normal mode is bg_color return Colors::mix(buttonBackground, background, options.opacity()); } } else if (options.mouseOver()) { if (darkMode) { // Hovered button for dark mode is Colors::darken(bg_color, 0.01) return Colors::darken(background, 0.01); } else { // Hovered button for normal mode is bg_color return background; } } return buttonBackground; } QColor Colors::checkBoxIndicatorColor(const StyleOptions &options) { if (options.inMenu()) { return options.palette().color(QPalette::Text); } else { if (options.active()) { return options.palette().color(QPalette::HighlightedText); } else { return Colors::transparentize(options.palette().color(QPalette::ToolTipText), 0.2); } } } QColor Colors::headerTextColor(const StyleOptions &options) { QColor col(options.palette().color(QPalette::WindowText)); if (options.state() & QStyle::State_Enabled) { if (options.state() & QStyle::State_Sunken) { return Colors::alphaColor(col, 0.9); } else if (options.state() & QStyle::State_MouseOver) { return Colors::alphaColor(col, 0.7); } } return Colors::alphaColor(col, 0.5); } QColor Colors::indicatorBackgroundColor(const StyleOptions &options) { ColorVariant variant = options.colorVariant(); if (variant == ColorVariant::Unknown) { variant = isDarkMode() ? ColorVariant::AdwaitaDark : ColorVariant::Adwaita; } const QPalette &palette = options.palette(); const bool darkMode = variant == ColorVariant::AdwaitaDark; bool isDisabled = palette.currentColorGroup() == QPalette::Disabled; QColor background(palette.color(QPalette::Window)); // Normal-alt button for dark mode is Colors::darken(bg_color, 0.03) // Normal-alt button for normal mode is Colors::lighten(bg_color, 0.05) QColor indicatorColor(darkMode ? Colors::darken(background, 0.03) : Colors::lighten(background, 0.05)); if (options.inMenu() || options.checkboxState() == CheckOff) { if (isDisabled) { // Defined in drawing.css - insensitive button // $insensitive_bg_color: Colors::mix($bg_color, $base_color, 60%); return Colors::mix(palette.color(QPalette::Active, QPalette::Window), palette.color(QPalette::Active, QPalette::Base), 0.6); } if (options.animationMode() == AnimationPressed) { if (darkMode) { // Active button for dark mode is Colors::darken(bg_color, 0.09) return Colors::mix(background, Colors::darken(background, 0.09), options.opacity()); } else { // Active button for normal mode is Colors::darken(bg_color, 0.14) return Colors::mix(Colors::lighten(background, 0.0), Colors::darken(background, 0.14), options.opacity()); } } else if (options.sunken()) { if (darkMode) { // Active button for dark mode is Colors::darken(bg_color, 0.09) return Colors::darken(background, 0.09); } else { // Active button for normal mode is Colors::darken(bg_color, 0.14) return Colors::darken(background, 0.14); } } else if (options.animationMode() == AnimationHover) { if (darkMode) { // Hovered-alt button for dark mode is bg_color return Colors::mix(indicatorColor, background, options.opacity()); } else { // Hovered-alt button for normal mode is Colors::lighten(bg_color, 0.09) return Colors::mix(indicatorColor, Colors::lighten(background, 0.09), options.opacity()); } } else if (options.mouseOver()) { if (darkMode) { // Hovered-alt button for dark mode is bg_color return background; } else { // Hovered-alt button for normal mode is Colors::lighten(bg_color, 0.09) return Colors::lighten(background, 0.09); } } } else { if (darkMode) { return Colors::lighten(palette.color(QPalette::Highlight)); } else { return palette.color(QPalette::Highlight); } } return indicatorColor; } QColor Colors::frameBackgroundColor(const StyleOptions &options) { return Colors::mix(options.palette().color(options.colorGroup(), QPalette::Window), options.palette().color(options.colorGroup(), QPalette::Base), 0.3); } QColor Colors::scrollBarHandleColor(const StyleOptions &options) { ColorVariant variant = options.colorVariant(); if (variant == ColorVariant::Unknown) { variant = isDarkMode() ? ColorVariant::AdwaitaDark : ColorVariant::Adwaita; } QColor fgColor = options.palette().color(QPalette::Text); QColor bgColor = options.palette().color(QPalette::Window); QColor selectedBgColor = options.palette().color(QPalette::Highlight); QColor color(Colors::mix(fgColor, bgColor, 0.4)); QColor hoverColor(Colors::mix(fgColor, bgColor, 0.2)); QColor activeColor(variant == ColorVariant::AdwaitaDark ? Colors::lighten(selectedBgColor, 0.1) : Colors::darken(selectedBgColor, 0.1)); // hover takes precedence over focus if (options.animationMode() == AnimationPressed) { if (options.mouseOver()) { color = Colors::mix(hoverColor, activeColor, options.opacity()); } else { color = Colors::mix(color, activeColor, options.opacity()); } } else if (options.sunken()) { color = activeColor; } else if (options.animationMode() == AnimationHover) { color = Colors::mix(color, hoverColor, options.opacity()); } else if (options.mouseOver()) { color = hoverColor; } return color; } QColor Colors::separatorColor(const StyleOptions &options) { return buttonOutlineColor(options); } QColor Colors::toolButtonColor(const StyleOptions &options) { if (options.sunken() || (options.animationMode() != AnimationNone && options.animationMode() != AnimationHover)) { return buttonBackgroundColor(options); } return Qt::transparent; } QColor Colors::tabBarColor(const StyleOptions &options) { QColor background(Colors::mix(options.palette().window().color(), options.palette().shadow().color(), 0.15)); if (!(options.state() & QStyle::State_Enabled)) { background = background.lighter(115); } if (!(options.state() & QStyle::State_Active)) { background = background.lighter(115); } return background; } } // namespace Adwaita