Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtpropertybrowserutils.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <QtWidgets/QApplication>
6#include <QtGui/QPainter>
7#include <QtWidgets/QHBoxLayout>
8#include <QtGui/QMouseEvent>
9#include <QtWidgets/QCheckBox>
10#include <QtWidgets/QLineEdit>
11#include <QtWidgets/QMenu>
12#include <QtCore/QLocale>
13
15
16using namespace Qt::StringLiterals;
17
18// Make sure icons are removed as soon as QApplication is destroyed, otherwise,
19// handles are leaked on X11.
24
26{
27 qAddPostRoutine(clearCursorDatabase);
28
29 appendCursor(Qt::ArrowCursor, QCoreApplication::translate("QtCursorDatabase", "Arrow"),
30 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-arrow.png"_L1));
31 appendCursor(Qt::UpArrowCursor, QCoreApplication::translate("QtCursorDatabase", "Up Arrow"),
32 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-uparrow.png"_L1));
33 appendCursor(Qt::CrossCursor, QCoreApplication::translate("QtCursorDatabase", "Cross"),
34 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-cross.png"_L1));
35 appendCursor(Qt::WaitCursor, QCoreApplication::translate("QtCursorDatabase", "Wait"),
36 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-wait.png"_L1));
37 appendCursor(Qt::IBeamCursor, QCoreApplication::translate("QtCursorDatabase", "IBeam"),
38 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-ibeam.png"_L1));
39 appendCursor(Qt::SizeVerCursor, QCoreApplication::translate("QtCursorDatabase", "Size Vertical"),
40 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizev.png"_L1));
41 appendCursor(Qt::SizeHorCursor, QCoreApplication::translate("QtCursorDatabase", "Size Horizontal"),
42 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeh.png"_L1));
43 appendCursor(Qt::SizeFDiagCursor, QCoreApplication::translate("QtCursorDatabase", "Size Backslash"),
44 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizef.png"_L1));
45 appendCursor(Qt::SizeBDiagCursor, QCoreApplication::translate("QtCursorDatabase", "Size Slash"),
46 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeb.png"_L1));
47 appendCursor(Qt::SizeAllCursor, QCoreApplication::translate("QtCursorDatabase", "Size All"),
48 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-sizeall.png"_L1));
49 appendCursor(Qt::BlankCursor, QCoreApplication::translate("QtCursorDatabase", "Blank"),
50 QIcon());
51 appendCursor(Qt::SplitVCursor, QCoreApplication::translate("QtCursorDatabase", "Split Vertical"),
52 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-vsplit.png"_L1));
53 appendCursor(Qt::SplitHCursor, QCoreApplication::translate("QtCursorDatabase", "Split Horizontal"),
54 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-hsplit.png"_L1));
55 appendCursor(Qt::PointingHandCursor, QCoreApplication::translate("QtCursorDatabase", "Pointing Hand"),
56 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-hand.png"_L1));
57 appendCursor(Qt::ForbiddenCursor, QCoreApplication::translate("QtCursorDatabase", "Forbidden"),
58 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-forbidden.png"_L1));
59 appendCursor(Qt::OpenHandCursor, QCoreApplication::translate("QtCursorDatabase", "Open Hand"),
60 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-openhand.png"_L1));
61 appendCursor(Qt::ClosedHandCursor, QCoreApplication::translate("QtCursorDatabase", "Closed Hand"),
62 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-closedhand.png"_L1));
63 appendCursor(Qt::WhatsThisCursor, QCoreApplication::translate("QtCursorDatabase", "What's This"),
64 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-whatsthis.png"_L1));
65 appendCursor(Qt::BusyCursor, QCoreApplication::translate("QtCursorDatabase", "Busy"),
66 QIcon(":/qt-project.org/qtpropertybrowser/images/cursor-busy.png"_L1));
67}
68
70{
71 m_cursorNames.clear();
72 m_cursorIcons.clear();
73 m_valueToCursorShape.clear();
74 m_cursorShapeToValue.clear();
75}
76
77void QtCursorDatabase::appendCursor(Qt::CursorShape shape, const QString &name, const QIcon &icon)
78{
79 if (m_cursorShapeToValue.contains(shape))
80 return;
81 const qsizetype value = m_cursorNames.size();
82 m_cursorNames.append(name);
83 m_cursorIcons.insert(value, icon);
84 m_valueToCursorShape.insert(value, shape);
85 m_cursorShapeToValue.insert(shape, value);
86}
87
89{
90 return m_cursorNames;
91}
92
94{
95 return m_cursorIcons;
96}
97
98QString QtCursorDatabase::cursorToShapeName(const QCursor &cursor) const
99{
100 int val = cursorToValue(cursor);
101 if (val >= 0)
102 return m_cursorNames.at(val);
103 return {};
104}
105
106QIcon QtCursorDatabase::cursorToShapeIcon(const QCursor &cursor) const
107{
108 int val = cursorToValue(cursor);
109 return m_cursorIcons.value(val);
110}
111
112int QtCursorDatabase::cursorToValue(const QCursor &cursor) const
113{
114#ifndef QT_NO_CURSOR
115 return m_cursorShapeToValue.value(cursor.shape(), -1);
116#endif
117 return -1;
118}
119
120#ifndef QT_NO_CURSOR
122{
123 auto it = m_valueToCursorShape.constFind(value);
124 if (it != m_valueToCursorShape.cend())
125 return QCursor(it.value());
126 return {};
127}
128#endif
129
130Q_GLOBAL_STATIC(QtCursorDatabase, cursorDatabase)
131
133{
134 return cursorDatabase();
135}
136
137QPixmap QtPropertyBrowserUtils::brushValuePixmap(const QBrush &b)
138{
139 QImage img(16, 16, QImage::Format_ARGB32_Premultiplied);
140 img.fill(0);
141
142 QPainter painter(&img);
143 painter.setCompositionMode(QPainter::CompositionMode_Source);
144 painter.fillRect(0, 0, img.width(), img.height(), b);
145 QColor color = b.color();
146 if (color.alpha() != 255) { // indicate alpha by an inset
147 QBrush opaqueBrush = b;
148 color.setAlpha(255);
149 opaqueBrush.setColor(color);
150 painter.fillRect(img.width() / 4, img.height() / 4,
151 img.width() / 2, img.height() / 2, opaqueBrush);
152 }
153 painter.end();
154 return QPixmap::fromImage(img);
155}
156
157QIcon QtPropertyBrowserUtils::brushValueIcon(const QBrush &b)
158{
159 return QIcon(brushValuePixmap(b));
160}
161
162QString QtPropertyBrowserUtils::colorValueText(QColor c)
163{
164 return QCoreApplication::translate("QtPropertyBrowserUtils", "[%1, %2, %3] (%4)")
165 .arg(c.red()).arg(c.green()).arg(c.blue()).arg(c.alpha());
166}
167
168QPixmap QtPropertyBrowserUtils::fontValuePixmap(const QFont &font)
169{
170 QFont f = font;
171 QImage img(16, 16, QImage::Format_ARGB32_Premultiplied);
172 img.fill(0);
173 QPainter p(&img);
174 p.setRenderHint(QPainter::TextAntialiasing, true);
175 p.setRenderHint(QPainter::Antialiasing, true);
176 f.setPointSize(13);
177 p.setFont(f);
178 QTextOption t;
179 t.setAlignment(Qt::AlignCenter);
180 p.drawText(QRect(0, 0, 16, 16), QString(QLatin1Char('A')), t);
181 return QPixmap::fromImage(img);
182}
183
184QIcon QtPropertyBrowserUtils::fontValueIcon(const QFont &f)
185{
186 return QIcon(fontValuePixmap(f));
187}
188
189QString QtPropertyBrowserUtils::fontValueText(const QFont &f)
190{
191 return QCoreApplication::translate("QtPropertyBrowserUtils", "[%1, %2]")
192 .arg(f.family()).arg(f.pointSize());
193}
194
195QString QtPropertyBrowserUtils::dateFormat()
196{
197 QLocale loc;
198 QString format = loc.dateFormat(QLocale::ShortFormat);
199 // Change dd.MM.yy, MM/dd/yy to 4 digit years
200 if (format.count(QLatin1Char('y')) == 2)
201 format.insert(format.indexOf(QLatin1Char('y')), "yy"_L1);
202 return format;
203}
204
205QString QtPropertyBrowserUtils::timeFormat()
206{
207 QLocale loc;
208 // ShortFormat is missing seconds on UNIX.
209 return loc.timeFormat(QLocale::LongFormat);
210}
211
212QString QtPropertyBrowserUtils::dateTimeFormat()
213{
214 QString format = dateFormat();
215 format += QLatin1Char(' ');
216 format += timeFormat();
217 return format;
218}
219
220QtBoolEdit::QtBoolEdit(QWidget *parent) :
221 QWidget(parent),
222 m_checkBox(new QCheckBox(this)),
223 m_textVisible(true)
224{
225 auto *lt = new QHBoxLayout;
226 if (QApplication::layoutDirection() == Qt::LeftToRight)
227 lt->setContentsMargins(4, 0, 0, 0);
228 else
229 lt->setContentsMargins(0, 0, 4, 0);
230 lt->addWidget(m_checkBox);
231 setLayout(lt);
232 connect(m_checkBox, &QAbstractButton::toggled, this, &QtBoolEdit::toggled);
233 setFocusProxy(m_checkBox);
234 m_checkBox->setText(tr("True"));
235}
236
237void QtBoolEdit::setTextVisible(bool textVisible)
238{
239 if (m_textVisible == textVisible)
240 return;
241
242 m_textVisible = textVisible;
243 if (m_textVisible)
244 m_checkBox->setText(isChecked() ? tr("True") : tr("False"));
245 else
246 m_checkBox->setText(QString());
247}
248
250{
251 return m_checkBox->checkState();
252}
253
254void QtBoolEdit::setCheckState(Qt::CheckState state)
255{
256 m_checkBox->setCheckState(state);
257}
258
260{
261 return m_checkBox->isChecked();
262}
263
265{
266 m_checkBox->setChecked(c);
267 if (!m_textVisible)
268 return;
269 m_checkBox->setText(isChecked() ? tr("True") : tr("False"));
270}
271
273{
274 return m_checkBox->blockSignals(block);
275}
276
277void QtBoolEdit::mousePressEvent(QMouseEvent *event)
278{
279 if (event->buttons() == Qt::LeftButton) {
280 m_checkBox->click();
281 event->accept();
282 } else {
283 QWidget::mousePressEvent(event);
284 }
285}
286
287QT_END_NAMESPACE
Qt::CheckState checkState() const
void setTextVisible(bool textVisible)
bool blockCheckBoxSignals(bool block)
void setCheckState(Qt::CheckState state)
QCursor valueToCursor(int value) const
QStringList cursorShapeNames() const
int cursorToValue(const QCursor &cursor) const
QString cursorToShapeName(const QCursor &cursor) const
QIcon cursorToShapeIcon(const QCursor &cursor) const
static QtCursorDatabase * instance()
QMap< int, QIcon > cursorShapeIcons() const
static void clearCursorDatabase()