Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickiconlabel.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 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
4#include "qquickiconlabel_p.h"
6#include "qquickiconimage_p.h"
8
9#include <QtGui/private/qguiapplication_p.h>
10#include <QtQuick/private/qquickitem_p.h>
11#include <QtQuick/private/qquicktext_p.h>
12
14
16{
17 if (QQmlParserStatus *parserStatus = qobject_cast<QQmlParserStatus *>(item))
18 parserStatus->classBegin();
19}
20
22{
23 if (QQmlParserStatus *parserStatus = qobject_cast<QQmlParserStatus *>(item))
24 parserStatus->componentComplete();
25}
26
28
33
38
40{
41 Q_Q(QQuickIconLabel);
42 if (image)
43 return false;
44
45 image = new QQuickIconImage(q);
48 image->setObjectName(QStringLiteral("image"));
49 image->setName(icon.name());
50 image->setSource(icon.resolvedSource());
51 image->setSourceSize(QSize(icon.width(), icon.height()));
52 image->setColor(icon.color());
53 image->setCache(icon.cache());
57 return true;
58}
59
61{
62 if (!image)
63 return false;
64
66 delete image;
67 image = nullptr;
68 return true;
69}
70
72{
73 if (!hasIcon())
74 return destroyImage();
75 return createImage();
76}
77
79{
80 if (!image || icon.isEmpty())
81 return;
82
83 image->setName(icon.name());
84 image->setSource(icon.resolvedSource());
85 image->setSourceSize(QSize(icon.width(), icon.height()));
86 image->setColor(icon.color());
87 image->setCache(icon.cache());
88 const int valign = alignment & Qt::AlignVertical_Mask;
89 image->setVerticalAlignment(static_cast<QQuickImage::VAlignment>(valign));
90 const int halign = alignment & Qt::AlignHorizontal_Mask;
91 image->setHorizontalAlignment(static_cast<QQuickImage::HAlignment>(halign));
92}
93
95{
96 if (updateImage()) {
99 layout();
100 }
101 } else {
102 syncImage();
103 }
104}
105
107{
108 Q_Q(QQuickIconLabel);
109 if (label)
110 return false;
111
115 label->setObjectName(QStringLiteral("label"));
116 label->setFont(font);
117 label->setColor(color);
118 label->setElideMode(QQuickText::ElideRight);
119 const int valign = alignment & Qt::AlignVertical_Mask;
120 label->setVAlign(static_cast<QQuickText::VAlignment>(valign));
121 const int halign = alignment & Qt::AlignHorizontal_Mask;
122 label->setHAlign(static_cast<QQuickText::HAlignment>(halign));
123 label->setText(text);
126 return true;
127}
128
130{
131 if (!label)
132 return false;
133
135 delete label;
136 label = nullptr;
137 return true;
138}
139
141{
142 if (!hasText())
143 return destroyLabel();
144 return createLabel();
145}
146
148{
149 if (!label)
150 return;
151
152 label->setText(text);
153}
154
156{
157 if (updateLabel()) {
158 if (componentComplete) {
160 layout();
161 }
162 } else {
163 syncLabel();
164 }
165}
166
168{
169 Q_Q(QQuickIconLabel);
170 const bool showIcon = image && hasIcon();
171 const bool showText = label && hasText();
172 const qreal horizontalPadding = leftPadding + rightPadding;
173 const qreal verticalPadding = topPadding + bottomPadding;
174 const qreal iconImplicitWidth = showIcon ? image->implicitWidth() : 0;
175 const qreal iconImplicitHeight = showIcon ? image->implicitHeight() : 0;
176 const qreal textImplicitWidth = showText ? label->implicitWidth() : 0;
177 const qreal textImplicitHeight = showText ? label->implicitHeight() : 0;
178 const qreal effectiveSpacing = showText && showIcon && image->implicitWidth() > 0 ? spacing : 0;
179 const qreal implicitWidth = display == QQuickIconLabel::TextBesideIcon ? iconImplicitWidth + textImplicitWidth + effectiveSpacing
180 : qMax(iconImplicitWidth, textImplicitWidth);
181 const qreal implicitHeight = display == QQuickIconLabel::TextUnderIcon ? iconImplicitHeight + textImplicitHeight + effectiveSpacing
182 : qMax(iconImplicitHeight, textImplicitHeight);
183 q->setImplicitSize(implicitWidth + horizontalPadding, implicitHeight + verticalPadding);
184}
185
186// adapted from QStyle::alignedRect()
187static QRectF alignedRect(bool mirrored, Qt::Alignment alignment, const QSizeF &size, const QRectF &rectangle)
188{
190 qreal x = rectangle.x();
191 qreal y = rectangle.y();
192 const qreal w = size.width();
193 const qreal h = size.height();
195 y += rectangle.height() / 2 - h / 2;
197 y += rectangle.height() - h;
199 x += rectangle.width() - w;
201 x += rectangle.width() / 2 - w / 2;
202 return QRectF(x, y, w, h);
203}
204
206{
207 Q_Q(QQuickIconLabel);
209 return;
210
211 const qreal availableWidth = width - leftPadding - rightPadding;
212 const qreal availableHeight = height - topPadding - bottomPadding;
213
214 switch (display) {
216 if (image) {
217 const QRectF iconRect = alignedRect(mirrored, alignment,
218 QSizeF(qMin(image->implicitWidth(), availableWidth),
219 qMin(image->implicitHeight(), availableHeight)),
220 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
221 image->setSize(iconRect.size());
222 image->setPosition(iconRect.topLeft());
223 }
224 break;
226 if (label) {
228 QSizeF(qMin(label->implicitWidth(), availableWidth),
229 qMin(label->implicitHeight(), availableHeight)),
230 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
231 label->setSize(textRect.size());
232 label->setPosition(textRect.topLeft());
233 }
234 break;
235
237 // Work out the sizes first, as the positions depend on them.
239 QSizeF textSize;
240 if (image) {
241 iconSize.setWidth(qMin(image->implicitWidth(), availableWidth));
242 iconSize.setHeight(qMin(image->implicitHeight(), availableHeight));
243 }
244 qreal effectiveSpacing = 0;
245 if (label) {
246 if (!iconSize.isEmpty())
247 effectiveSpacing = spacing;
248 textSize.setWidth(qMin(label->implicitWidth(), availableWidth));
249 textSize.setHeight(qMin(label->implicitHeight(), availableHeight - iconSize.height() - effectiveSpacing));
250 }
251
252 QRectF combinedRect = alignedRect(mirrored, alignment,
253 QSizeF(qMax(iconSize.width(), textSize.width()),
254 iconSize.height() + effectiveSpacing + textSize.height()),
255 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
256 if (image) {
257 QRectF iconRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignTop, iconSize, combinedRect);
258 image->setSize(iconRect.size());
259 image->setPosition(iconRect.topLeft());
260 }
261 if (label) {
263 label->setSize(textRect.size());
264 label->setPosition(textRect.topLeft());
265 }
266 break;
267 }
268
270 default:
271 // Work out the sizes first, as the positions depend on them.
272 QSizeF iconSize(0, 0);
273 QSizeF textSize(0, 0);
274 if (image) {
275 iconSize.setWidth(qMin(image->implicitWidth(), availableWidth));
276 iconSize.setHeight(qMin(image->implicitHeight(), availableHeight));
277 }
278 qreal effectiveSpacing = 0;
279 if (label) {
280 if (!iconSize.isEmpty())
281 effectiveSpacing = spacing;
282 textSize.setWidth(qMin(label->implicitWidth(), availableWidth - iconSize.width() - effectiveSpacing));
283 textSize.setHeight(qMin(label->implicitHeight(), availableHeight));
284 }
285
286 const QRectF combinedRect = alignedRect(mirrored, alignment,
287 QSizeF(iconSize.width() + effectiveSpacing + textSize.width(),
288 qMax(iconSize.height(), textSize.height())),
289 QRectF(leftPadding, topPadding, availableWidth, availableHeight));
290 if (image) {
291 const QRectF iconRect = alignedRect(mirrored, Qt::AlignLeft | Qt::AlignVCenter, iconSize, combinedRect);
292 image->setSize(iconRect.size());
293 image->setPosition(iconRect.topLeft());
294 }
295 if (label) {
296 const QRectF textRect = alignedRect(mirrored, Qt::AlignRight | Qt::AlignVCenter, textSize, combinedRect);
297 label->setSize(textRect.size());
298 label->setPosition(textRect.topLeft());
299 }
300 break;
301 }
302
303 q->setBaselineOffset(label ? label->y() + label->baselineOffset() : 0);
304}
305
306static const QQuickItemPrivate::ChangeTypes itemChangeTypes =
310
316
322
328
334
336{
338 if (item == image)
339 image = nullptr;
340 else if (item == label)
341 label = nullptr;
342}
343
348
350{
351 Q_D(QQuickIconLabel);
352 if (d->image)
353 d->unwatchChanges(d->image);
354 if (d->label)
355 d->unwatchChanges(d->label);
356}
357
359{
360 Q_D(const QQuickIconLabel);
361 return d->icon;
362}
363
365{
366 Q_D(QQuickIconLabel);
367 if (d->icon == icon)
368 return;
369
370 d->icon = icon;
371 d->icon.ensureRelativeSourceResolved(this);
372 d->updateOrSyncImage();
373}
374
376{
377 Q_D(const QQuickIconLabel);
378 return d->text;
379}
380
382{
383 Q_D(QQuickIconLabel);
384 if (d->text == text)
385 return;
386
387 d->text = text;
388 d->updateOrSyncLabel();
389}
390
392{
393 Q_D(const QQuickIconLabel);
394 return d->font;
395}
396
398{
399 Q_D(QQuickIconLabel);
400 if (d->font == font)
401 return;
402
403 d->font = font;
404 if (d->label)
405 d->label->setFont(font);
406}
407
409{
410 Q_D(const QQuickIconLabel);
411 return d->color;
412}
413
415{
416 Q_D(QQuickIconLabel);
417 if (d->color == color)
418 return;
419
420 d->color = color;
421 if (d->label)
422 d->label->setColor(color);
423}
424
426{
427 Q_D(const QQuickIconLabel);
428 return d->display;
429}
430
432{
433 Q_D(QQuickIconLabel);
434 if (d->display == display)
435 return;
436
437 d->display = display;
438 d->updateImage();
439 d->updateLabel();
440 d->updateImplicitSize();
441 d->layout();
442}
443
445{
446 Q_D(const QQuickIconLabel);
447 return d->spacing;
448}
449
451{
452 Q_D(QQuickIconLabel);
453 if (qFuzzyCompare(d->spacing, spacing))
454 return;
455
456 d->spacing = spacing;
457 if (d->image && d->label) {
458 d->updateImplicitSize();
459 d->layout();
460 }
461}
462
464{
465 Q_D(const QQuickIconLabel);
466 return d->mirrored;
467}
468
470{
471 Q_D(QQuickIconLabel);
472 if (d->mirrored == mirrored)
473 return;
474
475 d->mirrored = mirrored;
476 d->layout();
477}
478
479Qt::Alignment QQuickIconLabel::alignment() const
480{
481 Q_D(const QQuickIconLabel);
482 return d->alignment;
483}
484
486{
487 Q_D(QQuickIconLabel);
488 const int valign = alignment & Qt::AlignVertical_Mask;
489 const int halign = alignment & Qt::AlignHorizontal_Mask;
490 const uint align = (valign ? valign : Qt::AlignVCenter) | (halign ? halign : Qt::AlignHCenter);
491 if (d->alignment == align)
492 return;
493
494 d->alignment = static_cast<Qt::Alignment>(align);
495 if (d->label) {
496 d->label->setVAlign(static_cast<QQuickText::VAlignment>(valign));
497 d->label->setHAlign(static_cast<QQuickText::HAlignment>(halign));
498 }
499 if (d->image) {
500 d->image->setVerticalAlignment(static_cast<QQuickImage::VAlignment>(valign));
501 d->image->setHorizontalAlignment(static_cast<QQuickImage::HAlignment>(halign));
502 }
503 d->layout();
504}
505
507{
508 Q_D(const QQuickIconLabel);
509 return d->topPadding;
510}
511
513{
514 Q_D(QQuickIconLabel);
515 if (qFuzzyCompare(d->topPadding, padding))
516 return;
517
518 d->topPadding = padding;
519 d->updateImplicitSize();
520 d->layout();
521}
522
527
529{
530 Q_D(const QQuickIconLabel);
531 return d->leftPadding;
532}
533
535{
536 Q_D(QQuickIconLabel);
537 if (qFuzzyCompare(d->leftPadding, padding))
538 return;
539
540 d->leftPadding = padding;
541 d->updateImplicitSize();
542 d->layout();
543}
544
549
551{
552 Q_D(const QQuickIconLabel);
553 return d->rightPadding;
554}
555
557{
558 Q_D(QQuickIconLabel);
559 if (qFuzzyCompare(d->rightPadding, padding))
560 return;
561
562 d->rightPadding = padding;
563 d->updateImplicitSize();
564 d->layout();
565}
566
571
573{
574 Q_D(const QQuickIconLabel);
575 return d->bottomPadding;
576}
577
579{
580 Q_D(QQuickIconLabel);
581 if (qFuzzyCompare(d->bottomPadding, padding))
582 return;
583
584 d->bottomPadding = padding;
585 d->updateImplicitSize();
586 d->layout();
587}
588
593
595{
596 Q_D(QQuickIconLabel);
597 if (d->image)
598 completeComponent(d->image);
599 if (d->label)
600 completeComponent(d->label);
602 d->layout();
603}
604
605void QQuickIconLabel::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
606{
607 Q_D(QQuickIconLabel);
608 QQuickItem::geometryChange(newGeometry, oldGeometry);
609 d->layout();
610}
611
613
614#include "moc_qquickiconlabel_p.cpp"
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
\reentrant
Definition qfont.h:22
static Qt::Alignment visualAlignment(Qt::LayoutDirection direction, Qt::Alignment alignment)
static void setContextForObject(QObject *, QQmlContext *)
Sets the QQmlContext for the object to context.
The QQmlParserStatus class provides updates on the QML parser state.
void watchChanges(QQuickItem *item)
void unwatchChanges(QQuickItem *item)
void itemImplicitWidthChanged(QQuickItem *) override
~QQuickIconLabelPrivate() override
void itemImplicitHeightChanged(QQuickItem *) override
QQuickMnemonicLabel * label
void itemDestroyed(QQuickItem *item) override
bool isMirrored() const
void setBottomPadding(qreal padding)
void setAlignment(Qt::Alignment alignment)
void setColor(const QColor &color)
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void setRightPadding(qreal padding)
void setMirrored(bool mirrored)
void setText(const QString &text)
void setLeftPadding(qreal padding)
void setSpacing(qreal spacing)
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
QQuickIconLabel(QQuickItem *parent=nullptr)
void setFont(const QFont &font)
void setTopPadding(qreal padding)
void setDisplay(Display display)
Qt::Alignment alignment
void setIcon(const QQuickIcon &icon)
QUrl resolvedSource() const
bool isEmpty() const
QString name
QColor color
void removeItemChangeListener(QQuickItemChangeListener *, ChangeTypes types)
void addItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types)
quint32 componentComplete
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
void componentComplete() override
\reimp Derived classes should call the base class method before adding their own actions to perform a...
\inmodule QtCore\reentrant
Definition qrect.h:484
constexpr qreal y() const noexcept
Returns the y-coordinate of the rectangle's top edge.
Definition qrect.h:672
constexpr qreal height() const noexcept
Returns the height of the rectangle.
Definition qrect.h:732
constexpr qreal width() const noexcept
Returns the width of the rectangle.
Definition qrect.h:729
constexpr qreal x() const noexcept
Returns the x-coordinate of the rectangle's left edge.
Definition qrect.h:669
constexpr QPoint topLeft() const noexcept
Returns the position of the rectangle's top-left corner.
Definition qrect.h:221
constexpr QSize size() const noexcept
Returns the size of the rectangle.
Definition qrect.h:242
\inmodule QtCore
Definition qsize.h:208
constexpr void setWidth(qreal w) noexcept
Sets the width to the given finite width.
Definition qsize.h:338
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
QString text
qreal spacing
opt iconSize
uint alignment
QRect textRect
struct wl_display * display
Definition linuxdmabuf.h:41
Combined button and popup list for selecting options.
@ AlignRight
Definition qnamespace.h:146
@ AlignBottom
Definition qnamespace.h:154
@ AlignVCenter
Definition qnamespace.h:155
@ AlignTop
Definition qnamespace.h:153
@ AlignHCenter
Definition qnamespace.h:148
@ AlignHorizontal_Mask
Definition qnamespace.h:151
@ AlignVertical_Mask
Definition qnamespace.h:161
@ AlignLeft
Definition qnamespace.h:144
@ LeftToRight
@ RightToLeft
Definition image.cpp:4
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
constexpr const T & qMin(const T &a, const T &b)
Definition qminmax.h:40
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei width
GLuint color
[2]
GLuint GLsizei const GLchar * label
[43]
GLint y
GLfloat GLfloat GLfloat GLfloat h
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
QQmlContext * qmlContext(const QObject *obj)
Definition qqml.cpp:75
static void completeComponent(QQuickItem *item)
static QT_BEGIN_NAMESPACE void beginClass(QQuickItem *item)
static const QQuickItemPrivate::ChangeTypes itemChangeTypes
static QRectF alignedRect(bool mirrored, Qt::Alignment alignment, const QSizeF &size, const QRectF &rectangle)
#define QStringLiteral(str)
unsigned int uint
Definition qtypes.h:34
double qreal
Definition qtypes.h:187
QGraphicsItem * item