1 /* Preview widget for KDE Display color scheme setup module
2     SPDX-FileCopyrightText: 2007 Matthew Woehlke <mw_triad@users.sourceforge.net>
3     SPDX-FileCopyrightText: 2007 Urs Wolfer <uwolfer @ kde.org>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "previewwidget.h"
9 
10 #include <KColorScheme>
11 
PreviewWidget(QWidget * parent)12 PreviewWidget::PreviewWidget(QWidget *parent)
13     : QFrame(parent)
14 {
15     setupUi(this);
16 
17     // set correct colors on... lots of things
18     setAutoFillBackground(true);
19     frame->setBackgroundRole(QPalette::Base);
20     viewWidget->setBackgroundRole(QPalette::Base);
21     labelView0->setBackgroundRole(QPalette::Base);
22     labelView3->setBackgroundRole(QPalette::Base);
23     labelView4->setBackgroundRole(QPalette::Base);
24     labelView2->setBackgroundRole(QPalette::Base);
25     labelView1->setBackgroundRole(QPalette::Base);
26     labelView5->setBackgroundRole(QPalette::Base);
27     labelView6->setBackgroundRole(QPalette::Base);
28     labelView7->setBackgroundRole(QPalette::Base);
29     selectionWidget->setBackgroundRole(QPalette::Highlight);
30     labelSelection0->setBackgroundRole(QPalette::Highlight);
31     labelSelection3->setBackgroundRole(QPalette::Highlight);
32     labelSelection4->setBackgroundRole(QPalette::Highlight);
33     labelSelection2->setBackgroundRole(QPalette::Highlight);
34     labelSelection1->setBackgroundRole(QPalette::Highlight);
35     labelSelection5->setBackgroundRole(QPalette::Highlight);
36     labelSelection6->setBackgroundRole(QPalette::Highlight);
37     labelSelection7->setBackgroundRole(QPalette::Highlight);
38 
39     QList<QWidget *> widgets = findChildren<QWidget *>();
40     foreach (QWidget *widget, widgets) {
41         widget->installEventFilter(this);
42         widget->setFocusPolicy(Qt::NoFocus);
43     }
44 }
45 
~PreviewWidget()46 PreviewWidget::~PreviewWidget()
47 {
48 }
49 
eventFilter(QObject *,QEvent * ev)50 bool PreviewWidget::eventFilter(QObject *, QEvent *ev)
51 {
52     switch (ev->type()) {
53     case QEvent::MouseButtonPress:
54     case QEvent::MouseButtonRelease:
55     case QEvent::MouseButtonDblClick:
56     case QEvent::MouseMove:
57     case QEvent::KeyPress:
58     case QEvent::KeyRelease:
59     case QEvent::Enter:
60     case QEvent::Leave:
61     case QEvent::Wheel:
62     case QEvent::ContextMenu:
63         return true; // ignore
64     default:
65         break;
66     }
67     return false;
68 }
69 
copyPaletteBrush(QPalette & palette,QPalette::ColorGroup state,QPalette::ColorRole role)70 inline void copyPaletteBrush(QPalette &palette, QPalette::ColorGroup state, QPalette::ColorRole role)
71 {
72     palette.setBrush(QPalette::Active, role, palette.brush(state, role));
73     if (state == QPalette::Disabled)
74         // ### hack, while Qt has no inactive+disabled state
75         // TODO copy from Inactive+Disabled to Inactive instead
76         palette.setBrush(QPalette::Inactive, role, palette.brush(QPalette::Disabled, role));
77 }
78 
setPaletteRecursive(QWidget * widget,const QPalette & palette)79 void PreviewWidget::setPaletteRecursive(QWidget *widget, const QPalette &palette)
80 {
81     widget->setPalette(palette);
82 
83     const QObjectList children = widget->children();
84     foreach (QObject *child, children) {
85         if (child->isWidgetType())
86             setPaletteRecursive((QWidget *)child, palette);
87     }
88 }
89 
adjustWidgetForeground(QWidget * widget,QPalette::ColorGroup state,const KSharedConfigPtr & config,QPalette::ColorRole color,KColorScheme::ColorSet set,KColorScheme::ForegroundRole role)90 inline void adjustWidgetForeground(QWidget *widget,
91                                    QPalette::ColorGroup state,
92                                    const KSharedConfigPtr &config,
93                                    QPalette::ColorRole color,
94                                    KColorScheme::ColorSet set,
95                                    KColorScheme::ForegroundRole role)
96 {
97     QPalette palette = widget->palette();
98     KColorScheme::adjustForeground(palette, role, color, set, config);
99     copyPaletteBrush(palette, state, color);
100     widget->setPalette(palette);
101 }
102 
setPalette(const KSharedConfigPtr & config,QPalette::ColorGroup state)103 void PreviewWidget::setPalette(const KSharedConfigPtr &config, QPalette::ColorGroup state)
104 {
105     QPalette palette = KColorScheme::createApplicationPalette(config);
106 
107     if (state != QPalette::Active) {
108         copyPaletteBrush(palette, state, QPalette::Base);
109         copyPaletteBrush(palette, state, QPalette::Text);
110         copyPaletteBrush(palette, state, QPalette::Window);
111         copyPaletteBrush(palette, state, QPalette::WindowText);
112         copyPaletteBrush(palette, state, QPalette::Button);
113         copyPaletteBrush(palette, state, QPalette::ButtonText);
114         copyPaletteBrush(palette, state, QPalette::Highlight);
115         copyPaletteBrush(palette, state, QPalette::HighlightedText);
116         copyPaletteBrush(palette, state, QPalette::AlternateBase);
117         copyPaletteBrush(palette, state, QPalette::Link);
118         copyPaletteBrush(palette, state, QPalette::LinkVisited);
119         copyPaletteBrush(palette, state, QPalette::Light);
120         copyPaletteBrush(palette, state, QPalette::Midlight);
121         copyPaletteBrush(palette, state, QPalette::Mid);
122         copyPaletteBrush(palette, state, QPalette::Dark);
123         copyPaletteBrush(palette, state, QPalette::Shadow);
124     }
125 
126     setPaletteRecursive(this, palette);
127 
128 #define ADJUST_WIDGET_FOREGROUND(w, c, s, r) adjustWidgetForeground(w, state, config, QPalette::c, KColorScheme::s, KColorScheme::r);
129 
130     ADJUST_WIDGET_FOREGROUND(labelView1, Text, View, InactiveText);
131     ADJUST_WIDGET_FOREGROUND(labelView2, Text, View, ActiveText);
132     ADJUST_WIDGET_FOREGROUND(labelView3, Text, View, LinkText);
133     ADJUST_WIDGET_FOREGROUND(labelView4, Text, View, VisitedText);
134     ADJUST_WIDGET_FOREGROUND(labelView5, Text, View, NegativeText);
135     ADJUST_WIDGET_FOREGROUND(labelView6, Text, View, NeutralText);
136     ADJUST_WIDGET_FOREGROUND(labelView7, Text, View, PositiveText);
137 
138     ADJUST_WIDGET_FOREGROUND(labelSelection1, HighlightedText, Selection, InactiveText);
139     ADJUST_WIDGET_FOREGROUND(labelSelection2, HighlightedText, Selection, ActiveText);
140     ADJUST_WIDGET_FOREGROUND(labelSelection3, HighlightedText, Selection, LinkText);
141     ADJUST_WIDGET_FOREGROUND(labelSelection4, HighlightedText, Selection, VisitedText);
142     ADJUST_WIDGET_FOREGROUND(labelSelection5, HighlightedText, Selection, NegativeText);
143     ADJUST_WIDGET_FOREGROUND(labelSelection6, HighlightedText, Selection, NeutralText);
144     ADJUST_WIDGET_FOREGROUND(labelSelection7, HighlightedText, Selection, PositiveText);
145 }
146