1 /*
2   styleoption.cpp
3 
4   This file is part of GammaRay, the Qt application inspection and
5   manipulation tool.
6 
7   Copyright (C) 2012-2021 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
8   Author: Volker Krause <volker.krause@kdab.com>
9 
10   Licensees holding valid commercial KDAB GammaRay licenses may use this file in
11   accordance with GammaRay Commercial License Agreement provided with the Software.
12 
13   Contact info@kdab.com if any conditions of this licensing are not clear to you.
14 
15   This program is free software; you can redistribute it and/or modify
16   it under the terms of the GNU General Public License as published by
17   the Free Software Foundation, either version 2 of the License, or
18   (at your option) any later version.
19 
20   This program is distributed in the hope that it will be useful,
21   but WITHOUT ANY WARRANTY; without even the implied warranty of
22   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23   GNU General Public License for more details.
24 
25   You should have received a copy of the GNU General Public License
26   along with this program.  If not, see <http://www.gnu.org/licenses/>.
27 */
28 
29 #include "styleoption.h"
30 
31 #include <QStyleOption>
32 
33 using namespace GammaRay;
34 
35 // The following commit in qtbase.git deprecated versioned style class in 5.7.0
36 //   95a6dc1 - QStyleOption*V<N>: mark as Q_DECL_DEPRECATED
37 #if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
38 using QStyleOptionFrameCV = QStyleOptionFrame;
39 using QStyleOptionToolBoxCV = QStyleOptionToolBox;
40 using QStyleOptionTabCV = QStyleOptionTab;
41 using QStyleOptionTabBarBaseCV = QStyleOptionTabBarBase;
42 using QStyleOptionTabWidgetFrameCV = QStyleOptionTabWidgetFrame;
43 using QStyleOptionViewItemCV = QStyleOptionViewItem;
44 using QStyleOptionProgressBarCV = QStyleOptionProgressBar;
45 #else
46 typedef QStyleOptionFrameV3 QStyleOptionFrameCV;
47 typedef QStyleOptionToolBoxV2 QStyleOptionToolBoxCV;
48 typedef QStyleOptionTabBarBaseV2 QStyleOptionTabBarBaseCV;
49 typedef QStyleOptionTabV3 QStyleOptionTabCV;
50 typedef QStyleOptionTabWidgetFrameV2 QStyleOptionTabWidgetFrameCV;
51 typedef QStyleOptionViewItemV4 QStyleOptionViewItemCV;
52 typedef QStyleOptionProgressBarV2 QStyleOptionProgressBarCV;
53 #endif
54 
55 struct style_state_t {
56     const char *name;
57     QStyle::State state;
58 };
59 
60 #define MAKE_STATE(state) { #state, QStyle:: state }
61 
62 static const style_state_t styleStates[] = {
63     MAKE_STATE(State_None),
64     MAKE_STATE(State_Enabled),
65     MAKE_STATE(State_Raised),
66     MAKE_STATE(State_Sunken),
67     MAKE_STATE(State_Off),
68     MAKE_STATE(State_NoChange),
69     MAKE_STATE(State_On),
70     MAKE_STATE(State_DownArrow),
71     MAKE_STATE(State_Horizontal),
72     MAKE_STATE(State_HasFocus),
73     MAKE_STATE(State_Top),
74     MAKE_STATE(State_Bottom),
75     MAKE_STATE(State_FocusAtBorder),
76     MAKE_STATE(State_AutoRaise),
77     MAKE_STATE(State_MouseOver),
78     MAKE_STATE(State_UpArrow),
79     MAKE_STATE(State_Selected),
80     MAKE_STATE(State_Active),
81     MAKE_STATE(State_Window),
82     MAKE_STATE(State_Open),
83     MAKE_STATE(State_Children),
84     MAKE_STATE(State_Item),
85     MAKE_STATE(State_Sibling),
86     MAKE_STATE(State_Editing),
87     MAKE_STATE(State_KeyboardFocusChange),
88     MAKE_STATE(State_ReadOnly),
89     MAKE_STATE(State_Small),
90     MAKE_STATE(State_Mini)
91 };
92 
stateCount()93 int StyleOption::stateCount()
94 {
95     return sizeof(styleStates) / sizeof(style_state_t);
96 }
97 
stateDisplayName(int index)98 QString StyleOption::stateDisplayName(int index)
99 {
100     return QString::fromLatin1(styleStates[index].name).mid(6); // remove the State_ prefix
101 }
102 
prettyState(int index)103 QStyle::State StyleOption::prettyState(int index)
104 {
105     QStyle::State s = styleStates[index].state;
106     if (s == QStyle::State_None)
107         return s;
108     return s | QStyle::State_Enabled; // enable by default, else we usually see disabled stuff only
109 }
110 
makeStyleOption()111 QStyleOption *StyleOption::makeStyleOption()
112 {
113     return new QStyleOption;
114 }
115 
makeStyleOptionComplex()116 QStyleOption *StyleOption::makeStyleOptionComplex()
117 {
118     return new QStyleOptionComplex;
119 }
120 
makeButtonStyleOption()121 QStyleOption *StyleOption::makeButtonStyleOption()
122 {
123     auto *opt = new QStyleOptionButton;
124     opt->features = QStyleOptionButton::None;
125     opt->text = QStringLiteral("Label");
126     return opt;
127 }
128 
makeComboBoxStyleOption()129 QStyleOption *StyleOption::makeComboBoxStyleOption()
130 {
131     auto *opt = new QStyleOptionComboBox;
132     opt->frame = true;
133     opt->currentText = QStringLiteral("Current Text");
134     return opt;
135 }
136 
makeFrameStyleOption()137 QStyleOption *StyleOption::makeFrameStyleOption()
138 {
139     auto opt = new QStyleOptionFrameCV;
140     opt->lineWidth = 1;
141     opt->midLineWidth = 0;
142     opt->frameShape = QFrame::StyledPanel;
143     return opt;
144 }
145 
makeGroupBoxStyleOption()146 QStyleOption *StyleOption::makeGroupBoxStyleOption()
147 {
148     auto *opt = new QStyleOptionGroupBox;
149     opt->lineWidth = 1;
150     opt->midLineWidth = 0;
151     opt->text = QStringLiteral("Label");
152     return opt;
153 }
154 
makeHeaderStyleOption()155 QStyleOption *StyleOption::makeHeaderStyleOption()
156 {
157     auto *opt = new QStyleOptionHeader;
158     opt->orientation = Qt::Horizontal;
159     opt->text = QStringLiteral("Label");
160     return opt;
161 }
162 
makeItemViewStyleOption()163 QStyleOption *StyleOption::makeItemViewStyleOption()
164 {
165     auto opt = new QStyleOptionViewItemCV;
166     opt->text = QStringLiteral("Text");
167     opt->features = QStyleOptionViewItemCV::HasDisplay;
168     return opt;
169 }
170 
makeMenuStyleOption()171 QStyleOption *StyleOption::makeMenuStyleOption()
172 {
173     auto *opt = new QStyleOptionMenuItem;
174     opt->text = QStringLiteral("Label");
175     return opt;
176 }
177 
makeProgressBarStyleOption()178 QStyleOption *StyleOption::makeProgressBarStyleOption()
179 {
180     auto opt = new QStyleOptionProgressBarCV;
181     opt->minimum = 0;
182     opt->maximum = 100;
183     opt->progress = 42;
184     return opt;
185 }
186 
makeSliderStyleOption()187 QStyleOption *StyleOption::makeSliderStyleOption()
188 {
189     auto *opt = new QStyleOptionSlider;
190     opt->minimum = 0;
191     opt->maximum = 100;
192     opt->sliderValue = 42;
193     opt->tickInterval = 5;
194     return opt;
195 }
196 
makeSpinBoxStyleOption()197 QStyleOption *StyleOption::makeSpinBoxStyleOption()
198 {
199     auto *opt = new QStyleOptionSpinBox;
200     opt->frame = true;
201     return opt;
202 }
203 
makeTabStyleOption()204 QStyleOption *StyleOption::makeTabStyleOption()
205 {
206     auto opt = new QStyleOptionTabCV;
207     opt->text = QStringLiteral("Label");
208     return opt;
209 }
210 
makeTabBarBaseStyleOption()211 QStyleOption *StyleOption::makeTabBarBaseStyleOption()
212 {
213     return new QStyleOptionTabBarBaseCV;
214 }
215 
makeTabWidgetFrameStyleOption()216 QStyleOption *StyleOption::makeTabWidgetFrameStyleOption()
217 {
218     auto opt = new QStyleOptionTabWidgetFrameCV;
219     opt->lineWidth = 1;
220     return opt;
221 }
222 
makeTitleBarStyleOption()223 QStyleOption *StyleOption::makeTitleBarStyleOption()
224 {
225     auto *opt = new QStyleOptionTitleBar;
226     opt->text = QStringLiteral("Title");
227     opt->titleBarFlags = Qt::WindowMinMaxButtonsHint
228                          |Qt::WindowTitleHint
229                          |Qt::WindowSystemMenuHint
230                          |Qt::WindowCloseButtonHint;
231     return opt;
232 }
233 
makeToolBoxStyleOption()234 QStyleOption *StyleOption::makeToolBoxStyleOption()
235 {
236     auto opt = new QStyleOptionToolBoxCV;
237     opt->text = QStringLiteral("Label");
238     return opt;
239 }
240 
makeToolButtonStyleOption()241 QStyleOption *StyleOption::makeToolButtonStyleOption()
242 {
243     auto *opt = new QStyleOptionToolButton;
244     opt->text = QStringLiteral("Label");
245     opt->toolButtonStyle = Qt::ToolButtonFollowStyle;
246     return opt;
247 }
248