Warning, file /frameworks/kdeclarative/src/quickaddons/quickviewsharedengine.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "quickviewsharedengine.h"
0009 
0010 #include <QQmlContext>
0011 #include <QQmlEngine>
0012 #include <QQuickItem>
0013 
0014 #include <KLocalizedString>
0015 #include <kdeclarative/qmlobjectsharedengine.h>
0016 
0017 #include <KPackage/Package>
0018 #include <KPackage/PackageLoader>
0019 
0020 namespace KQuickAddons
0021 {
0022 class QuickViewSharedEnginePrivate
0023 {
0024 public:
0025     QuickViewSharedEnginePrivate(QuickViewSharedEngine *module)
0026         : q(module)
0027         , resizeMode(QuickViewSharedEngine::ResizeMode::SizeRootObjectToView)
0028         , initialSize(0, 0)
0029     {
0030         qmlObject = new KDeclarative::QmlObjectSharedEngine(q);
0031         QObject::connect(qmlObject, &KDeclarative::QmlObject::statusChanged, q, &QuickViewSharedEngine::statusChanged);
0032         QObject::connect(qmlObject, &KDeclarative::QmlObject::finished, q, [this]() {
0033             executionFinished();
0034         });
0035     }
0036 
0037     void executionFinished();
0038     void syncResizeMode();
0039     void syncWidth();
0040     void syncHeight();
0041 
0042     QuickViewSharedEngine *q;
0043     KDeclarative::QmlObjectSharedEngine *qmlObject;
0044     QuickViewSharedEngine::ResizeMode resizeMode;
0045     QSize initialSize;
0046 };
0047 
0048 void QuickViewSharedEnginePrivate::executionFinished()
0049 {
0050     if (!qmlObject->rootObject()) {
0051         return;
0052     }
0053 
0054     QQuickItem *item = qobject_cast<QQuickItem *>(qmlObject->rootObject());
0055 
0056     if (!item) {
0057         return;
0058     }
0059 
0060     item->setParentItem(q->contentItem());
0061     initialSize = QSize(item->width(), item->height());
0062 
0063     if (q->size().isEmpty()) {
0064         q->resize(initialSize);
0065         q->contentItem()->setSize(initialSize);
0066     }
0067 
0068     syncResizeMode();
0069 }
0070 
0071 void QuickViewSharedEnginePrivate::syncResizeMode()
0072 {
0073     QQuickItem *item = qobject_cast<QQuickItem *>(qmlObject->rootObject());
0074 
0075     if (!item) {
0076         return;
0077     }
0078 
0079     if (resizeMode == QuickViewSharedEngine::SizeRootObjectToView) {
0080         item->setSize(QSize(q->width(), q->height()));
0081 
0082         QObject::disconnect(item, &QQuickItem::widthChanged, q, nullptr);
0083         QObject::disconnect(item, &QQuickItem::heightChanged, q, nullptr);
0084 
0085     } else {
0086         QObject::connect(item, &QQuickItem::widthChanged, q, [this]() {
0087             syncWidth();
0088         });
0089         QObject::connect(item, &QQuickItem::heightChanged, q, [this]() {
0090             syncHeight();
0091         });
0092 
0093         syncWidth();
0094         syncHeight();
0095     }
0096 }
0097 
0098 void QuickViewSharedEnginePrivate::syncWidth()
0099 {
0100     QQuickItem *item = qobject_cast<QQuickItem *>(qmlObject->rootObject());
0101 
0102     if (!item) {
0103         return;
0104     }
0105 
0106     q->setWidth(item->width());
0107 }
0108 
0109 void QuickViewSharedEnginePrivate::syncHeight()
0110 {
0111     QQuickItem *item = qobject_cast<QQuickItem *>(qmlObject->rootObject());
0112 
0113     if (!item) {
0114         return;
0115     }
0116 
0117     q->setHeight(item->height());
0118 }
0119 
0120 QuickViewSharedEngine::QuickViewSharedEngine(QWindow *parent)
0121     : QQuickWindow(parent)
0122     , d(new QuickViewSharedEnginePrivate(this))
0123 {
0124 }
0125 
0126 QuickViewSharedEngine::~QuickViewSharedEngine()
0127 {
0128     delete d->qmlObject;
0129 }
0130 
0131 void QuickViewSharedEngine::setTranslationDomain(const QString &translationDomain)
0132 {
0133     d->qmlObject->setTranslationDomain(translationDomain);
0134 }
0135 
0136 QString QuickViewSharedEngine::translationDomain() const
0137 {
0138     return d->qmlObject->translationDomain();
0139 }
0140 
0141 QQmlEngine *QuickViewSharedEngine::engine() const
0142 {
0143     return d->qmlObject->engine();
0144 }
0145 
0146 QList<QQmlError> QuickViewSharedEngine::errors() const
0147 {
0148     QList<QQmlError> errs;
0149 
0150     if (d->qmlObject->mainComponent()) {
0151         errs = d->qmlObject->mainComponent()->errors();
0152     }
0153 
0154     return errs;
0155 }
0156 
0157 QSize QuickViewSharedEngine::sizeHint() const
0158 {
0159     QQuickItem *item = qobject_cast<QQuickItem *>(d->qmlObject->rootObject());
0160     if (!item) {
0161         return QSize();
0162     }
0163 
0164     const QSizeF implicitSize(item->implicitWidth(), item->implicitHeight());
0165 
0166     if (!implicitSize.isEmpty()) {
0167         return implicitSize.toSize();
0168     }
0169 
0170     return QSize(item->width(), item->height());
0171 }
0172 
0173 QSize QuickViewSharedEngine::initialSize() const
0174 {
0175     return d->initialSize;
0176 }
0177 
0178 QuickViewSharedEngine::ResizeMode QuickViewSharedEngine::resizeMode() const
0179 {
0180     return d->resizeMode;
0181 }
0182 
0183 QQmlContext *QuickViewSharedEngine::rootContext() const
0184 {
0185     return d->qmlObject->rootContext();
0186 }
0187 
0188 QQuickItem *QuickViewSharedEngine::rootObject() const
0189 {
0190     return qobject_cast<QQuickItem *>(d->qmlObject->rootObject());
0191 }
0192 
0193 void QuickViewSharedEngine::setResizeMode(ResizeMode mode)
0194 {
0195     if (d->resizeMode == mode) {
0196         return;
0197     }
0198 
0199     d->resizeMode = mode;
0200 
0201     Q_EMIT resizeModeChanged(mode);
0202 
0203     QQuickItem *item = qobject_cast<QQuickItem *>(d->qmlObject->rootObject());
0204     if (!item) {
0205         return;
0206     }
0207 
0208     d->syncResizeMode();
0209 }
0210 
0211 void QuickViewSharedEngine::setSource(const QUrl &url)
0212 {
0213     if (d->qmlObject->source() == url) {
0214         return;
0215     }
0216 
0217     d->qmlObject->setSource(url);
0218     Q_EMIT sourceChanged(url);
0219 }
0220 
0221 QUrl QuickViewSharedEngine::source() const
0222 {
0223     return d->qmlObject->source();
0224 }
0225 
0226 QQmlComponent::Status QuickViewSharedEngine::status() const
0227 {
0228     if (!d->qmlObject->mainComponent()) {
0229         return QQmlComponent::Null;
0230     }
0231 
0232     return QQmlComponent::Status(d->qmlObject->status());
0233 }
0234 
0235 void QuickViewSharedEngine::resizeEvent(QResizeEvent *e)
0236 {
0237     QQuickItem *item = qobject_cast<QQuickItem *>(d->qmlObject->rootObject());
0238     if (item && d->resizeMode == SizeRootObjectToView) {
0239         item->setSize(e->size());
0240     }
0241 
0242     QQuickWindow::resizeEvent(e);
0243 }
0244 
0245 }
0246 
0247 #include "moc_quickviewsharedengine.cpp"