Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/quick/items/qquickloader.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||||||||
2 | ** | - | ||||||||||||||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||||||||||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||||||||||||||
5 | ** | - | ||||||||||||||||||
6 | ** This file is part of the QtQuick module of the Qt Toolkit. | - | ||||||||||||||||||
7 | ** | - | ||||||||||||||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||||||||||||||
9 | ** Commercial License Usage | - | ||||||||||||||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||||||||||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||||||||||||||
16 | ** | - | ||||||||||||||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||||||||||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||||||||||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||||||||||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||||||||||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||||||||||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||||||||||||||
24 | ** | - | ||||||||||||||||||
25 | ** GNU General Public License Usage | - | ||||||||||||||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||||||||||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||||||||||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||||||||||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||||||||||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||||||||||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||||||||||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||||||||||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||||||||||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||||||||||||||
35 | ** | - | ||||||||||||||||||
36 | ** $QT_END_LICENSE$ | - | ||||||||||||||||||
37 | ** | - | ||||||||||||||||||
38 | ****************************************************************************/ | - | ||||||||||||||||||
39 | - | |||||||||||||||||||
40 | #include "qquickloader_p_p.h" | - | ||||||||||||||||||
41 | - | |||||||||||||||||||
42 | #include <QtQml/qqmlinfo.h> | - | ||||||||||||||||||
43 | - | |||||||||||||||||||
44 | #include <private/qqmlengine_p.h> | - | ||||||||||||||||||
45 | #include <private/qqmlglobal_p.h> | - | ||||||||||||||||||
46 | - | |||||||||||||||||||
47 | #include <private/qqmlcomponent_p.h> | - | ||||||||||||||||||
48 | - | |||||||||||||||||||
49 | QT_BEGIN_NAMESPACE | - | ||||||||||||||||||
50 | - | |||||||||||||||||||
51 | Q_DECLARE_LOGGING_CATEGORY(lcTransient) | - | ||||||||||||||||||
52 | - | |||||||||||||||||||
53 | static const QQuickItemPrivate::ChangeTypes watchedChanges | - | ||||||||||||||||||
54 | = QQuickItemPrivate::Geometry | QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight; | - | ||||||||||||||||||
55 | - | |||||||||||||||||||
56 | QQuickLoaderPrivate::QQuickLoaderPrivate() | - | ||||||||||||||||||
57 | : item(nullptr), object(nullptr), itemContext(nullptr), incubator(nullptr), updatingSize(false), | - | ||||||||||||||||||
58 | active(true), loadingFromSource(false), asynchronous(false) | - | ||||||||||||||||||
59 | { | - | ||||||||||||||||||
60 | } executed 320 times by 14 tests: end of block Executed by:
| 320 | ||||||||||||||||||
61 | - | |||||||||||||||||||
62 | QQuickLoaderPrivate::~QQuickLoaderPrivate() | - | ||||||||||||||||||
63 | { | - | ||||||||||||||||||
64 | delete itemContext; | - | ||||||||||||||||||
65 | itemContext = nullptr; | - | ||||||||||||||||||
66 | delete incubator; | - | ||||||||||||||||||
67 | disposeInitialPropertyValues(); | - | ||||||||||||||||||
68 | } executed 314 times by 13 tests: end of block Executed by:
| 314 | ||||||||||||||||||
69 | - | |||||||||||||||||||
70 | void QQuickLoaderPrivate::itemGeometryChanged(QQuickItem *resizeItem, QQuickGeometryChange change, | - | ||||||||||||||||||
71 | const QRectF &oldGeometry) | - | ||||||||||||||||||
72 | { | - | ||||||||||||||||||
73 | if (resizeItem == item)
| 0-118 | ||||||||||||||||||
74 | _q_updateSize(false); executed 118 times by 5 tests: _q_updateSize(false); Executed by:
| 118 | ||||||||||||||||||
75 | QQuickItemChangeListener::itemGeometryChanged(resizeItem, change, oldGeometry); | - | ||||||||||||||||||
76 | } executed 118 times by 5 tests: end of block Executed by:
| 118 | ||||||||||||||||||
77 | - | |||||||||||||||||||
78 | void QQuickLoaderPrivate::itemImplicitWidthChanged(QQuickItem *) | - | ||||||||||||||||||
79 | { | - | ||||||||||||||||||
80 | Q_Q(QQuickLoader); | - | ||||||||||||||||||
81 | q->setImplicitWidth(getImplicitWidth()); | - | ||||||||||||||||||
82 | } executed 10 times by 2 tests: end of block Executed by:
| 10 | ||||||||||||||||||
83 | - | |||||||||||||||||||
84 | void QQuickLoaderPrivate::itemImplicitHeightChanged(QQuickItem *) | - | ||||||||||||||||||
85 | { | - | ||||||||||||||||||
86 | Q_Q(QQuickLoader); | - | ||||||||||||||||||
87 | q->setImplicitHeight(getImplicitHeight()); | - | ||||||||||||||||||
88 | } executed 8 times by 3 tests: end of block Executed by:
| 8 | ||||||||||||||||||
89 | - | |||||||||||||||||||
90 | void QQuickLoaderPrivate::clear() | - | ||||||||||||||||||
91 | { | - | ||||||||||||||||||
92 | Q_Q(QQuickLoader); | - | ||||||||||||||||||
93 | disposeInitialPropertyValues(); | - | ||||||||||||||||||
94 | - | |||||||||||||||||||
95 | if (incubator)
| 318-348 | ||||||||||||||||||
96 | incubator->clear(); executed 318 times by 13 tests: incubator->clear(); Executed by:
| 318 | ||||||||||||||||||
97 | - | |||||||||||||||||||
98 | delete itemContext; | - | ||||||||||||||||||
99 | itemContext = nullptr; | - | ||||||||||||||||||
100 | - | |||||||||||||||||||
101 | // Prevent any bindings from running while waiting for deletion. Without | - | ||||||||||||||||||
102 | // this we may get transient errors from use of 'parent', for example. | - | ||||||||||||||||||
103 | QQmlContext *context = qmlContext(object); | - | ||||||||||||||||||
104 | if (context)
| 182-484 | ||||||||||||||||||
105 | QQmlContextData::get(context)->clearContextRecursively(); executed 182 times by 11 tests: QQmlContextData::get(context)->clearContextRecursively(); Executed by:
| 182 | ||||||||||||||||||
106 | - | |||||||||||||||||||
107 | if (loadingFromSource && component) {
| 170-496 | ||||||||||||||||||
108 | // disconnect since we deleteLater | - | ||||||||||||||||||
109 | QObject::disconnect(component, SIGNAL(statusChanged(QQmlComponent::Status)), | - | ||||||||||||||||||
110 | q, SLOT(_q_sourceLoaded())); | - | ||||||||||||||||||
111 | QObject::disconnect(component, SIGNAL(progressChanged(qreal)), | - | ||||||||||||||||||
112 | q, SIGNAL(progressChanged())); | - | ||||||||||||||||||
113 | component->deleteLater(); | - | ||||||||||||||||||
114 | component.setObject(nullptr, q); | - | ||||||||||||||||||
115 | } executed 158 times by 5 tests: end of block Executed by:
| 158 | ||||||||||||||||||
116 | source = QUrl(); | - | ||||||||||||||||||
117 | - | |||||||||||||||||||
118 | if (item) {
| 268-398 | ||||||||||||||||||
119 | QQuickItemPrivate *p = QQuickItemPrivate::get(item); | - | ||||||||||||||||||
120 | p->removeItemChangeListener(this, watchedChanges); | - | ||||||||||||||||||
121 | - | |||||||||||||||||||
122 | // We can't delete immediately because our item may have triggered | - | ||||||||||||||||||
123 | // the Loader to load a different item. | - | ||||||||||||||||||
124 | item->setParentItem(nullptr); | - | ||||||||||||||||||
125 | item->setVisible(false); | - | ||||||||||||||||||
126 | item = nullptr; | - | ||||||||||||||||||
127 | } executed 268 times by 12 tests: end of block Executed by:
| 268 | ||||||||||||||||||
128 | if (object) {
| 272-394 | ||||||||||||||||||
129 | object->deleteLater(); | - | ||||||||||||||||||
130 | object = nullptr; | - | ||||||||||||||||||
131 | } executed 272 times by 12 tests: end of block Executed by:
| 272 | ||||||||||||||||||
132 | } executed 666 times by 14 tests: end of block Executed by:
| 666 | ||||||||||||||||||
133 | - | |||||||||||||||||||
134 | void QQuickLoaderPrivate::initResize() | - | ||||||||||||||||||
135 | { | - | ||||||||||||||||||
136 | if (!item)
| 8-286 | ||||||||||||||||||
137 | return; executed 8 times by 2 tests: return; Executed by:
| 8 | ||||||||||||||||||
138 | QQuickItemPrivate *p = QQuickItemPrivate::get(item); | - | ||||||||||||||||||
139 | p->addItemChangeListener(this, watchedChanges); | - | ||||||||||||||||||
140 | _q_updateSize(); | - | ||||||||||||||||||
141 | } executed 286 times by 14 tests: end of block Executed by:
| 286 | ||||||||||||||||||
142 | - | |||||||||||||||||||
143 | qreal QQuickLoaderPrivate::getImplicitWidth() const | - | ||||||||||||||||||
144 | { | - | ||||||||||||||||||
145 | Q_Q(const QQuickLoader); | - | ||||||||||||||||||
146 | // If the Loader has a valid width then Loader has set an explicit width on the | - | ||||||||||||||||||
147 | // item, and we want the item's implicitWidth. If the Loader's width has | - | ||||||||||||||||||
148 | // not been set then its implicitWidth is the width of the item. | - | ||||||||||||||||||
149 | if (item)
| 6-556 | ||||||||||||||||||
150 | return q->widthValid() ? item->implicitWidth() : item->width(); executed 556 times by 14 tests: return q->widthValid() ? item->implicitWidth() : item->width(); Executed by:
| 556 | ||||||||||||||||||
151 | return QQuickImplicitSizeItemPrivate::getImplicitWidth(); executed 6 times by 1 test: return QQuickImplicitSizeItemPrivate::getImplicitWidth(); Executed by:
| 6 | ||||||||||||||||||
152 | } | - | ||||||||||||||||||
153 | - | |||||||||||||||||||
154 | qreal QQuickLoaderPrivate::getImplicitHeight() const | - | ||||||||||||||||||
155 | { | - | ||||||||||||||||||
156 | Q_Q(const QQuickLoader); | - | ||||||||||||||||||
157 | // If the Loader has a valid height then Loader has set an explicit height on the | - | ||||||||||||||||||
158 | // item, and we want the item's implicitHeight. If the Loader's height has | - | ||||||||||||||||||
159 | // not been set then its implicitHeight is the height of the item. | - | ||||||||||||||||||
160 | if (item)
| 6-554 | ||||||||||||||||||
161 | return q->heightValid() ? item->implicitHeight() : item->height(); executed 554 times by 14 tests: return q->heightValid() ? item->implicitHeight() : item->height(); Executed by:
| 554 | ||||||||||||||||||
162 | return QQuickImplicitSizeItemPrivate::getImplicitHeight(); executed 6 times by 1 test: return QQuickImplicitSizeItemPrivate::getImplicitHeight(); Executed by:
| 6 | ||||||||||||||||||
163 | } | - | ||||||||||||||||||
164 | - | |||||||||||||||||||
165 | /*! | - | ||||||||||||||||||
166 | \qmltype Loader | - | ||||||||||||||||||
167 | \instantiates QQuickLoader | - | ||||||||||||||||||
168 | \inqmlmodule QtQuick | - | ||||||||||||||||||
169 | \ingroup qtquick-dynamic | - | ||||||||||||||||||
170 | \inherits Item | - | ||||||||||||||||||
171 | - | |||||||||||||||||||
172 | \brief Allows dynamic loading of a subtree from a URL or Component. | - | ||||||||||||||||||
173 | - | |||||||||||||||||||
174 | Loader is used to dynamically load QML components. | - | ||||||||||||||||||
175 | - | |||||||||||||||||||
176 | Loader can load a | - | ||||||||||||||||||
177 | QML file (using the \l source property) or a \l Component object (using | - | ||||||||||||||||||
178 | the \l sourceComponent property). It is useful for delaying the creation | - | ||||||||||||||||||
179 | of a component until it is required: for example, when a component should | - | ||||||||||||||||||
180 | be created on demand, or when a component should not be created | - | ||||||||||||||||||
181 | unnecessarily for performance reasons. | - | ||||||||||||||||||
182 | - | |||||||||||||||||||
183 | Here is a Loader that loads "Page1.qml" as a component when the | - | ||||||||||||||||||
184 | \l MouseArea is clicked: | - | ||||||||||||||||||
185 | - | |||||||||||||||||||
186 | \snippet qml/loader/simple.qml 0 | - | ||||||||||||||||||
187 | - | |||||||||||||||||||
188 | The loaded object can be accessed using the \l item property. | - | ||||||||||||||||||
189 | - | |||||||||||||||||||
190 | If the \l source or \l sourceComponent changes, any previously instantiated | - | ||||||||||||||||||
191 | items are destroyed. Setting \l source to an empty string or setting | - | ||||||||||||||||||
192 | \l sourceComponent to \c undefined destroys the currently loaded object, | - | ||||||||||||||||||
193 | freeing resources and leaving the Loader empty. | - | ||||||||||||||||||
194 | - | |||||||||||||||||||
195 | \section2 Loader Sizing Behavior | - | ||||||||||||||||||
196 | - | |||||||||||||||||||
197 | If the source component is not an Item type, Loader does not | - | ||||||||||||||||||
198 | apply any special sizing rules. When used to load visual types, | - | ||||||||||||||||||
199 | Loader applies the following sizing rules: | - | ||||||||||||||||||
200 | - | |||||||||||||||||||
201 | \list | - | ||||||||||||||||||
202 | \li If an explicit size is not specified for the Loader, the Loader | - | ||||||||||||||||||
203 | is automatically resized to the size of the loaded item once the | - | ||||||||||||||||||
204 | component is loaded. | - | ||||||||||||||||||
205 | \li If the size of the Loader is specified explicitly by setting | - | ||||||||||||||||||
206 | the width, height or by anchoring, the loaded item will be resized | - | ||||||||||||||||||
207 | to the size of the Loader. | - | ||||||||||||||||||
208 | \endlist | - | ||||||||||||||||||
209 | - | |||||||||||||||||||
210 | In both scenarios the size of the item and the Loader are identical. | - | ||||||||||||||||||
211 | This ensures that anchoring to the Loader is equivalent to anchoring | - | ||||||||||||||||||
212 | to the loaded item. | - | ||||||||||||||||||
213 | - | |||||||||||||||||||
214 | \table | - | ||||||||||||||||||
215 | \row | - | ||||||||||||||||||
216 | \li sizeloader.qml | - | ||||||||||||||||||
217 | \li sizeitem.qml | - | ||||||||||||||||||
218 | \row | - | ||||||||||||||||||
219 | \li \snippet qml/loader/sizeloader.qml 0 | - | ||||||||||||||||||
220 | \li \snippet qml/loader/sizeitem.qml 0 | - | ||||||||||||||||||
221 | \row | - | ||||||||||||||||||
222 | \li The red rectangle will be sized to the size of the root item. | - | ||||||||||||||||||
223 | \li The red rectangle will be 50x50, centered in the root item. | - | ||||||||||||||||||
224 | \endtable | - | ||||||||||||||||||
225 | - | |||||||||||||||||||
226 | - | |||||||||||||||||||
227 | \section2 Receiving Signals from Loaded Objects | - | ||||||||||||||||||
228 | - | |||||||||||||||||||
229 | Any signals emitted from the loaded object can be received using the | - | ||||||||||||||||||
230 | \l Connections type. For example, the following \c application.qml | - | ||||||||||||||||||
231 | loads \c MyItem.qml, and is able to receive the \c message signal from | - | ||||||||||||||||||
232 | the loaded item through a \l Connections object: | - | ||||||||||||||||||
233 | - | |||||||||||||||||||
234 | \table 70% | - | ||||||||||||||||||
235 | \row | - | ||||||||||||||||||
236 | \li application.qml | - | ||||||||||||||||||
237 | \li MyItem.qml | - | ||||||||||||||||||
238 | \row | - | ||||||||||||||||||
239 | \li \snippet qml/loader/connections.qml 0 | - | ||||||||||||||||||
240 | \li \snippet qml/loader/MyItem.qml 0 | - | ||||||||||||||||||
241 | \endtable | - | ||||||||||||||||||
242 | - | |||||||||||||||||||
243 | Alternatively, since \c MyItem.qml is loaded within the scope of the | - | ||||||||||||||||||
244 | Loader, it could also directly call any function defined in the Loader or | - | ||||||||||||||||||
245 | its parent \l Item. | - | ||||||||||||||||||
246 | - | |||||||||||||||||||
247 | - | |||||||||||||||||||
248 | \section2 Focus and Key Events | - | ||||||||||||||||||
249 | - | |||||||||||||||||||
250 | Loader is a focus scope. Its \l {Item::}{focus} property must be set to | - | ||||||||||||||||||
251 | \c true for any of its children to get the \e {active focus}. (See | - | ||||||||||||||||||
252 | \l{Keyboard Focus in Qt Quick} | - | ||||||||||||||||||
253 | for more details.) Any key events received in the loaded item should likely | - | ||||||||||||||||||
254 | also be \l {KeyEvent::}{accepted} so they are not propagated to the Loader. | - | ||||||||||||||||||
255 | - | |||||||||||||||||||
256 | For example, the following \c application.qml loads \c KeyReader.qml when | - | ||||||||||||||||||
257 | the \l MouseArea is clicked. Notice the \l {Item::}{focus} property is | - | ||||||||||||||||||
258 | set to \c true for the Loader as well as the \l Item in the dynamically | - | ||||||||||||||||||
259 | loaded object: | - | ||||||||||||||||||
260 | - | |||||||||||||||||||
261 | \table | - | ||||||||||||||||||
262 | \row | - | ||||||||||||||||||
263 | \li application.qml | - | ||||||||||||||||||
264 | \li KeyReader.qml | - | ||||||||||||||||||
265 | \row | - | ||||||||||||||||||
266 | \li \snippet qml/loader/focus.qml 0 | - | ||||||||||||||||||
267 | \li \snippet qml/loader/KeyReader.qml 0 | - | ||||||||||||||||||
268 | \endtable | - | ||||||||||||||||||
269 | - | |||||||||||||||||||
270 | Once \c KeyReader.qml is loaded, it accepts key events and sets | - | ||||||||||||||||||
271 | \c event.accepted to \c true so that the event is not propagated to the | - | ||||||||||||||||||
272 | parent \l Rectangle. | - | ||||||||||||||||||
273 | - | |||||||||||||||||||
274 | Since \c {QtQuick 2.0}, Loader can also load non-visual components. | - | ||||||||||||||||||
275 | - | |||||||||||||||||||
276 | \section2 Using a Loader within a View Delegate | - | ||||||||||||||||||
277 | - | |||||||||||||||||||
278 | In some cases you may wish to use a Loader within a view delegate to improve delegate | - | ||||||||||||||||||
279 | loading performance. This works well in most cases, but there is one important issue to | - | ||||||||||||||||||
280 | be aware of related to the \l{QtQml::Component#Creation Context}{creation context} of a Component. | - | ||||||||||||||||||
281 | - | |||||||||||||||||||
282 | In the following example, the \c index context property inserted by the ListView into \c delegateComponent's | - | ||||||||||||||||||
283 | context will be inaccessible to Text, as the Loader will use the creation context of \c myComponent as the parent | - | ||||||||||||||||||
284 | context when instantiating it, and \c index does not refer to anything within that context chain. | - | ||||||||||||||||||
285 | - | |||||||||||||||||||
286 | \snippet qml/loader/creationContext1.qml 0 | - | ||||||||||||||||||
287 | - | |||||||||||||||||||
288 | In this situation we can either move the component inline, | - | ||||||||||||||||||
289 | - | |||||||||||||||||||
290 | \snippet qml/loader/creationContext2.qml 0 | - | ||||||||||||||||||
291 | - | |||||||||||||||||||
292 | into a separate file, | - | ||||||||||||||||||
293 | - | |||||||||||||||||||
294 | \snippet qml/loader/creationContext3.qml 0 | - | ||||||||||||||||||
295 | - | |||||||||||||||||||
296 | or explicitly set the required information as a property of the Loader (this works because the | - | ||||||||||||||||||
297 | Loader sets itself as the context object for the component it is loading). | - | ||||||||||||||||||
298 | - | |||||||||||||||||||
299 | \snippet qml/loader/creationContext4.qml 0 | - | ||||||||||||||||||
300 | - | |||||||||||||||||||
301 | \sa {dynamic-object-creation}{Dynamic Object Creation} | - | ||||||||||||||||||
302 | */ | - | ||||||||||||||||||
303 | - | |||||||||||||||||||
304 | QQuickLoader::QQuickLoader(QQuickItem *parent) | - | ||||||||||||||||||
305 | : QQuickImplicitSizeItem(*(new QQuickLoaderPrivate), parent) | - | ||||||||||||||||||
306 | { | - | ||||||||||||||||||
307 | setFlag(ItemIsFocusScope); | - | ||||||||||||||||||
308 | } executed 320 times by 14 tests: end of block Executed by:
| 320 | ||||||||||||||||||
309 | - | |||||||||||||||||||
310 | QQuickLoader::~QQuickLoader() | - | ||||||||||||||||||
311 | { | - | ||||||||||||||||||
312 | Q_D(QQuickLoader); | - | ||||||||||||||||||
313 | d->clear(); | - | ||||||||||||||||||
314 | } executed 314 times by 13 tests: end of block Executed by:
| 314 | ||||||||||||||||||
315 | - | |||||||||||||||||||
316 | /*! | - | ||||||||||||||||||
317 | \qmlproperty bool QtQuick::Loader::active | - | ||||||||||||||||||
318 | This property is \c true if the Loader is currently active. | - | ||||||||||||||||||
319 | The default value for this property is \c true. | - | ||||||||||||||||||
320 | - | |||||||||||||||||||
321 | If the Loader is inactive, changing the \l source or \l sourceComponent | - | ||||||||||||||||||
322 | will not cause the item to be instantiated until the Loader is made active. | - | ||||||||||||||||||
323 | - | |||||||||||||||||||
324 | Setting the value to inactive will cause any \l item loaded by the loader | - | ||||||||||||||||||
325 | to be released, but will not affect the \l source or \l sourceComponent. | - | ||||||||||||||||||
326 | - | |||||||||||||||||||
327 | The \l status of an inactive loader is always \c Null. | - | ||||||||||||||||||
328 | - | |||||||||||||||||||
329 | \sa source, sourceComponent | - | ||||||||||||||||||
330 | */ | - | ||||||||||||||||||
331 | bool QQuickLoader::active() const | - | ||||||||||||||||||
332 | { | - | ||||||||||||||||||
333 | Q_D(const QQuickLoader); | - | ||||||||||||||||||
334 | return d->active; executed 348 times by 14 tests: return d->active; Executed by:
| 348 | ||||||||||||||||||
335 | } | - | ||||||||||||||||||
336 | - | |||||||||||||||||||
337 | void QQuickLoader::setActive(bool newVal) | - | ||||||||||||||||||
338 | { | - | ||||||||||||||||||
339 | Q_D(QQuickLoader); | - | ||||||||||||||||||
340 | if (d->active == newVal)
| 8-66 | ||||||||||||||||||
341 | return; executed 8 times by 1 test: return; Executed by:
| 8 | ||||||||||||||||||
342 | - | |||||||||||||||||||
343 | d->active = newVal; | - | ||||||||||||||||||
344 | if (newVal == true) {
| 22-44 | ||||||||||||||||||
345 | if (d->loadingFromSource) {
| 10-12 | ||||||||||||||||||
346 | loadFromSource(); | - | ||||||||||||||||||
347 | } else { executed 12 times by 1 test: end of block Executed by:
| 12 | ||||||||||||||||||
348 | loadFromSourceComponent(); | - | ||||||||||||||||||
349 | } executed 10 times by 1 test: end of block Executed by:
| 10 | ||||||||||||||||||
350 | } else { | - | ||||||||||||||||||
351 | // cancel any current incubation | - | ||||||||||||||||||
352 | if (d->incubator) {
| 18-26 | ||||||||||||||||||
353 | d->incubator->clear(); | - | ||||||||||||||||||
354 | delete d->itemContext; | - | ||||||||||||||||||
355 | d->itemContext = nullptr; | - | ||||||||||||||||||
356 | } executed 18 times by 2 tests: end of block Executed by:
| 18 | ||||||||||||||||||
357 | - | |||||||||||||||||||
358 | // Prevent any bindings from running while waiting for deletion. Without | - | ||||||||||||||||||
359 | // this we may get transient errors from use of 'parent', for example. | - | ||||||||||||||||||
360 | QQmlContext *context = qmlContext(d->object); | - | ||||||||||||||||||
361 | if (context)
| 16-28 | ||||||||||||||||||
362 | QQmlContextData::get(context)->clearContextRecursively(); executed 16 times by 2 tests: QQmlContextData::get(context)->clearContextRecursively(); Executed by:
| 16 | ||||||||||||||||||
363 | - | |||||||||||||||||||
364 | if (d->item) {
| 14-30 | ||||||||||||||||||
365 | QQuickItemPrivate *p = QQuickItemPrivate::get(d->item); | - | ||||||||||||||||||
366 | p->removeItemChangeListener(d, watchedChanges); | - | ||||||||||||||||||
367 | - | |||||||||||||||||||
368 | // We can't delete immediately because our item may have triggered | - | ||||||||||||||||||
369 | // the Loader to load a different item. | - | ||||||||||||||||||
370 | d->item->setParentItem(nullptr); | - | ||||||||||||||||||
371 | d->item->setVisible(false); | - | ||||||||||||||||||
372 | d->item = nullptr; | - | ||||||||||||||||||
373 | } executed 14 times by 2 tests: end of block Executed by:
| 14 | ||||||||||||||||||
374 | if (d->object) {
| 16-28 | ||||||||||||||||||
375 | d->object->deleteLater(); | - | ||||||||||||||||||
376 | d->object = nullptr; | - | ||||||||||||||||||
377 | emit itemChanged(); | - | ||||||||||||||||||
378 | } executed 16 times by 2 tests: end of block Executed by:
| 16 | ||||||||||||||||||
379 | emit statusChanged(); | - | ||||||||||||||||||
380 | } executed 44 times by 2 tests: end of block Executed by:
| 44 | ||||||||||||||||||
381 | emit activeChanged(); | - | ||||||||||||||||||
382 | } executed 66 times by 2 tests: end of block Executed by:
| 66 | ||||||||||||||||||
383 | - | |||||||||||||||||||
384 | - | |||||||||||||||||||
385 | /*! | - | ||||||||||||||||||
386 | \qmlproperty url QtQuick::Loader::source | - | ||||||||||||||||||
387 | This property holds the URL of the QML component to instantiate. | - | ||||||||||||||||||
388 | - | |||||||||||||||||||
389 | Since \c {QtQuick 2.0}, Loader is able to load any type of object; it | - | ||||||||||||||||||
390 | is not restricted to Item types. | - | ||||||||||||||||||
391 | - | |||||||||||||||||||
392 | To unload the currently loaded object, set this property to an empty string, | - | ||||||||||||||||||
393 | or set \l sourceComponent to \c undefined. Setting \c source to a | - | ||||||||||||||||||
394 | new URL will also cause the item created by the previous URL to be unloaded. | - | ||||||||||||||||||
395 | - | |||||||||||||||||||
396 | \sa sourceComponent, status, progress | - | ||||||||||||||||||
397 | */ | - | ||||||||||||||||||
398 | QUrl QQuickLoader::source() const | - | ||||||||||||||||||
399 | { | - | ||||||||||||||||||
400 | Q_D(const QQuickLoader); | - | ||||||||||||||||||
401 | return d->source; executed 20 times by 1 test: return d->source; Executed by:
| 20 | ||||||||||||||||||
402 | } | - | ||||||||||||||||||
403 | - | |||||||||||||||||||
404 | void QQuickLoader::setSource(const QUrl &url) | - | ||||||||||||||||||
405 | { | - | ||||||||||||||||||
406 | setSource(url, true); // clear previous values | - | ||||||||||||||||||
407 | } executed 144 times by 5 tests: end of block Executed by:
| 144 | ||||||||||||||||||
408 | - | |||||||||||||||||||
409 | void QQuickLoader::setSource(const QUrl &url, bool needsClear) | - | ||||||||||||||||||
410 | { | - | ||||||||||||||||||
411 | Q_D(QQuickLoader); | - | ||||||||||||||||||
412 | if (d->source == url)
| 0-170 | ||||||||||||||||||
413 | return; never executed: return; | 0 | ||||||||||||||||||
414 | - | |||||||||||||||||||
415 | if (needsClear)
| 26-144 | ||||||||||||||||||
416 | d->clear(); executed 144 times by 5 tests: d->clear(); Executed by:
| 144 | ||||||||||||||||||
417 | - | |||||||||||||||||||
418 | d->source = url; | - | ||||||||||||||||||
419 | d->loadingFromSource = true; | - | ||||||||||||||||||
420 | - | |||||||||||||||||||
421 | if (d->active)
| 12-158 | ||||||||||||||||||
422 | loadFromSource(); executed 158 times by 5 tests: loadFromSource(); Executed by:
| 158 | ||||||||||||||||||
423 | else | - | ||||||||||||||||||
424 | emit sourceChanged(); executed 12 times by 1 test: sourceChanged(); Executed by:
| 12 | ||||||||||||||||||
425 | } | - | ||||||||||||||||||
426 | - | |||||||||||||||||||
427 | void QQuickLoader::loadFromSource() | - | ||||||||||||||||||
428 | { | - | ||||||||||||||||||
429 | Q_D(QQuickLoader); | - | ||||||||||||||||||
430 | if (d->source.isEmpty()) {
| 6-166 | ||||||||||||||||||
431 | emit sourceChanged(); | - | ||||||||||||||||||
432 | emit statusChanged(); | - | ||||||||||||||||||
433 | emit progressChanged(); | - | ||||||||||||||||||
434 | emit itemChanged(); | - | ||||||||||||||||||
435 | return; executed 6 times by 2 tests: return; Executed by:
| 6 | ||||||||||||||||||
436 | } | - | ||||||||||||||||||
437 | - | |||||||||||||||||||
438 | if (isComponentComplete()) {
| 66-100 | ||||||||||||||||||
439 | QQmlComponent::CompilationMode mode = d->asynchronous ? QQmlComponent::Asynchronous : QQmlComponent::PreferSynchronous;
| 24-42 | ||||||||||||||||||
440 | d->component.setObject(new QQmlComponent(qmlEngine(this), d->source, mode, this), this); | - | ||||||||||||||||||
441 | d->load(); | - | ||||||||||||||||||
442 | } executed 66 times by 4 tests: end of block Executed by:
| 66 | ||||||||||||||||||
443 | } executed 166 times by 5 tests: end of block Executed by:
| 166 | ||||||||||||||||||
444 | - | |||||||||||||||||||
445 | /*! | - | ||||||||||||||||||
446 | \qmlproperty Component QtQuick::Loader::sourceComponent | - | ||||||||||||||||||
447 | This property holds the \l{Component} to instantiate. | - | ||||||||||||||||||
448 | - | |||||||||||||||||||
449 | \qml | - | ||||||||||||||||||
450 | Item { | - | ||||||||||||||||||
451 | Component { | - | ||||||||||||||||||
452 | id: redSquare | - | ||||||||||||||||||
453 | Rectangle { color: "red"; width: 10; height: 10 } | - | ||||||||||||||||||
454 | } | - | ||||||||||||||||||
455 | - | |||||||||||||||||||
456 | Loader { sourceComponent: redSquare } | - | ||||||||||||||||||
457 | Loader { sourceComponent: redSquare; x: 10 } | - | ||||||||||||||||||
458 | } | - | ||||||||||||||||||
459 | \endqml | - | ||||||||||||||||||
460 | - | |||||||||||||||||||
461 | To unload the currently loaded object, set this property to \c undefined. | - | ||||||||||||||||||
462 | - | |||||||||||||||||||
463 | Since \c {QtQuick 2.0}, Loader is able to load any type of object; it | - | ||||||||||||||||||
464 | is not restricted to Item types. | - | ||||||||||||||||||
465 | - | |||||||||||||||||||
466 | \sa source, progress | - | ||||||||||||||||||
467 | */ | - | ||||||||||||||||||
468 | - | |||||||||||||||||||
469 | QQmlComponent *QQuickLoader::sourceComponent() const | - | ||||||||||||||||||
470 | { | - | ||||||||||||||||||
471 | Q_D(const QQuickLoader); | - | ||||||||||||||||||
472 | return d->component; executed 44 times by 3 tests: return d->component; Executed by:
| 44 | ||||||||||||||||||
473 | } | - | ||||||||||||||||||
474 | - | |||||||||||||||||||
475 | void QQuickLoader::setSourceComponent(QQmlComponent *comp) | - | ||||||||||||||||||
476 | { | - | ||||||||||||||||||
477 | Q_D(QQuickLoader); | - | ||||||||||||||||||
478 | if (comp == d->component)
| 4-180 | ||||||||||||||||||
479 | return; executed 4 times by 1 test: return; Executed by:
| 4 | ||||||||||||||||||
480 | - | |||||||||||||||||||
481 | d->clear(); | - | ||||||||||||||||||
482 | - | |||||||||||||||||||
483 | d->component.setObject(comp, this); | - | ||||||||||||||||||
484 | d->loadingFromSource = false; | - | ||||||||||||||||||
485 | - | |||||||||||||||||||
486 | if (d->active)
| 4-176 | ||||||||||||||||||
487 | loadFromSourceComponent(); executed 176 times by 12 tests: loadFromSourceComponent(); Executed by:
| 176 | ||||||||||||||||||
488 | else | - | ||||||||||||||||||
489 | emit sourceComponentChanged(); executed 4 times by 1 test: sourceComponentChanged(); Executed by:
| 4 | ||||||||||||||||||
490 | } | - | ||||||||||||||||||
491 | - | |||||||||||||||||||
492 | void QQuickLoader::resetSourceComponent() | - | ||||||||||||||||||
493 | { | - | ||||||||||||||||||
494 | setSourceComponent(nullptr); | - | ||||||||||||||||||
495 | } executed 10 times by 2 tests: end of block Executed by:
| 10 | ||||||||||||||||||
496 | - | |||||||||||||||||||
497 | void QQuickLoader::loadFromSourceComponent() | - | ||||||||||||||||||
498 | { | - | ||||||||||||||||||
499 | Q_D(QQuickLoader); | - | ||||||||||||||||||
500 | if (!d->component) {
| 20-166 | ||||||||||||||||||
501 | emit sourceComponentChanged(); | - | ||||||||||||||||||
502 | emit statusChanged(); | - | ||||||||||||||||||
503 | emit progressChanged(); | - | ||||||||||||||||||
504 | emit itemChanged(); | - | ||||||||||||||||||
505 | return; executed 20 times by 2 tests: return; Executed by:
| 20 | ||||||||||||||||||
506 | } | - | ||||||||||||||||||
507 | - | |||||||||||||||||||
508 | if (isComponentComplete())
| 18-148 | ||||||||||||||||||
509 | d->load(); executed 18 times by 4 tests: d->load(); Executed by:
| 18 | ||||||||||||||||||
510 | } executed 166 times by 12 tests: end of block Executed by:
| 166 | ||||||||||||||||||
511 | - | |||||||||||||||||||
512 | /*! | - | ||||||||||||||||||
513 | \qmlmethod object QtQuick::Loader::setSource(url source, object properties) | - | ||||||||||||||||||
514 | - | |||||||||||||||||||
515 | Creates an object instance of the given \a source component that will have | - | ||||||||||||||||||
516 | the given \a properties. The \a properties argument is optional. The instance | - | ||||||||||||||||||
517 | will be accessible via the \l item property once loading and instantiation | - | ||||||||||||||||||
518 | is complete. | - | ||||||||||||||||||
519 | - | |||||||||||||||||||
520 | If the \l active property is \c false at the time when this function is called, | - | ||||||||||||||||||
521 | the given \a source component will not be loaded but the \a source and initial | - | ||||||||||||||||||
522 | \a properties will be cached. When the loader is made \l active, an instance of | - | ||||||||||||||||||
523 | the \a source component will be created with the initial \a properties set. | - | ||||||||||||||||||
524 | - | |||||||||||||||||||
525 | Setting the initial property values of an instance of a component in this manner | - | ||||||||||||||||||
526 | will \b{not} trigger any associated \l{Behavior}s. | - | ||||||||||||||||||
527 | - | |||||||||||||||||||
528 | Note that the cached \a properties will be cleared if the \l source or \l sourceComponent | - | ||||||||||||||||||
529 | is changed after calling this function but prior to setting the loader \l active. | - | ||||||||||||||||||
530 | - | |||||||||||||||||||
531 | Example: | - | ||||||||||||||||||
532 | \table 70% | - | ||||||||||||||||||
533 | \row | - | ||||||||||||||||||
534 | \li | - | ||||||||||||||||||
535 | \qml | - | ||||||||||||||||||
536 | // ExampleComponent.qml | - | ||||||||||||||||||
537 | import QtQuick 2.0 | - | ||||||||||||||||||
538 | Rectangle { | - | ||||||||||||||||||
539 | id: rect | - | ||||||||||||||||||
540 | color: "red" | - | ||||||||||||||||||
541 | width: 10 | - | ||||||||||||||||||
542 | height: 10 | - | ||||||||||||||||||
543 | - | |||||||||||||||||||
544 | Behavior on color { | - | ||||||||||||||||||
545 | NumberAnimation { | - | ||||||||||||||||||
546 | target: rect | - | ||||||||||||||||||
547 | property: "width" | - | ||||||||||||||||||
548 | to: (rect.width + 20) | - | ||||||||||||||||||
549 | duration: 0 | - | ||||||||||||||||||
550 | } | - | ||||||||||||||||||
551 | } | - | ||||||||||||||||||
552 | } | - | ||||||||||||||||||
553 | \endqml | - | ||||||||||||||||||
554 | \li | - | ||||||||||||||||||
555 | \qml | - | ||||||||||||||||||
556 | // example.qml | - | ||||||||||||||||||
557 | import QtQuick 2.0 | - | ||||||||||||||||||
558 | Item { | - | ||||||||||||||||||
559 | Loader { | - | ||||||||||||||||||
560 | id: squareLoader | - | ||||||||||||||||||
561 | onLoaded: console.log(squareLoader.item.width); | - | ||||||||||||||||||
562 | // prints [10], not [30] | - | ||||||||||||||||||
563 | } | - | ||||||||||||||||||
564 | - | |||||||||||||||||||
565 | Component.onCompleted: { | - | ||||||||||||||||||
566 | squareLoader.setSource("ExampleComponent.qml", | - | ||||||||||||||||||
567 | { "color": "blue" }); | - | ||||||||||||||||||
568 | // will trigger the onLoaded code when complete. | - | ||||||||||||||||||
569 | } | - | ||||||||||||||||||
570 | } | - | ||||||||||||||||||
571 | \endqml | - | ||||||||||||||||||
572 | \endtable | - | ||||||||||||||||||
573 | - | |||||||||||||||||||
574 | \sa source, active | - | ||||||||||||||||||
575 | */ | - | ||||||||||||||||||
576 | void QQuickLoader::setSource(QQmlV4Function *args) | - | ||||||||||||||||||
577 | { | - | ||||||||||||||||||
578 | Q_ASSERT(args); | - | ||||||||||||||||||
579 | Q_D(QQuickLoader); | - | ||||||||||||||||||
580 | - | |||||||||||||||||||
581 | bool ipvError = false; | - | ||||||||||||||||||
582 | args->setReturnValue(QV4::Encode::undefined()); | - | ||||||||||||||||||
583 | QV4::Scope scope(args->v4engine()); | - | ||||||||||||||||||
584 | QV4::ScopedValue ipv(scope, d->extractInitialPropertyValues(args, this, &ipvError)); | - | ||||||||||||||||||
585 | if (ipvError)
| 4-26 | ||||||||||||||||||
586 | return; executed 4 times by 1 test: return; Executed by:
| 4 | ||||||||||||||||||
587 | - | |||||||||||||||||||
588 | d->clear(); | - | ||||||||||||||||||
589 | QUrl sourceUrl = d->resolveSourceUrl(args); | - | ||||||||||||||||||
590 | if (!ipv->isUndefined()) {
| 2-24 | ||||||||||||||||||
591 | d->disposeInitialPropertyValues(); | - | ||||||||||||||||||
592 | d->initialPropertyValues.set(args->v4engine(), ipv); | - | ||||||||||||||||||
593 | } executed 24 times by 3 tests: end of block Executed by:
| 24 | ||||||||||||||||||
594 | d->qmlCallingContext.set(scope.engine, scope.engine->qmlContext()); | - | ||||||||||||||||||
595 | - | |||||||||||||||||||
596 | setSource(sourceUrl, false); // already cleared and set ipv above. | - | ||||||||||||||||||
597 | } executed 26 times by 3 tests: end of block Executed by:
| 26 | ||||||||||||||||||
598 | - | |||||||||||||||||||
599 | void QQuickLoaderPrivate::disposeInitialPropertyValues() | - | ||||||||||||||||||
600 | { | - | ||||||||||||||||||
601 | } | - | ||||||||||||||||||
602 | - | |||||||||||||||||||
603 | void QQuickLoaderPrivate::load() | - | ||||||||||||||||||
604 | { | - | ||||||||||||||||||
605 | Q_Q(QQuickLoader); | - | ||||||||||||||||||
606 | - | |||||||||||||||||||
607 | if (!q->isComponentComplete() || !component)
| 0-386 | ||||||||||||||||||
608 | return; executed 62 times by 5 tests: return; Executed by:
| 62 | ||||||||||||||||||
609 | - | |||||||||||||||||||
610 | if (!component->isLoading()) {
| 40-284 | ||||||||||||||||||
611 | _q_sourceLoaded(); | - | ||||||||||||||||||
612 | } else { executed 284 times by 14 tests: end of block Executed by:
| 284 | ||||||||||||||||||
613 | QObject::connect(component, SIGNAL(statusChanged(QQmlComponent::Status)), | - | ||||||||||||||||||
614 | q, SLOT(_q_sourceLoaded())); | - | ||||||||||||||||||
615 | QObject::connect(component, SIGNAL(progressChanged(qreal)), | - | ||||||||||||||||||
616 | q, SIGNAL(progressChanged())); | - | ||||||||||||||||||
617 | emit q->statusChanged(); | - | ||||||||||||||||||
618 | emit q->progressChanged(); | - | ||||||||||||||||||
619 | if (loadingFromSource)
| 0-40 | ||||||||||||||||||
620 | emit q->sourceChanged(); executed 40 times by 3 tests: q->sourceChanged(); Executed by:
| 40 | ||||||||||||||||||
621 | else | - | ||||||||||||||||||
622 | emit q->sourceComponentChanged(); never executed: q->sourceComponentChanged(); | 0 | ||||||||||||||||||
623 | emit q->itemChanged(); | - | ||||||||||||||||||
624 | } executed 40 times by 3 tests: end of block Executed by:
| 40 | ||||||||||||||||||
625 | } | - | ||||||||||||||||||
626 | - | |||||||||||||||||||
627 | void QQuickLoaderIncubator::setInitialState(QObject *o) | - | ||||||||||||||||||
628 | { | - | ||||||||||||||||||
629 | loader->setInitialState(o); | - | ||||||||||||||||||
630 | } executed 296 times by 14 tests: end of block Executed by:
| 296 | ||||||||||||||||||
631 | - | |||||||||||||||||||
632 | void QQuickLoaderPrivate::setInitialState(QObject *obj) | - | ||||||||||||||||||
633 | { | - | ||||||||||||||||||
634 | Q_Q(QQuickLoader); | - | ||||||||||||||||||
635 | - | |||||||||||||||||||
636 | QQuickItem *item = qmlobject_cast<QQuickItem*>(obj); | - | ||||||||||||||||||
637 | if (item) {
| 8-288 | ||||||||||||||||||
638 | // If the item doesn't have an explicit size, but the Loader | - | ||||||||||||||||||
639 | // does, then set the item's size now before bindings are | - | ||||||||||||||||||
640 | // evaluated, otherwise we will end up resizing the item | - | ||||||||||||||||||
641 | // later and triggering any affected bindings/anchors. | - | ||||||||||||||||||
642 | if (widthValid && !QQuickItemPrivate::get(item)->widthValid)
| 16-212 | ||||||||||||||||||
643 | item->setWidth(q->width()); executed 60 times by 7 tests: item->setWidth(q->width()); Executed by:
| 60 | ||||||||||||||||||
644 | if (heightValid && !QQuickItemPrivate::get(item)->heightValid)
| 20-208 | ||||||||||||||||||
645 | item->setHeight(q->height()); executed 60 times by 7 tests: item->setHeight(q->height()); Executed by:
| 60 | ||||||||||||||||||
646 | item->setParentItem(q); | - | ||||||||||||||||||
647 | } executed 288 times by 14 tests: end of block Executed by:
| 288 | ||||||||||||||||||
648 | if (obj) {
| 0-296 | ||||||||||||||||||
649 | QQml_setParent_noEvent(itemContext, obj); | - | ||||||||||||||||||
650 | QQml_setParent_noEvent(obj, q); | - | ||||||||||||||||||
651 | itemContext = nullptr; | - | ||||||||||||||||||
652 | } executed 296 times by 14 tests: end of block Executed by:
| 296 | ||||||||||||||||||
653 | - | |||||||||||||||||||
654 | if (initialPropertyValues.isUndefined())
| 18-278 | ||||||||||||||||||
655 | return; executed 278 times by 14 tests: return; Executed by:
| 278 | ||||||||||||||||||
656 | - | |||||||||||||||||||
657 | QQmlComponentPrivate *d = QQmlComponentPrivate::get(component); | - | ||||||||||||||||||
658 | Q_ASSERT(d && d->engine); | - | ||||||||||||||||||
659 | QV4::ExecutionEngine *v4 = d->engine->handle(); | - | ||||||||||||||||||
660 | Q_ASSERT(v4); | - | ||||||||||||||||||
661 | QV4::Scope scope(v4); | - | ||||||||||||||||||
662 | QV4::ScopedValue ipv(scope, initialPropertyValues.value()); | - | ||||||||||||||||||
663 | QV4::Scoped<QV4::QmlContext> qmlContext(scope, qmlCallingContext.value()); | - | ||||||||||||||||||
664 | d->initializeObjectWithInitialProperties(qmlContext, ipv, obj); | - | ||||||||||||||||||
665 | } executed 18 times by 3 tests: end of block Executed by:
| 18 | ||||||||||||||||||
666 | - | |||||||||||||||||||
667 | void QQuickLoaderIncubator::statusChanged(Status status) | - | ||||||||||||||||||
668 | { | - | ||||||||||||||||||
669 | loader->incubatorStateChanged(status); | - | ||||||||||||||||||
670 | } executed 902 times by 14 tests: end of block Executed by:
| 902 | ||||||||||||||||||
671 | - | |||||||||||||||||||
672 | void QQuickLoaderPrivate::incubatorStateChanged(QQmlIncubator::Status status) | - | ||||||||||||||||||
673 | { | - | ||||||||||||||||||
674 | Q_Q(QQuickLoader); | - | ||||||||||||||||||
675 | if (status == QQmlIncubator::Loading || status == QQmlIncubator::Null)
| 296-598 | ||||||||||||||||||
676 | return; executed 606 times by 14 tests: return; Executed by:
| 606 | ||||||||||||||||||
677 | - | |||||||||||||||||||
678 | if (status == QQmlIncubator::Ready) {
| 2-294 | ||||||||||||||||||
679 | object = incubator->object(); | - | ||||||||||||||||||
680 | item = qmlobject_cast<QQuickItem*>(object); | - | ||||||||||||||||||
681 | if (!item) {
| 8-286 | ||||||||||||||||||
682 | QQuickWindow *window = qmlobject_cast<QQuickWindow*>(object); | - | ||||||||||||||||||
683 | if (window) {
| 2-6 | ||||||||||||||||||
684 | qCDebug(lcTransient) << window << "is transient for" << q->window(); never executed: QMessageLogger(__FILE__, 684, __PRETTY_FUNCTION__, lcTransient().categoryName()).debug() << window << "is transient for" << q->window();
| 0-2 | ||||||||||||||||||
685 | window->setTransientParent(q->window()); | - | ||||||||||||||||||
686 | } executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||||||||
687 | } executed 8 times by 2 tests: end of block Executed by:
| 8 | ||||||||||||||||||
688 | emit q->itemChanged(); | - | ||||||||||||||||||
689 | initResize(); | - | ||||||||||||||||||
690 | incubator->clear(); | - | ||||||||||||||||||
691 | } else if (status == QQmlIncubator::Error) { executed 294 times by 14 tests: end of block Executed by:
| 0-294 | ||||||||||||||||||
692 | if (!incubator->errors().isEmpty())
| 0-2 | ||||||||||||||||||
693 | QQmlEnginePrivate::warning(qmlEngine(q), incubator->errors()); executed 2 times by 1 test: QQmlEnginePrivate::warning(qmlEngine(q), incubator->errors()); Executed by:
| 2 | ||||||||||||||||||
694 | delete itemContext; | - | ||||||||||||||||||
695 | itemContext = nullptr; | - | ||||||||||||||||||
696 | delete incubator->object(); | - | ||||||||||||||||||
697 | source = QUrl(); | - | ||||||||||||||||||
698 | emit q->itemChanged(); | - | ||||||||||||||||||
699 | } executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||||||||
700 | if (loadingFromSource)
| 134-162 | ||||||||||||||||||
701 | emit q->sourceChanged(); executed 134 times by 5 tests: q->sourceChanged(); Executed by:
| 134 | ||||||||||||||||||
702 | else | - | ||||||||||||||||||
703 | emit q->sourceComponentChanged(); executed 162 times by 12 tests: q->sourceComponentChanged(); Executed by:
| 162 | ||||||||||||||||||
704 | emit q->statusChanged(); | - | ||||||||||||||||||
705 | emit q->progressChanged(); | - | ||||||||||||||||||
706 | if (status == QQmlIncubator::Ready)
| 2-294 | ||||||||||||||||||
707 | emit q->loaded(); executed 294 times by 14 tests: q->loaded(); Executed by:
| 294 | ||||||||||||||||||
708 | disposeInitialPropertyValues(); // cleanup | - | ||||||||||||||||||
709 | } executed 296 times by 14 tests: end of block Executed by:
| 296 | ||||||||||||||||||
710 | - | |||||||||||||||||||
711 | void QQuickLoaderPrivate::_q_sourceLoaded() | - | ||||||||||||||||||
712 | { | - | ||||||||||||||||||
713 | Q_Q(QQuickLoader); | - | ||||||||||||||||||
714 | if (!component || !component->errors().isEmpty()) {
| 0-316 | ||||||||||||||||||
715 | if (component)
| 0-12 | ||||||||||||||||||
716 | QQmlEnginePrivate::warning(qmlEngine(q), component->errors()); executed 12 times by 1 test: QQmlEnginePrivate::warning(qmlEngine(q), component->errors()); Executed by:
| 12 | ||||||||||||||||||
717 | if (loadingFromSource)
| 0-12 | ||||||||||||||||||
718 | emit q->sourceChanged(); executed 12 times by 1 test: q->sourceChanged(); Executed by:
| 12 | ||||||||||||||||||
719 | else | - | ||||||||||||||||||
720 | emit q->sourceComponentChanged(); never executed: q->sourceComponentChanged(); | 0 | ||||||||||||||||||
721 | emit q->statusChanged(); | - | ||||||||||||||||||
722 | emit q->progressChanged(); | - | ||||||||||||||||||
723 | emit q->itemChanged(); //Like clearing source, emit itemChanged even if previous item was also null | - | ||||||||||||||||||
724 | disposeInitialPropertyValues(); // cleanup | - | ||||||||||||||||||
725 | return; executed 12 times by 1 test: return; Executed by:
| 12 | ||||||||||||||||||
726 | } | - | ||||||||||||||||||
727 | - | |||||||||||||||||||
728 | QQmlContext *creationContext = component->creationContext(); | - | ||||||||||||||||||
729 | if (!creationContext) creationContext = qmlContext(q); executed 142 times by 5 tests: creationContext = qmlContext(q); Executed by:
| 142-162 | ||||||||||||||||||
730 | itemContext = new QQmlContext(creationContext); | - | ||||||||||||||||||
731 | itemContext->setContextObject(q); | - | ||||||||||||||||||
732 | - | |||||||||||||||||||
733 | delete incubator; | - | ||||||||||||||||||
734 | incubator = new QQuickLoaderIncubator(this, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested); | - | ||||||||||||||||||
735 | - | |||||||||||||||||||
736 | component->create(*incubator, itemContext); | - | ||||||||||||||||||
737 | - | |||||||||||||||||||
738 | if (incubator && incubator->status() == QQmlIncubator::Loading)
| 0-304 | ||||||||||||||||||
739 | emit q->statusChanged(); executed 32 times by 6 tests: q->statusChanged(); Executed by:
| 32 | ||||||||||||||||||
740 | } executed 304 times by 14 tests: end of block Executed by:
| 304 | ||||||||||||||||||
741 | - | |||||||||||||||||||
742 | /*! | - | ||||||||||||||||||
743 | \qmlproperty enumeration QtQuick::Loader::status | - | ||||||||||||||||||
744 | - | |||||||||||||||||||
745 | This property holds the status of QML loading. It can be one of: | - | ||||||||||||||||||
746 | \list | - | ||||||||||||||||||
747 | \li Loader.Null - the loader is inactive or no QML source has been set | - | ||||||||||||||||||
748 | \li Loader.Ready - the QML source has been loaded | - | ||||||||||||||||||
749 | \li Loader.Loading - the QML source is currently being loaded | - | ||||||||||||||||||
750 | \li Loader.Error - an error occurred while loading the QML source | - | ||||||||||||||||||
751 | \endlist | - | ||||||||||||||||||
752 | - | |||||||||||||||||||
753 | Use this status to provide an update or respond to the status change in some way. | - | ||||||||||||||||||
754 | For example, you could: | - | ||||||||||||||||||
755 | - | |||||||||||||||||||
756 | \list | - | ||||||||||||||||||
757 | \li Trigger a state change: | - | ||||||||||||||||||
758 | \qml | - | ||||||||||||||||||
759 | State { name: 'loaded'; when: loader.status == Loader.Ready } | - | ||||||||||||||||||
760 | \endqml | - | ||||||||||||||||||
761 | - | |||||||||||||||||||
762 | \li Implement an \c onStatusChanged signal handler: | - | ||||||||||||||||||
763 | \qml | - | ||||||||||||||||||
764 | Loader { | - | ||||||||||||||||||
765 | id: loader | - | ||||||||||||||||||
766 | onStatusChanged: if (loader.status == Loader.Ready) console.log('Loaded') | - | ||||||||||||||||||
767 | } | - | ||||||||||||||||||
768 | \endqml | - | ||||||||||||||||||
769 | - | |||||||||||||||||||
770 | \li Bind to the status value: | - | ||||||||||||||||||
771 | \qml | - | ||||||||||||||||||
772 | Text { text: loader.status == Loader.Ready ? 'Loaded' : 'Not loaded' } | - | ||||||||||||||||||
773 | \endqml | - | ||||||||||||||||||
774 | \endlist | - | ||||||||||||||||||
775 | - | |||||||||||||||||||
776 | Note that if the source is a local file, the status will initially be Ready (or Error). While | - | ||||||||||||||||||
777 | there will be no onStatusChanged signal in that case, the onLoaded will still be invoked. | - | ||||||||||||||||||
778 | - | |||||||||||||||||||
779 | \sa progress | - | ||||||||||||||||||
780 | */ | - | ||||||||||||||||||
781 | - | |||||||||||||||||||
782 | QQuickLoader::Status QQuickLoader::status() const | - | ||||||||||||||||||
783 | { | - | ||||||||||||||||||
784 | Q_D(const QQuickLoader); | - | ||||||||||||||||||
785 | - | |||||||||||||||||||
786 | if (!d->active)
| 2-150 | ||||||||||||||||||
787 | return Null; executed 2 times by 1 test: return Null; Executed by:
| 2 | ||||||||||||||||||
788 | - | |||||||||||||||||||
789 | if (d->component) {
| 18-132 | ||||||||||||||||||
790 | switch (d->component->status()) { | - | ||||||||||||||||||
791 | case QQmlComponent::Loading: executed 24 times by 2 tests: case QQmlComponent::Loading: Executed by:
| 24 | ||||||||||||||||||
792 | return Loading; executed 24 times by 2 tests: return Loading; Executed by:
| 24 | ||||||||||||||||||
793 | case QQmlComponent::Error: executed 24 times by 1 test: case QQmlComponent::Error: Executed by:
| 24 | ||||||||||||||||||
794 | return Error; executed 24 times by 1 test: return Error; Executed by:
| 24 | ||||||||||||||||||
795 | case QQmlComponent::Null: never executed: case QQmlComponent::Null: | 0 | ||||||||||||||||||
796 | return Null; never executed: return Null; | 0 | ||||||||||||||||||
797 | default: executed 84 times by 5 tests: default: Executed by:
| 84 | ||||||||||||||||||
798 | break; executed 84 times by 5 tests: break; Executed by:
| 84 | ||||||||||||||||||
799 | } | - | ||||||||||||||||||
800 | } | - | ||||||||||||||||||
801 | - | |||||||||||||||||||
802 | if (d->incubator) {
| 12-90 | ||||||||||||||||||
803 | switch (d->incubator->status()) { | - | ||||||||||||||||||
804 | case QQmlIncubator::Loading: executed 6 times by 3 tests: case QQmlIncubator::Loading: Executed by:
| 6 | ||||||||||||||||||
805 | return Loading; executed 6 times by 3 tests: return Loading; Executed by:
| 6 | ||||||||||||||||||
806 | case QQmlIncubator::Error: never executed: case QQmlIncubator::Error: | 0 | ||||||||||||||||||
807 | return Error; never executed: return Error; | 0 | ||||||||||||||||||
808 | default: executed 84 times by 5 tests: default: Executed by:
| 84 | ||||||||||||||||||
809 | break; executed 84 times by 5 tests: break; Executed by:
| 84 | ||||||||||||||||||
810 | } | - | ||||||||||||||||||
811 | } | - | ||||||||||||||||||
812 | - | |||||||||||||||||||
813 | if (d->object)
| 20-76 | ||||||||||||||||||
814 | return Ready; executed 76 times by 5 tests: return Ready; Executed by:
| 76 | ||||||||||||||||||
815 | - | |||||||||||||||||||
816 | return d->source.isEmpty() ? Null : Error; executed 20 times by 3 tests: return d->source.isEmpty() ? Null : Error; Executed by:
| 20 | ||||||||||||||||||
817 | } | - | ||||||||||||||||||
818 | - | |||||||||||||||||||
819 | void QQuickLoader::componentComplete() | - | ||||||||||||||||||
820 | { | - | ||||||||||||||||||
821 | Q_D(QQuickLoader); | - | ||||||||||||||||||
822 | QQuickItem::componentComplete(); | - | ||||||||||||||||||
823 | if (active()) {
| 18-302 | ||||||||||||||||||
824 | if (d->loadingFromSource) {
| 96-206 | ||||||||||||||||||
825 | QQmlComponent::CompilationMode mode = d->asynchronous ? QQmlComponent::Asynchronous : QQmlComponent::PreferSynchronous;
| 16-80 | ||||||||||||||||||
826 | d->component.setObject(new QQmlComponent(qmlEngine(this), d->source, mode, this), this); | - | ||||||||||||||||||
827 | } executed 96 times by 4 tests: end of block Executed by:
| 96 | ||||||||||||||||||
828 | d->load(); | - | ||||||||||||||||||
829 | } executed 302 times by 14 tests: end of block Executed by:
| 302 | ||||||||||||||||||
830 | } executed 320 times by 14 tests: end of block Executed by:
| 320 | ||||||||||||||||||
831 | - | |||||||||||||||||||
832 | void QQuickLoader::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) | - | ||||||||||||||||||
833 | { | - | ||||||||||||||||||
834 | if (change == ItemSceneChange) {
| 314-1098 | ||||||||||||||||||
835 | QQuickWindow *loadedWindow = qmlobject_cast<QQuickWindow *>(item()); | - | ||||||||||||||||||
836 | if (loadedWindow) {
| 4-310 | ||||||||||||||||||
837 | qCDebug(lcTransient) << loadedWindow << "is transient for" << value.window; never executed: QMessageLogger(__FILE__, 837, __PRETTY_FUNCTION__, lcTransient().categoryName()).debug() << loadedWindow << "is transient for" << value.window;
| 0-4 | ||||||||||||||||||
838 | loadedWindow->setTransientParent(value.window); | - | ||||||||||||||||||
839 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||
840 | } executed 314 times by 11 tests: end of block Executed by:
| 314 | ||||||||||||||||||
841 | QQuickItem::itemChange(change, value); | - | ||||||||||||||||||
842 | } executed 1412 times by 14 tests: end of block Executed by:
| 1412 | ||||||||||||||||||
843 | - | |||||||||||||||||||
844 | /*! | - | ||||||||||||||||||
845 | \qmlsignal QtQuick::Loader::loaded() | - | ||||||||||||||||||
846 | - | |||||||||||||||||||
847 | This signal is emitted when the \l status becomes \c Loader.Ready, or on successful | - | ||||||||||||||||||
848 | initial load. | - | ||||||||||||||||||
849 | - | |||||||||||||||||||
850 | The corresponding handler is \c onLoaded. | - | ||||||||||||||||||
851 | */ | - | ||||||||||||||||||
852 | - | |||||||||||||||||||
853 | - | |||||||||||||||||||
854 | /*! | - | ||||||||||||||||||
855 | \qmlproperty real QtQuick::Loader::progress | - | ||||||||||||||||||
856 | - | |||||||||||||||||||
857 | This property holds the progress of loading QML data from the network, from | - | ||||||||||||||||||
858 | 0.0 (nothing loaded) to 1.0 (finished). Most QML files are quite small, so | - | ||||||||||||||||||
859 | this value will rapidly change from 0 to 1. | - | ||||||||||||||||||
860 | - | |||||||||||||||||||
861 | \sa status | - | ||||||||||||||||||
862 | */ | - | ||||||||||||||||||
863 | qreal QQuickLoader::progress() const | - | ||||||||||||||||||
864 | { | - | ||||||||||||||||||
865 | Q_D(const QQuickLoader); | - | ||||||||||||||||||
866 | - | |||||||||||||||||||
867 | if (d->object)
| 38-44 | ||||||||||||||||||
868 | return 1.0; executed 44 times by 2 tests: return 1.0; Executed by:
| 44 | ||||||||||||||||||
869 | - | |||||||||||||||||||
870 | if (d->component)
| 14-24 | ||||||||||||||||||
871 | return d->component->progress(); executed 24 times by 1 test: return d->component->progress(); Executed by:
| 24 | ||||||||||||||||||
872 | - | |||||||||||||||||||
873 | return 0.0; executed 14 times by 1 test: return 0.0; Executed by:
| 14 | ||||||||||||||||||
874 | } | - | ||||||||||||||||||
875 | - | |||||||||||||||||||
876 | /*! | - | ||||||||||||||||||
877 | \qmlproperty bool QtQuick::Loader::asynchronous | - | ||||||||||||||||||
878 | - | |||||||||||||||||||
879 | This property holds whether the component will be instantiated asynchronously. | - | ||||||||||||||||||
880 | By default it is \c false. | - | ||||||||||||||||||
881 | - | |||||||||||||||||||
882 | When used in conjunction with the \l source property, loading and compilation | - | ||||||||||||||||||
883 | will also be performed in a background thread. | - | ||||||||||||||||||
884 | - | |||||||||||||||||||
885 | Loading asynchronously creates the objects declared by the component | - | ||||||||||||||||||
886 | across multiple frames, and reduces the | - | ||||||||||||||||||
887 | likelihood of glitches in animation. When loading asynchronously the status | - | ||||||||||||||||||
888 | will change to Loader.Loading. Once the entire component has been created, the | - | ||||||||||||||||||
889 | \l item will be available and the status will change to Loader.Ready. | - | ||||||||||||||||||
890 | - | |||||||||||||||||||
891 | Changing the value of this property to \c false while an asynchronous load is in | - | ||||||||||||||||||
892 | progress will force immediate, synchronous completion. This allows beginning an | - | ||||||||||||||||||
893 | asynchronous load and then forcing completion if the Loader content must be | - | ||||||||||||||||||
894 | accessed before the asynchronous load has completed. | - | ||||||||||||||||||
895 | - | |||||||||||||||||||
896 | To avoid seeing the items loading progressively set \c visible appropriately, e.g. | - | ||||||||||||||||||
897 | - | |||||||||||||||||||
898 | \code | - | ||||||||||||||||||
899 | Loader { | - | ||||||||||||||||||
900 | source: "mycomponent.qml" | - | ||||||||||||||||||
901 | asynchronous: true | - | ||||||||||||||||||
902 | visible: status == Loader.Ready | - | ||||||||||||||||||
903 | } | - | ||||||||||||||||||
904 | \endcode | - | ||||||||||||||||||
905 | - | |||||||||||||||||||
906 | Note that this property affects object instantiation only; it is unrelated to | - | ||||||||||||||||||
907 | loading a component asynchronously via a network. | - | ||||||||||||||||||
908 | */ | - | ||||||||||||||||||
909 | bool QQuickLoader::asynchronous() const | - | ||||||||||||||||||
910 | { | - | ||||||||||||||||||
911 | Q_D(const QQuickLoader); | - | ||||||||||||||||||
912 | return d->asynchronous; never executed: return d->asynchronous; | 0 | ||||||||||||||||||
913 | } | - | ||||||||||||||||||
914 | - | |||||||||||||||||||
915 | void QQuickLoader::setAsynchronous(bool a) | - | ||||||||||||||||||
916 | { | - | ||||||||||||||||||
917 | Q_D(QQuickLoader); | - | ||||||||||||||||||
918 | if (d->asynchronous == a)
| 2-50 | ||||||||||||||||||
919 | return; executed 2 times by 1 test: return; Executed by:
| 2 | ||||||||||||||||||
920 | - | |||||||||||||||||||
921 | d->asynchronous = a; | - | ||||||||||||||||||
922 | - | |||||||||||||||||||
923 | if (!d->asynchronous && isComponentComplete() && d->active) {
| 0-46 | ||||||||||||||||||
924 | if (d->loadingFromSource && d->component && d->component->isLoading()) {
| 0-4 | ||||||||||||||||||
925 | // Force a synchronous component load | - | ||||||||||||||||||
926 | QUrl currentSource = d->source; | - | ||||||||||||||||||
927 | d->clear(); | - | ||||||||||||||||||
928 | d->source = currentSource; | - | ||||||||||||||||||
929 | loadFromSource(); | - | ||||||||||||||||||
930 | } else if (d->incubator && d->incubator->isLoading()) { executed 2 times by 1 test: end of block Executed by:
| 0-2 | ||||||||||||||||||
931 | d->incubator->forceCompletion(); | - | ||||||||||||||||||
932 | } executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||||||||
933 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||
934 | - | |||||||||||||||||||
935 | emit asynchronousChanged(); | - | ||||||||||||||||||
936 | } executed 50 times by 7 tests: end of block Executed by:
| 50 | ||||||||||||||||||
937 | - | |||||||||||||||||||
938 | void QQuickLoaderPrivate::_q_updateSize(bool loaderGeometryChanged) | - | ||||||||||||||||||
939 | { | - | ||||||||||||||||||
940 | Q_Q(QQuickLoader); | - | ||||||||||||||||||
941 | if (!item)
| 114-714 | ||||||||||||||||||
942 | return; executed 114 times by 9 tests: return; Executed by:
| 114 | ||||||||||||||||||
943 | - | |||||||||||||||||||
944 | const bool needToUpdateWidth = loaderGeometryChanged && q->widthValid();
| 118-596 | ||||||||||||||||||
945 | const bool needToUpdateHeight = loaderGeometryChanged && q->heightValid();
| 118-596 | ||||||||||||||||||
946 | - | |||||||||||||||||||
947 | if (needToUpdateWidth && needToUpdateHeight)
| 2-554 | ||||||||||||||||||
948 | item->setSize(QSizeF(q->width(), q->height())); executed 158 times by 9 tests: item->setSize(QSizeF(q->width(), q->height())); Executed by:
| 158 | ||||||||||||||||||
949 | else if (needToUpdateWidth)
| 2-554 | ||||||||||||||||||
950 | item->setWidth(q->width()); executed 2 times by 1 test: item->setWidth(q->width()); Executed by:
| 2 | ||||||||||||||||||
951 | else if (needToUpdateHeight)
| 12-542 | ||||||||||||||||||
952 | item->setHeight(q->height()); executed 12 times by 1 test: item->setHeight(q->height()); Executed by:
| 12 | ||||||||||||||||||
953 | - | |||||||||||||||||||
954 | if (updatingSize)
| 184-530 | ||||||||||||||||||
955 | return; executed 184 times by 6 tests: return; Executed by:
| 184 | ||||||||||||||||||
956 | - | |||||||||||||||||||
957 | updatingSize = true; | - | ||||||||||||||||||
958 | - | |||||||||||||||||||
959 | q->setImplicitSize(getImplicitWidth(), getImplicitHeight()); | - | ||||||||||||||||||
960 | - | |||||||||||||||||||
961 | updatingSize = false; | - | ||||||||||||||||||
962 | } executed 530 times by 14 tests: end of block Executed by:
| 530 | ||||||||||||||||||
963 | - | |||||||||||||||||||
964 | /*! | - | ||||||||||||||||||
965 | \qmlproperty object QtQuick::Loader::item | - | ||||||||||||||||||
966 | This property holds the top-level object that is currently loaded. | - | ||||||||||||||||||
967 | - | |||||||||||||||||||
968 | Since \c {QtQuick 2.0}, Loader can load any object type. | - | ||||||||||||||||||
969 | */ | - | ||||||||||||||||||
970 | QObject *QQuickLoader::item() const | - | ||||||||||||||||||
971 | { | - | ||||||||||||||||||
972 | Q_D(const QQuickLoader); | - | ||||||||||||||||||
973 | return d->object; executed 684 times by 13 tests: return d->object; Executed by:
| 684 | ||||||||||||||||||
974 | } | - | ||||||||||||||||||
975 | - | |||||||||||||||||||
976 | void QQuickLoader::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) | - | ||||||||||||||||||
977 | { | - | ||||||||||||||||||
978 | Q_D(QQuickLoader); | - | ||||||||||||||||||
979 | if (newGeometry != oldGeometry) {
| 0-424 | ||||||||||||||||||
980 | d->_q_updateSize(); | - | ||||||||||||||||||
981 | } executed 424 times by 12 tests: end of block Executed by:
| 424 | ||||||||||||||||||
982 | QQuickItem::geometryChanged(newGeometry, oldGeometry); | - | ||||||||||||||||||
983 | } executed 424 times by 12 tests: end of block Executed by:
| 424 | ||||||||||||||||||
984 | - | |||||||||||||||||||
985 | QUrl QQuickLoaderPrivate::resolveSourceUrl(QQmlV4Function *args) | - | ||||||||||||||||||
986 | { | - | ||||||||||||||||||
987 | QV4::Scope scope(args->v4engine()); | - | ||||||||||||||||||
988 | QV4::ScopedValue v(scope, (*args)[0]); | - | ||||||||||||||||||
989 | QString arg = v->toQString(); | - | ||||||||||||||||||
990 | if (arg.isEmpty())
| 0-26 | ||||||||||||||||||
991 | return QUrl(); never executed: return QUrl(); | 0 | ||||||||||||||||||
992 | - | |||||||||||||||||||
993 | QQmlContextData *context = scope.engine->callingQmlContext(); | - | ||||||||||||||||||
994 | Q_ASSERT(context); | - | ||||||||||||||||||
995 | return context->resolvedUrl(QUrl(arg)); executed 26 times by 3 tests: return context->resolvedUrl(QUrl(arg)); Executed by:
| 26 | ||||||||||||||||||
996 | } | - | ||||||||||||||||||
997 | - | |||||||||||||||||||
998 | QV4::ReturnedValue QQuickLoaderPrivate::extractInitialPropertyValues(QQmlV4Function *args, QObject *loader, bool *error) | - | ||||||||||||||||||
999 | { | - | ||||||||||||||||||
1000 | QV4::Scope scope(args->v4engine()); | - | ||||||||||||||||||
1001 | QV4::ScopedValue valuemap(scope, QV4::Primitive::undefinedValue()); | - | ||||||||||||||||||
1002 | if (args->length() >= 2) {
| 2-28 | ||||||||||||||||||
1003 | QV4::ScopedValue v(scope, (*args)[1]); | - | ||||||||||||||||||
1004 | if (!v->isObject() || v->as<QV4::ArrayObject>()) {
| 0-24 | ||||||||||||||||||
1005 | *error = true; | - | ||||||||||||||||||
1006 | qmlWarning(loader) << QQuickLoader::tr("setSource: value is not an object"); | - | ||||||||||||||||||
1007 | } else { executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||
1008 | *error = false; | - | ||||||||||||||||||
1009 | valuemap = v; | - | ||||||||||||||||||
1010 | } executed 24 times by 3 tests: end of block Executed by:
| 24 | ||||||||||||||||||
1011 | } | - | ||||||||||||||||||
1012 | - | |||||||||||||||||||
1013 | return valuemap->asReturnedValue(); executed 30 times by 3 tests: return valuemap->asReturnedValue(); Executed by:
| 30 | ||||||||||||||||||
1014 | } | - | ||||||||||||||||||
1015 | - | |||||||||||||||||||
1016 | #include <moc_qquickloader_p.cpp> | - | ||||||||||||||||||
1017 | - | |||||||||||||||||||
1018 | QT_END_NAMESPACE | - | ||||||||||||||||||
Source code | Switch to Preprocessed file |