]> cloud.milkyroute.net Git - dolphin.git/blob - src/selectionmode/backgroundcolorhelper.cpp
1615c36bbb9eaf034688426d6a3bc53af19ee5bd
[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 <QWidget>
15
16 using namespace SelectionMode;
17
18 BackgroundColorHelper *BackgroundColorHelper::instance()
19 {
20 if (!s_instance) {
21 s_instance = new BackgroundColorHelper;
22 }
23 return s_instance;
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(),
41 "controlBackgroundColor",
42 "Duplicate insertion is not necessary because the background color should already automatically update itself on paletteChanged");
43 m_colorControlledWidgets.emplace_back(widget);
44 }
45
46 BackgroundColorHelper::BackgroundColorHelper()
47 {
48 updateBackgroundColor();
49 QObject::connect(qApp, &QGuiApplication::paletteChanged, [=]() {
50 slotPaletteChanged();
51 });
52 }
53
54 void BackgroundColorHelper::slotPaletteChanged()
55 {
56 updateBackgroundColor();
57 for (auto i = m_colorControlledWidgets.begin(); i != m_colorControlledWidgets.end(); ++i) {
58 while (!*i) {
59 i = m_colorControlledWidgets.erase(i);
60 if (i == m_colorControlledWidgets.end()) {
61 return;
62 }
63 }
64 setBackgroundColorForWidget(*i, m_backgroundColor);
65 }
66 }
67
68 void BackgroundColorHelper::updateBackgroundColor()
69 {
70 // We use colors from the color scheme for mixing so it fits the theme.
71 const auto colorScheme = KColorScheme(QPalette::Normal, KColorScheme::Window);
72 const auto activeBackgroundColor = colorScheme.background(KColorScheme::BackgroundRole::ActiveBackground).color();
73 // We use the positive color for mixing so the end product doesn't look like a warning or error.
74 const auto positiveBackgroundColor = colorScheme.background(KColorScheme::BackgroundRole::PositiveBackground).color();
75
76 // Make sure the new background color has a meaningfully different hue than the activeBackgroundColor.
77 const int hueDifference = positiveBackgroundColor.hue() - activeBackgroundColor.hue();
78 int newHue;
79 if (std::abs(hueDifference) > 80) {
80 newHue = (activeBackgroundColor.hue() + positiveBackgroundColor.hue()) / 2;
81 } else {
82 newHue = hueDifference > 0 ? activeBackgroundColor.hue() + 40 : activeBackgroundColor.hue() - 40;
83 newHue %= 360; // hue needs to be between 0 and 359 per Qt documentation.
84 }
85
86 m_backgroundColor = QColor::fromHsv(newHue,
87 // Saturation should be closer to the saturation of the active color
88 // because otherwise the selection mode color might overpower it.
89 .7 * activeBackgroundColor.saturation() + .3 * positiveBackgroundColor.saturation(),
90 (activeBackgroundColor.value() + positiveBackgroundColor.value()) / 2,
91 (activeBackgroundColor.alpha() + positiveBackgroundColor.alpha()) / 2);
92 }
93
94 BackgroundColorHelper *BackgroundColorHelper::s_instance = nullptr;