1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#include "infolabel.h"
#include "icon.h"
#include "utilsicons.h"
#include <QPainter>
#include <QPaintEvent>
namespace Utils {
constexpr int iconSize = 16;
InfoLabel::InfoLabel(QWidget *parent)
: InfoLabel({}, Information, parent)
{
}
InfoLabel::InfoLabel(const QString &text, InfoType type, QWidget *parent)
: ElidingLabel(text, parent)
{
setType(type);
}
InfoLabel::InfoType InfoLabel::type() const
{
return m_type;
}
void InfoLabel::setType(InfoType type)
{
m_type = type;
setContentsMargins(m_type == None ? 0 : iconSize + 2, 0, 0, 0);
update();
}
bool InfoLabel::filled() const
{
return m_filled;
}
void InfoLabel::setFilled(bool filled)
{
m_filled = filled;
}
QSize InfoLabel::minimumSizeHint() const
{
QSize baseHint = ElidingLabel::minimumSizeHint();
baseHint.setHeight(qMax(baseHint.height(), iconSize));
return baseHint;
}
static Theme::Color fillColorForType(InfoLabel::InfoType type)
{
using namespace Utils;
switch (type) {
case InfoLabel::Warning:
return Theme::IconsWarningColor;
case InfoLabel::Ok:
return Theme::IconsRunColor;
case InfoLabel::Error:
case InfoLabel::NotOk:
return Theme::IconsErrorColor;
case InfoLabel::Information:
default:
return Theme::IconsInfoColor;
}
}
static const QIcon &iconForType(InfoLabel::InfoType type)
{
using namespace Utils;
switch (type) {
case InfoLabel::Information: {
static const QIcon icon = Icons::INFO.icon();
return icon;
}
case InfoLabel::Warning: {
static const QIcon icon = Icons::WARNING.icon();
return icon;
}
case InfoLabel::Error: {
static const QIcon icon = Icons::CRITICAL.icon();
return icon;
}
case InfoLabel::Ok: {
static const QIcon icon = Icons::OK.icon();
return icon;
}
case InfoLabel::NotOk: {
static const QIcon icon = Icons::BROKEN.icon();
return icon;
}
default: {
static const QIcon undefined;
return undefined;
}
}
}
void InfoLabel::paintEvent(QPaintEvent *event)
{
if (m_type == None)
return ElidingLabel::paintEvent(event);
const bool centerIconVertically = wordWrap() || elideMode() == Qt::ElideNone;
const QRect iconRect(0, centerIconVertically ? 0 : ((height() - iconSize) / 2),
iconSize, iconSize);
QPainter p(this);
if (m_filled && isEnabled()) {
p.save();
p.setOpacity(0.175);
p.fillRect(rect(), creatorTheme()->color(fillColorForType(m_type)));
p.restore();
}
const QIcon &icon = iconForType(m_type);
QWindow *window = this->window()->windowHandle();
const QIcon::Mode mode = !this->isEnabled() ? QIcon::Disabled : QIcon::Normal;
const QPixmap iconPx =
icon.pixmap(window, QSize(iconSize, iconSize) * devicePixelRatio(), mode);
p.drawPixmap(iconRect, iconPx);
ElidingLabel::paintEvent(event);
}
} // namespace Utils
|