File indexing completed on 2024-05-12 05:38:57

0001 /* SPDX-FileCopyrightText: 2017 The Qt Company Ltd.
0002  * SPDX-FileCopyrightText: 2020 Noah Davis <noahadvs@gmail.com>
0003  * SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-or-later
0004  */
0005 // Almost completely copy/pasted from qtquickcontrols2 so that I don't need to depend on private headers
0006 
0007 #include "qquickicon_p.h"
0008 
0009 namespace Breeze
0010 {
0011 
0012 class QQuickIconPrivate : public QSharedData
0013 {
0014 public:
0015     QString name;
0016     QUrl source;
0017     QUrl resolvedSource; // UNUSED: needed to keep compatibility with Qt's QQuickIcon
0018     int width = 0;
0019     int height = 0;
0020     QColor color = Qt::transparent;
0021     bool cache = true;
0022 
0023     enum ResolveProperties {
0024         NameResolved = 0x0001,
0025         SourceResolved = 0x0002,
0026         WidthResolved = 0x0004,
0027         HeightResolved = 0x0008,
0028         ColorResolved = 0x0010,
0029         CacheResolved = 0x0020,
0030         AllPropertiesResolved = 0x1ffff,
0031     };
0032 
0033     // This is based on QFont's resolve_mask.
0034     int resolveMask = 0;
0035 };
0036 
0037 QQuickIcon::QQuickIcon()
0038     : d(new QQuickIconPrivate)
0039 {
0040 }
0041 
0042 QQuickIcon::QQuickIcon(const QQuickIcon &other)
0043     : d(other.d)
0044 {
0045 }
0046 
0047 QQuickIcon::~QQuickIcon()
0048 {
0049 }
0050 
0051 QQuickIcon &QQuickIcon::operator=(const QQuickIcon &other)
0052 {
0053     d = other.d;
0054     return *this;
0055 }
0056 
0057 bool QQuickIcon::operator==(const QQuickIcon &other) const
0058 {
0059     return d == other.d //
0060         || (d->name == other.d->name //
0061             && d->source == other.d->source //
0062             && d->width == other.d->width //
0063             && d->height == other.d->height //
0064             && d->color == other.d->color //
0065             && d->cache == other.d->cache);
0066 }
0067 
0068 bool QQuickIcon::operator!=(const QQuickIcon &other) const
0069 {
0070     return !(*this == other);
0071 }
0072 
0073 bool QQuickIcon::isEmpty() const
0074 {
0075     return d->name.isEmpty() && d->source.isEmpty();
0076 }
0077 
0078 QString QQuickIcon::name() const
0079 {
0080     return d->name;
0081 }
0082 
0083 void QQuickIcon::setName(const QString &name)
0084 {
0085     if ((d->resolveMask & QQuickIconPrivate::NameResolved) && d->name == name)
0086         return;
0087 
0088     d.detach();
0089     d->name = name;
0090     d->resolveMask |= QQuickIconPrivate::NameResolved;
0091 }
0092 
0093 void QQuickIcon::resetName()
0094 {
0095     d.detach();
0096     d->name = QString();
0097     d->resolveMask &= ~QQuickIconPrivate::NameResolved;
0098 }
0099 
0100 QUrl QQuickIcon::source() const
0101 {
0102     return d->source;
0103 }
0104 
0105 void QQuickIcon::setSource(const QUrl &source)
0106 {
0107     if ((d->resolveMask & QQuickIconPrivate::SourceResolved) && d->source == source)
0108         return;
0109 
0110     d.detach();
0111     d->source = source;
0112     d->resolveMask |= QQuickIconPrivate::SourceResolved;
0113 }
0114 
0115 void QQuickIcon::resetSource()
0116 {
0117     d.detach();
0118     d->source = QUrl();
0119     d->resolveMask &= ~QQuickIconPrivate::SourceResolved;
0120 }
0121 
0122 QString QQuickIcon::nameOrSource() const
0123 {
0124     if (!d->name.isEmpty()) {
0125         return d->name;
0126     } else if (d->source.isValid()) {
0127         return d->source.toString();
0128     }
0129     return QString();
0130 }
0131 
0132 int QQuickIcon::width() const
0133 {
0134     return d->width;
0135 }
0136 
0137 void QQuickIcon::setWidth(int width)
0138 {
0139     if ((d->resolveMask & QQuickIconPrivate::WidthResolved) && d->width == width)
0140         return;
0141 
0142     d.detach();
0143     d->width = width;
0144     d->resolveMask |= QQuickIconPrivate::WidthResolved;
0145 }
0146 
0147 void QQuickIcon::resetWidth()
0148 {
0149     d.detach();
0150     d->width = 0;
0151     d->resolveMask &= ~QQuickIconPrivate::WidthResolved;
0152 }
0153 
0154 int QQuickIcon::height() const
0155 {
0156     return d->height;
0157 }
0158 
0159 void QQuickIcon::setHeight(int height)
0160 {
0161     if ((d->resolveMask & QQuickIconPrivate::HeightResolved) && d->height == height)
0162         return;
0163 
0164     d.detach();
0165     d->height = height;
0166     d->resolveMask |= QQuickIconPrivate::HeightResolved;
0167 }
0168 
0169 void QQuickIcon::resetHeight()
0170 {
0171     d.detach();
0172     d->height = 0;
0173     d->resolveMask &= ~QQuickIconPrivate::HeightResolved;
0174 }
0175 
0176 QColor QQuickIcon::color() const
0177 {
0178     return d->color;
0179 }
0180 
0181 void QQuickIcon::setColor(const QColor &color)
0182 {
0183     if ((d->resolveMask & QQuickIconPrivate::ColorResolved) && d->color == color)
0184         return;
0185 
0186     d.detach();
0187     d->color = color;
0188     d->resolveMask |= QQuickIconPrivate::ColorResolved;
0189 }
0190 
0191 void QQuickIcon::resetColor()
0192 {
0193     d.detach();
0194     d->color = Qt::transparent;
0195     d->resolveMask &= ~QQuickIconPrivate::ColorResolved;
0196 }
0197 
0198 bool QQuickIcon::cache() const
0199 {
0200     return d->cache;
0201 }
0202 
0203 void QQuickIcon::setCache(bool cache)
0204 {
0205     if ((d->resolveMask & QQuickIconPrivate::CacheResolved) && d->cache == cache)
0206         return;
0207 
0208     d.detach();
0209     d->cache = cache;
0210     d->resolveMask |= QQuickIconPrivate::CacheResolved;
0211 }
0212 
0213 void QQuickIcon::resetCache()
0214 {
0215     d.detach();
0216     d->cache = true;
0217     d->resolveMask &= ~QQuickIconPrivate::CacheResolved;
0218 }
0219 
0220 QQuickIcon QQuickIcon::resolve(const QQuickIcon &other) const
0221 {
0222     QQuickIcon resolved = *this;
0223     resolved.d.detach();
0224 
0225     if (!(d->resolveMask & QQuickIconPrivate::NameResolved))
0226         resolved.d->name = other.d->name;
0227 
0228     if (!(d->resolveMask & QQuickIconPrivate::SourceResolved))
0229         resolved.d->source = other.d->source;
0230 
0231     if (!(d->resolveMask & QQuickIconPrivate::WidthResolved))
0232         resolved.d->width = other.d->width;
0233 
0234     if (!(d->resolveMask & QQuickIconPrivate::HeightResolved))
0235         resolved.d->height = other.d->height;
0236 
0237     if (!(d->resolveMask & QQuickIconPrivate::ColorResolved))
0238         resolved.d->color = other.d->color;
0239 
0240     if (!(d->resolveMask & QQuickIconPrivate::CacheResolved))
0241         resolved.d->cache = other.d->cache;
0242 
0243     return resolved;
0244 }
0245 
0246 }
0247 
0248 #include "moc_qquickicon_p.cpp"