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"