]> cloud.milkyroute.net Git - dolphin.git/blob - src/selectionmode/backgroundcolorhelper.cpp
Keep working towards a reviewable state
[dolphin.git] / src / selectionmode / backgroundcolorhelper.cpp
1 /*
2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 2022 Felix Ernst <felixernst@zohomail.eu>
4
5 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6 */
7
8 #include "backgroundcolorhelper.h"
9
10 #include <KColorScheme>
11
12 #include <QGuiApplication>
13 #include <QPalette>
14 #include <QtGlobal>
15 #include <QWidget>
16
17 BackgroundColorHelper *BackgroundColorHelper::instance()
18 {
19 if (!s_instance) {
20 s_instance = new BackgroundColorHelper;
21 }
22 return s_instance;
23 }
24
25
26 void setBackgroundColorForWidget(QWidget *widget, QColor color)
27 {
28 QPalette palette;
29 palette.setBrush(QPalette::Active, QPalette::Window, color);
30 palette.setBrush(QPalette::Inactive, QPalette::Window, color);
31 palette.setBrush(QPalette::Disabled, QPalette::Window, color);
32 widget->setAutoFillBackground(true);
33 widget->setPalette(palette);
34 }
35
36 void BackgroundColorHelper::controlBackgroundColor(QWidget *widget)
37 {
38 setBackgroundColorForWidget(widget, m_backgroundColor);
39
40 Q_ASSERT_X(std::find(m_colorControlledWidgets.begin(), m_colorControlledWidgets.end(), widget) == m_colorControlledWidgets.end(), "controlBackgroundColor",
41 "Duplicate insertion is not necessary because the background color should already automatically update itself on paletteChanged");
42 m_colorControlledWidgets.emplace_back(widget);
43 }
44
45 BackgroundColorHelper::BackgroundColorHelper()
46 {
47 updateBackgroundColor();
48 QObject::connect(qApp, &QGuiApplication::paletteChanged, [=](){ slotPaletteChanged(); });
49 }
50
51 void BackgroundColorHelper::slotPaletteChanged()
52 {
53 updateBackgroundColor();
54 for (auto i = m_colorControlledWidgets.begin(); i != m_colorControlledWidgets.end(); ++i) {
55 if (!*i) {
56 i = m_colorControlledWidgets.erase(i);
57 continue;
58 }
59 setBackgroundColorForWidget(*i, m_backgroundColor);
60 }
61 }
62
63 void BackgroundColorHelper::updateBackgroundColor()
64 {
65 // We use colors from the color scheme for mixing so it fits the theme.
66 const auto colorScheme = KColorScheme(QPalette::Normal, KColorScheme::Window);
67 const auto activeBackgroundColor = colorScheme.background(KColorScheme::BackgroundRole::ActiveBackground).color();
68 // We use the positive color for mixing so the end product doesn't look like a warning or error.
69 const auto positiveBackgroundColor = colorScheme.background(KColorScheme::BackgroundRole::PositiveBackground).color();
70
71 // Make sure the new background color has a meaningfully different hue than the activeBackgroundColor.
72 const int hueDifference = positiveBackgroundColor.hue() - activeBackgroundColor.hue();
73 int newHue;
74 if (std::abs(hueDifference) > 80) {
75 newHue = (activeBackgroundColor.hue() + positiveBackgroundColor.hue()) / 2;
76 } else {
77 newHue = hueDifference > 0 ?
78 activeBackgroundColor.hue() + 40 :
79 activeBackgroundColor.hue() - 40;
80 newHue %= 360; // hue needs to be between 0 and 359 per Qt documentation.
81 }
82
83 m_backgroundColor = QColor::fromHsv(newHue,
84 // Saturation should be closer to the active color because otherwise the selection mode color might overpower it.
85 .7 * activeBackgroundColor.saturation() + .3 * positiveBackgroundColor.saturation(),
86 (activeBackgroundColor.value() + positiveBackgroundColor.value()) / 2,
87 (activeBackgroundColor.alpha() + positiveBackgroundColor.alpha()) / 2);
88 }
89
90 BackgroundColorHelper *BackgroundColorHelper::s_instance = nullptr;