| 1 | /**************************************************************************** | 
| 2 | ** | 
| 3 | ** Copyright (C) 2017 The Qt Company Ltd. | 
| 4 | ** Contact: http://www.qt.io/licensing/ | 
| 5 | ** | 
| 6 | ** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit. | 
| 7 | ** | 
| 8 | ** $QT_BEGIN_LICENSE:LGPL3$ | 
| 9 | ** Commercial License Usage | 
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | 
| 11 | ** accordance with the commercial license agreement provided with the | 
| 12 | ** Software or, alternatively, in accordance with the terms contained in | 
| 13 | ** a written agreement between you and The Qt Company. For licensing terms | 
| 14 | ** and conditions see http://www.qt.io/terms-conditions. For further | 
| 15 | ** information use the contact form at http://www.qt.io/contact-us. | 
| 16 | ** | 
| 17 | ** GNU Lesser General Public License Usage | 
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
| 19 | ** General Public License version 3 as published by the Free Software | 
| 20 | ** Foundation and appearing in the file LICENSE.LGPLv3 included in the | 
| 21 | ** packaging of this file. Please review the following information to | 
| 22 | ** ensure the GNU Lesser General Public License version 3 requirements | 
| 23 | ** will be met: https://www.gnu.org/licenses/lgpl.html. | 
| 24 | ** | 
| 25 | ** GNU General Public License Usage | 
| 26 | ** Alternatively, this file may be used under the terms of the GNU | 
| 27 | ** General Public License version 2.0 or later as published by the Free | 
| 28 | ** Software Foundation and appearing in the file LICENSE.GPL included in | 
| 29 | ** the packaging of this file. Please review the following information to | 
| 30 | ** ensure the GNU General Public License version 2.0 requirements will be | 
| 31 | ** met: http://www.gnu.org/licenses/gpl-2.0.html. | 
| 32 | ** | 
| 33 | ** $QT_END_LICENSE$ | 
| 34 | ** | 
| 35 | ****************************************************************************/ | 
| 36 |  | 
| 37 | #include "qquickiconlabel_p.h" | 
| 38 | #include "qquickiconlabel_p_p.h" | 
| 39 | #include "qquickiconimage_p.h" | 
| 40 | #include "qquickmnemoniclabel_p.h" | 
| 41 |  | 
| 42 | #include <QtGui/private/qguiapplication_p.h> | 
| 43 | #include <QtQuick/private/qquickitem_p.h> | 
| 44 | #include <QtQuick/private/qquicktext_p.h> | 
| 45 |  | 
| 46 | QT_BEGIN_NAMESPACE | 
| 47 |  | 
| 48 | static void beginClass(QQuickItem *item) | 
| 49 | { | 
| 50 |     if (QQmlParserStatus *parserStatus = qobject_cast<QQmlParserStatus *>(object: item)) | 
| 51 |         parserStatus->classBegin(); | 
| 52 | } | 
| 53 |  | 
| 54 | static void completeComponent(QQuickItem *item) | 
| 55 | { | 
| 56 |     if (QQmlParserStatus *parserStatus = qobject_cast<QQmlParserStatus *>(object: item)) | 
| 57 |         parserStatus->componentComplete(); | 
| 58 | } | 
| 59 |  | 
| 60 | bool QQuickIconLabelPrivate::hasIcon() const | 
| 61 | { | 
| 62 |     return display != QQuickIconLabel::TextOnly && !icon.isEmpty(); | 
| 63 | } | 
| 64 |  | 
| 65 | bool QQuickIconLabelPrivate::hasText() const | 
| 66 | { | 
| 67 |     return display != QQuickIconLabel::IconOnly && !text.isEmpty(); | 
| 68 | } | 
| 69 |  | 
| 70 | bool QQuickIconLabelPrivate::createImage() | 
| 71 | { | 
| 72 |     Q_Q(QQuickIconLabel); | 
| 73 |     if (image) | 
| 74 |         return false; | 
| 75 |  | 
| 76 |     image = new QQuickIconImage(q); | 
| 77 |     watchChanges(item: image); | 
| 78 |     beginClass(item: image); | 
| 79 |     image->setObjectName(QStringLiteral("image" )); | 
| 80 |     image->setName(icon.name()); | 
| 81 |     image->setSource(icon.source()); | 
| 82 |     image->setSourceSize(QSize(icon.width(), icon.height())); | 
| 83 |     image->setColor(icon.color()); | 
| 84 |     image->setCache(icon.cache()); | 
| 85 |     QQmlEngine::setContextForObject(image, qmlContext(q)); | 
| 86 |     if (componentComplete) | 
| 87 |         completeComponent(item: image); | 
| 88 |     return true; | 
| 89 | } | 
| 90 |  | 
| 91 | bool QQuickIconLabelPrivate::destroyImage() | 
| 92 | { | 
| 93 |     if (!image) | 
| 94 |         return false; | 
| 95 |  | 
| 96 |     unwatchChanges(item: image); | 
| 97 |     delete image; | 
| 98 |     image = nullptr; | 
| 99 |     return true; | 
| 100 | } | 
| 101 |  | 
| 102 | bool QQuickIconLabelPrivate::updateImage() | 
| 103 | { | 
| 104 |     if (!hasIcon()) | 
| 105 |         return destroyImage(); | 
| 106 |     return createImage(); | 
| 107 | } | 
| 108 |  | 
| 109 | void QQuickIconLabelPrivate::syncImage() | 
| 110 | { | 
| 111 |     if (!image || icon.isEmpty()) | 
| 112 |         return; | 
| 113 |  | 
| 114 |     image->setName(icon.name()); | 
| 115 |     image->setSource(icon.source()); | 
| 116 |     image->setSourceSize(QSize(icon.width(), icon.height())); | 
| 117 |     image->setColor(icon.color()); | 
| 118 |     image->setCache(icon.cache()); | 
| 119 |     const int valign = alignment & Qt::AlignVertical_Mask; | 
| 120 |     image->setVerticalAlignment(static_cast<QQuickImage::VAlignment>(valign)); | 
| 121 |     const int halign = alignment & Qt::AlignHorizontal_Mask; | 
| 122 |     image->setHorizontalAlignment(static_cast<QQuickImage::HAlignment>(halign)); | 
| 123 | } | 
| 124 |  | 
| 125 | void QQuickIconLabelPrivate::updateOrSyncImage() | 
| 126 | { | 
| 127 |     if (updateImage()) { | 
| 128 |         if (componentComplete) { | 
| 129 |             updateImplicitSize(); | 
| 130 |             layout(); | 
| 131 |         } | 
| 132 |     } else { | 
| 133 |         syncImage(); | 
| 134 |     } | 
| 135 | } | 
| 136 |  | 
| 137 | bool QQuickIconLabelPrivate::createLabel() | 
| 138 | { | 
| 139 |     Q_Q(QQuickIconLabel); | 
| 140 |     if (label) | 
| 141 |         return false; | 
| 142 |  | 
| 143 |     label = new QQuickMnemonicLabel(q); | 
| 144 |     watchChanges(item: label); | 
| 145 |     beginClass(item: label); | 
| 146 |     label->setObjectName(QStringLiteral("label" )); | 
| 147 |     label->setFont(font); | 
| 148 |     label->setColor(color); | 
| 149 |     label->setElideMode(QQuickText::ElideRight); | 
| 150 |     const int valign = alignment & Qt::AlignVertical_Mask; | 
| 151 |     label->setVAlign(static_cast<QQuickText::VAlignment>(valign)); | 
| 152 |     const int halign = alignment & Qt::AlignHorizontal_Mask; | 
| 153 |     label->setHAlign(static_cast<QQuickText::HAlignment>(halign)); | 
| 154 |     label->setText(text); | 
| 155 |     if (componentComplete) | 
| 156 |         completeComponent(item: label); | 
| 157 |     return true; | 
| 158 | } | 
| 159 |  | 
| 160 | bool QQuickIconLabelPrivate::destroyLabel() | 
| 161 | { | 
| 162 |     if (!label) | 
| 163 |         return false; | 
| 164 |  | 
| 165 |     unwatchChanges(item: label); | 
| 166 |     delete label; | 
| 167 |     label = nullptr; | 
| 168 |     return true; | 
| 169 | } | 
| 170 |  | 
| 171 | bool QQuickIconLabelPrivate::updateLabel() | 
| 172 | { | 
| 173 |     if (!hasText()) | 
| 174 |         return destroyLabel(); | 
| 175 |     return createLabel(); | 
| 176 | } | 
| 177 |  | 
| 178 | void QQuickIconLabelPrivate::syncLabel() | 
| 179 | { | 
| 180 |     if (!label) | 
| 181 |         return; | 
| 182 |  | 
| 183 |     label->setText(text); | 
| 184 | } | 
| 185 |  | 
| 186 | void QQuickIconLabelPrivate::updateOrSyncLabel() | 
| 187 | { | 
| 188 |     if (updateLabel()) { | 
| 189 |         if (componentComplete) { | 
| 190 |             updateImplicitSize(); | 
| 191 |             layout(); | 
| 192 |         } | 
| 193 |     } else { | 
| 194 |         syncLabel(); | 
| 195 |     } | 
| 196 | } | 
| 197 |  | 
| 198 | void QQuickIconLabelPrivate::updateImplicitSize() | 
| 199 | { | 
| 200 |     Q_Q(QQuickIconLabel); | 
| 201 |     const bool showIcon = image && hasIcon(); | 
| 202 |     const bool showText = label && hasText(); | 
| 203 |     const qreal horizontalPadding = leftPadding + rightPadding; | 
| 204 |     const qreal verticalPadding = topPadding + bottomPadding; | 
| 205 |     const qreal iconImplicitWidth = showIcon ? image->implicitWidth() : 0; | 
| 206 |     const qreal iconImplicitHeight = showIcon ? image->implicitHeight() : 0; | 
| 207 |     const qreal textImplicitWidth = showText ? label->implicitWidth() : 0; | 
| 208 |     const qreal textImplicitHeight = showText ? label->implicitHeight() : 0; | 
| 209 |     const qreal effectiveSpacing = showText && showIcon && image->implicitWidth() > 0 ? spacing : 0; | 
| 210 |     const qreal implicitWidth = display == QQuickIconLabel::TextBesideIcon ? iconImplicitWidth + textImplicitWidth + effectiveSpacing | 
| 211 |                                                                            : qMax(a: iconImplicitWidth, b: textImplicitWidth); | 
| 212 |     const qreal implicitHeight = display == QQuickIconLabel::TextUnderIcon ? iconImplicitHeight + textImplicitHeight + effectiveSpacing | 
| 213 |                                                                            : qMax(a: iconImplicitHeight, b: textImplicitHeight); | 
| 214 |     q->setImplicitSize(implicitWidth + horizontalPadding, implicitHeight + verticalPadding); | 
| 215 | } | 
| 216 |  | 
| 217 | // adapted from QStyle::alignedRect() | 
| 218 | static QRectF alignedRect(bool mirrored, Qt::Alignment alignment, const QSizeF &size, const QRectF &rectangle) | 
| 219 | { | 
| 220 |     alignment = QGuiApplicationPrivate::visualAlignment(direction: mirrored ? Qt::RightToLeft : Qt::LeftToRight, alignment); | 
| 221 |     qreal x = rectangle.x(); | 
| 222 |     qreal y = rectangle.y(); | 
| 223 |     const qreal w = size.width(); | 
| 224 |     const qreal h = size.height(); | 
| 225 |     if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter) | 
| 226 |         y += rectangle.height() / 2 - h / 2; | 
| 227 |     else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom) | 
| 228 |         y += rectangle.height() - h; | 
| 229 |     if ((alignment & Qt::AlignRight) == Qt::AlignRight) | 
| 230 |         x += rectangle.width() - w; | 
| 231 |     else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter) | 
| 232 |         x += rectangle.width() / 2 - w / 2; | 
| 233 |     return QRectF(x, y, w, h); | 
| 234 | } | 
| 235 |  | 
| 236 | void QQuickIconLabelPrivate::layout() | 
| 237 | { | 
| 238 |     Q_Q(QQuickIconLabel); | 
| 239 |     if (!componentComplete) | 
| 240 |         return; | 
| 241 |  | 
| 242 |     const qreal availableWidth = width - leftPadding - rightPadding; | 
| 243 |     const qreal availableHeight = height - topPadding - bottomPadding; | 
| 244 |  | 
| 245 |     switch (display) { | 
| 246 |     case QQuickIconLabel::IconOnly: | 
| 247 |         if (image) { | 
| 248 |             const QRectF iconRect = alignedRect(mirrored, alignment, | 
| 249 |                                                 size: QSizeF(qMin(a: image->implicitWidth(), b: availableWidth), | 
| 250 |                                                        qMin(a: image->implicitHeight(), b: availableHeight)), | 
| 251 |                                                 rectangle: QRectF(leftPadding, topPadding, availableWidth, availableHeight)); | 
| 252 |             image->setSize(iconRect.size()); | 
| 253 |             image->setPosition(iconRect.topLeft()); | 
| 254 |         } | 
| 255 |         break; | 
| 256 |     case QQuickIconLabel::TextOnly: | 
| 257 |         if (label) { | 
| 258 |             const QRectF textRect = alignedRect(mirrored, alignment, | 
| 259 |                                                 size: QSizeF(qMin(a: label->implicitWidth(), b: availableWidth), | 
| 260 |                                                        qMin(a: label->implicitHeight(), b: availableHeight)), | 
| 261 |                                                 rectangle: QRectF(leftPadding, topPadding, availableWidth, availableHeight)); | 
| 262 |             label->setSize(textRect.size()); | 
| 263 |             label->setPosition(textRect.topLeft()); | 
| 264 |         } | 
| 265 |         break; | 
| 266 |  | 
| 267 |     case QQuickIconLabel::TextUnderIcon: { | 
| 268 |         // Work out the sizes first, as the positions depend on them. | 
| 269 |         QSizeF iconSize; | 
| 270 |         QSizeF textSize; | 
| 271 |         if (image) { | 
| 272 |             iconSize.setWidth(qMin(a: image->implicitWidth(), b: availableWidth)); | 
| 273 |             iconSize.setHeight(qMin(a: image->implicitHeight(), b: availableHeight)); | 
| 274 |         } | 
| 275 |         qreal effectiveSpacing = 0; | 
| 276 |         if (label) { | 
| 277 |             if (!iconSize.isEmpty()) | 
| 278 |                 effectiveSpacing = spacing; | 
| 279 |             textSize.setWidth(qMin(a: label->implicitWidth(), b: availableWidth)); | 
| 280 |             textSize.setHeight(qMin(a: label->implicitHeight(), b: availableHeight - iconSize.height() - effectiveSpacing)); | 
| 281 |         } | 
| 282 |  | 
| 283 |         QRectF combinedRect = alignedRect(mirrored, alignment, | 
| 284 |                                           size: QSizeF(qMax(a: iconSize.width(), b: textSize.width()), | 
| 285 |                                                  iconSize.height() + effectiveSpacing + textSize.height()), | 
| 286 |                                           rectangle: QRectF(leftPadding, topPadding, availableWidth, availableHeight)); | 
| 287 |         if (image) { | 
| 288 |             QRectF iconRect = alignedRect(mirrored, alignment: Qt::AlignHCenter | Qt::AlignTop, size: iconSize, rectangle: combinedRect); | 
| 289 |             image->setSize(iconRect.size()); | 
| 290 |             image->setPosition(iconRect.topLeft()); | 
| 291 |         } | 
| 292 |         if (label) { | 
| 293 |             QRectF textRect = alignedRect(mirrored, alignment: Qt::AlignHCenter | Qt::AlignBottom, size: textSize, rectangle: combinedRect); | 
| 294 |             label->setSize(textRect.size()); | 
| 295 |             label->setPosition(textRect.topLeft()); | 
| 296 |         } | 
| 297 |         break; | 
| 298 |     } | 
| 299 |  | 
| 300 |     case QQuickIconLabel::TextBesideIcon: | 
| 301 |     default: | 
| 302 |         // Work out the sizes first, as the positions depend on them. | 
| 303 |         QSizeF iconSize(0, 0); | 
| 304 |         QSizeF textSize(0, 0); | 
| 305 |         if (image) { | 
| 306 |             iconSize.setWidth(qMin(a: image->implicitWidth(), b: availableWidth)); | 
| 307 |             iconSize.setHeight(qMin(a: image->implicitHeight(), b: availableHeight)); | 
| 308 |         } | 
| 309 |         qreal effectiveSpacing = 0; | 
| 310 |         if (label) { | 
| 311 |             if (!iconSize.isEmpty()) | 
| 312 |                 effectiveSpacing = spacing; | 
| 313 |             textSize.setWidth(qMin(a: label->implicitWidth(), b: availableWidth - iconSize.width() - effectiveSpacing)); | 
| 314 |             textSize.setHeight(qMin(a: label->implicitHeight(), b: availableHeight)); | 
| 315 |         } | 
| 316 |  | 
| 317 |         const QRectF combinedRect = alignedRect(mirrored, alignment, | 
| 318 |                                                 size: QSizeF(iconSize.width() + effectiveSpacing + textSize.width(), | 
| 319 |                                                        qMax(a: iconSize.height(), b: textSize.height())), | 
| 320 |                                                 rectangle: QRectF(leftPadding, topPadding, availableWidth, availableHeight)); | 
| 321 |         if (image) { | 
| 322 |             const QRectF iconRect = alignedRect(mirrored, alignment: Qt::AlignLeft | Qt::AlignVCenter, size: iconSize, rectangle: combinedRect); | 
| 323 |             image->setSize(iconRect.size()); | 
| 324 |             image->setPosition(iconRect.topLeft()); | 
| 325 |         } | 
| 326 |         if (label) { | 
| 327 |             const QRectF textRect = alignedRect(mirrored, alignment: Qt::AlignRight | Qt::AlignVCenter, size: textSize, rectangle: combinedRect); | 
| 328 |             label->setSize(textRect.size()); | 
| 329 |             label->setPosition(textRect.topLeft()); | 
| 330 |         } | 
| 331 |         break; | 
| 332 |     } | 
| 333 |  | 
| 334 |     q->setBaselineOffset(label ? label->y() + label->baselineOffset() : 0); | 
| 335 | } | 
| 336 |  | 
| 337 | static const QQuickItemPrivate::ChangeTypes itemChangeTypes = | 
| 338 |     QQuickItemPrivate::ImplicitWidth | 
| 339 |     | QQuickItemPrivate::ImplicitHeight | 
| 340 |     | QQuickItemPrivate::Destroyed; | 
| 341 |  | 
| 342 | void QQuickIconLabelPrivate::watchChanges(QQuickItem *item) | 
| 343 | { | 
| 344 |     QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); | 
| 345 |     itemPrivate->addItemChangeListener(listener: this, types: itemChangeTypes); | 
| 346 | } | 
| 347 |  | 
| 348 | void QQuickIconLabelPrivate::unwatchChanges(QQuickItem* item) | 
| 349 | { | 
| 350 |     QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); | 
| 351 |     itemPrivate->removeItemChangeListener(this, types: itemChangeTypes); | 
| 352 | } | 
| 353 |  | 
| 354 | void QQuickIconLabelPrivate::itemImplicitWidthChanged(QQuickItem *) | 
| 355 | { | 
| 356 |     updateImplicitSize(); | 
| 357 |     layout(); | 
| 358 | } | 
| 359 |  | 
| 360 | void QQuickIconLabelPrivate::itemImplicitHeightChanged(QQuickItem *) | 
| 361 | { | 
| 362 |     updateImplicitSize(); | 
| 363 |     layout(); | 
| 364 | } | 
| 365 |  | 
| 366 | void QQuickIconLabelPrivate::itemDestroyed(QQuickItem *item) | 
| 367 | { | 
| 368 |     unwatchChanges(item); | 
| 369 |     if (item == image) | 
| 370 |         image = nullptr; | 
| 371 |     else if (item == label) | 
| 372 |         label = nullptr; | 
| 373 | } | 
| 374 |  | 
| 375 | QQuickIconLabel::QQuickIconLabel(QQuickItem *parent) | 
| 376 |     : QQuickItem(*(new QQuickIconLabelPrivate), parent) | 
| 377 | { | 
| 378 | } | 
| 379 |  | 
| 380 | QQuickIconLabel::~QQuickIconLabel() | 
| 381 | { | 
| 382 |     Q_D(QQuickIconLabel); | 
| 383 |     if (d->image) | 
| 384 |         d->unwatchChanges(item: d->image); | 
| 385 |     if (d->label) | 
| 386 |         d->unwatchChanges(item: d->label); | 
| 387 | } | 
| 388 |  | 
| 389 | QQuickIcon QQuickIconLabel::icon() const | 
| 390 | { | 
| 391 |     Q_D(const QQuickIconLabel); | 
| 392 |     return d->icon; | 
| 393 | } | 
| 394 |  | 
| 395 | void QQuickIconLabel::setIcon(const QQuickIcon &icon) | 
| 396 | { | 
| 397 |     Q_D(QQuickIconLabel); | 
| 398 |     if (d->icon == icon) | 
| 399 |         return; | 
| 400 |  | 
| 401 |     d->icon = icon; | 
| 402 |     d->updateOrSyncImage(); | 
| 403 | } | 
| 404 |  | 
| 405 | QString QQuickIconLabel::text() const | 
| 406 | { | 
| 407 |     Q_D(const QQuickIconLabel); | 
| 408 |     return d->text; | 
| 409 | } | 
| 410 |  | 
| 411 | void QQuickIconLabel::setText(const QString &text) | 
| 412 | { | 
| 413 |     Q_D(QQuickIconLabel); | 
| 414 |     if (d->text == text) | 
| 415 |         return; | 
| 416 |  | 
| 417 |     d->text = text; | 
| 418 |     d->updateOrSyncLabel(); | 
| 419 | } | 
| 420 |  | 
| 421 | QFont QQuickIconLabel::font() const | 
| 422 | { | 
| 423 |     Q_D(const QQuickIconLabel); | 
| 424 |     return d->font; | 
| 425 | } | 
| 426 |  | 
| 427 | void QQuickIconLabel::setFont(const QFont &font) | 
| 428 | { | 
| 429 |     Q_D(QQuickIconLabel); | 
| 430 |     if (d->font == font) | 
| 431 |         return; | 
| 432 |  | 
| 433 |     d->font = font; | 
| 434 |     if (d->label) | 
| 435 |         d->label->setFont(font); | 
| 436 | } | 
| 437 |  | 
| 438 | QColor QQuickIconLabel::color() const | 
| 439 | { | 
| 440 |     Q_D(const QQuickIconLabel); | 
| 441 |     return d->color; | 
| 442 | } | 
| 443 |  | 
| 444 | void QQuickIconLabel::setColor(const QColor &color) | 
| 445 | { | 
| 446 |     Q_D(QQuickIconLabel); | 
| 447 |     if (d->color == color) | 
| 448 |         return; | 
| 449 |  | 
| 450 |     d->color = color; | 
| 451 |     if (d->label) | 
| 452 |         d->label->setColor(color); | 
| 453 | } | 
| 454 |  | 
| 455 | QQuickIconLabel::Display QQuickIconLabel::display() const | 
| 456 | { | 
| 457 |     Q_D(const QQuickIconLabel); | 
| 458 |     return d->display; | 
| 459 | } | 
| 460 |  | 
| 461 | void QQuickIconLabel::setDisplay(Display display) | 
| 462 | { | 
| 463 |     Q_D(QQuickIconLabel); | 
| 464 |     if (d->display == display) | 
| 465 |         return; | 
| 466 |  | 
| 467 |     d->display = display; | 
| 468 |     d->updateImage(); | 
| 469 |     d->updateLabel(); | 
| 470 |     d->updateImplicitSize(); | 
| 471 |     d->layout(); | 
| 472 | } | 
| 473 |  | 
| 474 | qreal QQuickIconLabel::spacing() const | 
| 475 | { | 
| 476 |     Q_D(const QQuickIconLabel); | 
| 477 |     return d->spacing; | 
| 478 | } | 
| 479 |  | 
| 480 | void QQuickIconLabel::setSpacing(qreal spacing) | 
| 481 | { | 
| 482 |     Q_D(QQuickIconLabel); | 
| 483 |     if (qFuzzyCompare(p1: d->spacing, p2: spacing)) | 
| 484 |         return; | 
| 485 |  | 
| 486 |     d->spacing = spacing; | 
| 487 |     if (d->image && d->label) { | 
| 488 |         d->updateImplicitSize(); | 
| 489 |         d->layout(); | 
| 490 |     } | 
| 491 | } | 
| 492 |  | 
| 493 | bool QQuickIconLabel::isMirrored() const | 
| 494 | { | 
| 495 |     Q_D(const QQuickIconLabel); | 
| 496 |     return d->mirrored; | 
| 497 | } | 
| 498 |  | 
| 499 | void QQuickIconLabel::setMirrored(bool mirrored) | 
| 500 | { | 
| 501 |     Q_D(QQuickIconLabel); | 
| 502 |     if (d->mirrored == mirrored) | 
| 503 |         return; | 
| 504 |  | 
| 505 |     d->mirrored = mirrored; | 
| 506 |     d->layout(); | 
| 507 | } | 
| 508 |  | 
| 509 | Qt::Alignment QQuickIconLabel::alignment() const | 
| 510 | { | 
| 511 |     Q_D(const QQuickIconLabel); | 
| 512 |     return d->alignment; | 
| 513 | } | 
| 514 |  | 
| 515 | void QQuickIconLabel::setAlignment(Qt::Alignment alignment) | 
| 516 | { | 
| 517 |     Q_D(QQuickIconLabel); | 
| 518 |     const int valign = alignment & Qt::AlignVertical_Mask; | 
| 519 |     const int halign = alignment & Qt::AlignHorizontal_Mask; | 
| 520 |     const uint align = (valign ? valign : Qt::AlignVCenter) | (halign ? halign : Qt::AlignHCenter); | 
| 521 |     if (d->alignment == align) | 
| 522 |         return; | 
| 523 |  | 
| 524 |     d->alignment = static_cast<Qt::Alignment>(align); | 
| 525 |     if (d->label) { | 
| 526 |         d->label->setVAlign(static_cast<QQuickText::VAlignment>(valign)); | 
| 527 |         d->label->setHAlign(static_cast<QQuickText::HAlignment>(halign)); | 
| 528 |     } | 
| 529 |     if (d->image) { | 
| 530 |         d->image->setVerticalAlignment(static_cast<QQuickImage::VAlignment>(valign)); | 
| 531 |         d->image->setHorizontalAlignment(static_cast<QQuickImage::HAlignment>(halign)); | 
| 532 |     } | 
| 533 |     d->layout(); | 
| 534 | } | 
| 535 |  | 
| 536 | qreal QQuickIconLabel::topPadding() const | 
| 537 | { | 
| 538 |     Q_D(const QQuickIconLabel); | 
| 539 |     return d->topPadding; | 
| 540 | } | 
| 541 |  | 
| 542 | void QQuickIconLabel::setTopPadding(qreal padding) | 
| 543 | { | 
| 544 |     Q_D(QQuickIconLabel); | 
| 545 |     if (qFuzzyCompare(p1: d->topPadding, p2: padding)) | 
| 546 |         return; | 
| 547 |  | 
| 548 |     d->topPadding = padding; | 
| 549 |     d->updateImplicitSize(); | 
| 550 |     d->layout(); | 
| 551 | } | 
| 552 |  | 
| 553 | void QQuickIconLabel::resetTopPadding() | 
| 554 | { | 
| 555 |     setTopPadding(0); | 
| 556 | } | 
| 557 |  | 
| 558 | qreal QQuickIconLabel::leftPadding() const | 
| 559 | { | 
| 560 |     Q_D(const QQuickIconLabel); | 
| 561 |     return d->leftPadding; | 
| 562 | } | 
| 563 |  | 
| 564 | void QQuickIconLabel::setLeftPadding(qreal padding) | 
| 565 | { | 
| 566 |     Q_D(QQuickIconLabel); | 
| 567 |     if (qFuzzyCompare(p1: d->leftPadding, p2: padding)) | 
| 568 |         return; | 
| 569 |  | 
| 570 |     d->leftPadding = padding; | 
| 571 |     d->updateImplicitSize(); | 
| 572 |     d->layout(); | 
| 573 | } | 
| 574 |  | 
| 575 | void QQuickIconLabel::resetLeftPadding() | 
| 576 | { | 
| 577 |     setLeftPadding(0); | 
| 578 | } | 
| 579 |  | 
| 580 | qreal QQuickIconLabel::rightPadding() const | 
| 581 | { | 
| 582 |     Q_D(const QQuickIconLabel); | 
| 583 |     return d->rightPadding; | 
| 584 | } | 
| 585 |  | 
| 586 | void QQuickIconLabel::setRightPadding(qreal padding) | 
| 587 | { | 
| 588 |     Q_D(QQuickIconLabel); | 
| 589 |     if (qFuzzyCompare(p1: d->rightPadding, p2: padding)) | 
| 590 |         return; | 
| 591 |  | 
| 592 |     d->rightPadding = padding; | 
| 593 |     d->updateImplicitSize(); | 
| 594 |     d->layout(); | 
| 595 | } | 
| 596 |  | 
| 597 | void QQuickIconLabel::resetRightPadding() | 
| 598 | { | 
| 599 |     setRightPadding(0); | 
| 600 | } | 
| 601 |  | 
| 602 | qreal QQuickIconLabel::bottomPadding() const | 
| 603 | { | 
| 604 |     Q_D(const QQuickIconLabel); | 
| 605 |     return d->bottomPadding; | 
| 606 | } | 
| 607 |  | 
| 608 | void QQuickIconLabel::setBottomPadding(qreal padding) | 
| 609 | { | 
| 610 |     Q_D(QQuickIconLabel); | 
| 611 |     if (qFuzzyCompare(p1: d->bottomPadding, p2: padding)) | 
| 612 |         return; | 
| 613 |  | 
| 614 |     d->bottomPadding = padding; | 
| 615 |     d->updateImplicitSize(); | 
| 616 |     d->layout(); | 
| 617 | } | 
| 618 |  | 
| 619 | void QQuickIconLabel::resetBottomPadding() | 
| 620 | { | 
| 621 |     setBottomPadding(0); | 
| 622 | } | 
| 623 |  | 
| 624 | void QQuickIconLabel::componentComplete() | 
| 625 | { | 
| 626 |     Q_D(QQuickIconLabel); | 
| 627 |     if (d->image) | 
| 628 |         completeComponent(item: d->image); | 
| 629 |     if (d->label) | 
| 630 |         completeComponent(item: d->label); | 
| 631 |     QQuickItem::componentComplete(); | 
| 632 |     d->layout(); | 
| 633 | } | 
| 634 |  | 
| 635 | void QQuickIconLabel::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) | 
| 636 | { | 
| 637 |     Q_D(QQuickIconLabel); | 
| 638 |     QQuickItem::geometryChanged(newGeometry, oldGeometry); | 
| 639 |     d->layout(); | 
| 640 | } | 
| 641 |  | 
| 642 | QT_END_NAMESPACE | 
| 643 |  |