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"