File indexing completed on 2025-02-09 06:41:28

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