// // Created by Bradley Austin Davis on 2016/01/27 // Copyright 2013-2016 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include "QmlOverlay.h" #include #include #include #include QmlOverlay::QmlOverlay(const QUrl& url) { buildQmlElement(url); } QmlOverlay::QmlOverlay(const QUrl& url, const QmlOverlay* overlay) : Overlay2D(overlay) { buildQmlElement(url); } void QmlOverlay::buildQmlElement(const QUrl& url) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "buildQmlElement", Q_ARG(QUrl, url)); return; } auto offscreenUi = DependencyManager::get(); offscreenUi->load(url, [=](QQmlContext* context, QObject* object) { _qmlElement = dynamic_cast(object); connect(_qmlElement, &QObject::destroyed, this, &QmlOverlay::qmlElementDestroyed); }); } void QmlOverlay::qmlElementDestroyed() { _qmlElement = nullptr; } QmlOverlay::~QmlOverlay() { if (_qmlElement) { _qmlElement->deleteLater(); } _qmlElement = nullptr; } // QmlOverlay replaces Overlay's properties with those defined in the QML file used but keeps Overlay2D's properties. void QmlOverlay::setProperties(const QVariantMap& properties) { Overlay2D::setProperties(properties); // check to see if qmlElement still exists if (_qmlElement) { _qmlElement->setX(_bounds.left()); _qmlElement->setY(_bounds.top()); _qmlElement->setWidth(_bounds.width()); _qmlElement->setHeight(_bounds.height()); _qmlElement->setVisible(_visible); QMetaObject::invokeMethod(_qmlElement, "updatePropertiesFromScript", Qt::DirectConnection, Q_ARG(QVariant, properties)); } }