diff options
-rw-r--r-- | src/imports/multimedia/multimedia.cpp | 8 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativemultimediaglobal.cpp | 52 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativemultimediaglobal_p.h | 26 |
3 files changed, 43 insertions, 43 deletions
diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp index 80dc4f82c..a71c6f1c2 100644 --- a/src/imports/multimedia/multimedia.cpp +++ b/src/imports/multimedia/multimedia.cpp @@ -57,6 +57,12 @@ QML_DECLARE_TYPE(QSoundEffect) QT_BEGIN_NAMESPACE +static QObject *multimedia_global_object(QQmlEngine *qmlEngine, QJSEngine *jsEngine) +{ + Q_UNUSED(qmlEngine) + return new QDeclarativeMultimediaGlobal(jsEngine); +} + class QMultimediaDeclarativeModule : public QQmlExtensionPlugin { Q_OBJECT @@ -98,7 +104,7 @@ public: qmlRegisterType<QSoundEffect>(uri, 5, 3, "SoundEffect"); // 5.4 types - qmlRegisterSingletonType(uri, 5, 4, "QtMultimedia", QDeclarativeMultimedia::initGlobalObject); + qmlRegisterSingletonType<QDeclarativeMultimediaGlobal>(uri, 5, 4, "QtMultimedia", multimedia_global_object); qmlRegisterRevision<QDeclarativeCamera, 1>(uri, 5, 4); qmlRegisterUncreatableType<QDeclarativeCameraViewfinder>(uri, 5, 4, "CameraViewfinder", trUtf8("CameraViewfinder is provided by Camera")); diff --git a/src/imports/multimedia/qdeclarativemultimediaglobal.cpp b/src/imports/multimedia/qdeclarativemultimediaglobal.cpp index 37e429794..c6430427e 100644 --- a/src/imports/multimedia/qdeclarativemultimediaglobal.cpp +++ b/src/imports/multimedia/qdeclarativemultimediaglobal.cpp @@ -153,27 +153,6 @@ Camera { \endqml */ -namespace QDeclarativeMultimedia { - -#define FREEZE_SOURCE "(function deepFreeze(o) { "\ - " var prop, propKey;" \ - " Object.freeze(o);" \ - " for (propKey in o) {" \ - " prop = o[propKey];" \ - " if (!o.hasOwnProperty(propKey) || !(typeof prop === \"object\") || " \ - " Object.isFrozen(prop)) {" \ - " continue;" \ - " }" \ - " deepFreeze(prop);" \ - " }" \ - "})" - -static void deepFreeze(QJSEngine *jsEngine, const QJSValue &obj) -{ - QJSValue freezeFunc = jsEngine->evaluate(QString::fromUtf8(FREEZE_SOURCE)); - freezeFunc.call(QJSValueList() << obj); -} - static QJSValue cameraInfoToJSValue(QJSEngine *jsEngine, const QCameraInfo &camera) { QJSValue o = jsEngine->newObject(); @@ -184,29 +163,24 @@ static QJSValue cameraInfoToJSValue(QJSEngine *jsEngine, const QCameraInfo &came return o; } -QJSValue initGlobalObject(QQmlEngine *qmlEngine, QJSEngine *jsEngine) +QDeclarativeMultimediaGlobal::QDeclarativeMultimediaGlobal(QJSEngine *engine, QObject *parent) + : QObject(parent) + , m_engine(engine) { - Q_UNUSED(qmlEngine) - - QJSValue globalObject = jsEngine->newObject(); +} - // property object defaultCamera - globalObject.setProperty(QStringLiteral("defaultCamera"), - cameraInfoToJSValue(jsEngine, QCameraInfo::defaultCamera())); +QJSValue QDeclarativeMultimediaGlobal::defaultCamera() const +{ + return cameraInfoToJSValue(m_engine, QCameraInfo::defaultCamera()); +} - // property list<object> availableCameras +QJSValue QDeclarativeMultimediaGlobal::availableCameras() const +{ QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); - QJSValue availableCameras = jsEngine->newArray(cameras.count()); + QJSValue availableCameras = m_engine->newArray(cameras.count()); for (int i = 0; i < cameras.count(); ++i) - availableCameras.setProperty(i, cameraInfoToJSValue(jsEngine, cameras.at(i))); - globalObject.setProperty(QStringLiteral("availableCameras"), availableCameras); - - // freeze global object to prevent properties to be modified from QML - deepFreeze(jsEngine, globalObject); - - return globalObject; -} - + availableCameras.setProperty(i, cameraInfoToJSValue(m_engine, cameras.at(i))); + return availableCameras; } QT_END_NAMESPACE diff --git a/src/imports/multimedia/qdeclarativemultimediaglobal_p.h b/src/imports/multimedia/qdeclarativemultimediaglobal_p.h index 6c4dba7f4..192874c23 100644 --- a/src/imports/multimedia/qdeclarativemultimediaglobal_p.h +++ b/src/imports/multimedia/qdeclarativemultimediaglobal_p.h @@ -46,12 +46,32 @@ // #include <QtQml/qqml.h> +#include <QtQml/qjsvalue.h> QT_BEGIN_NAMESPACE -namespace QDeclarativeMultimedia { - QJSValue initGlobalObject(QQmlEngine *, QJSEngine *); -} +class QDeclarativeMultimediaGlobal : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QJSValue defaultCamera READ defaultCamera NOTIFY defaultCameraChanged) + Q_PROPERTY(QJSValue availableCameras READ availableCameras NOTIFY availableCamerasChanged) + +public: + explicit QDeclarativeMultimediaGlobal(QJSEngine *engine, QObject *parent = 0); + + QJSValue defaultCamera() const; + QJSValue availableCameras() const; + +Q_SIGNALS: + // Unused at the moment. QCameraInfo doesn't notify when cameras are added or removed, + // but it might change in the future. + void defaultCameraChanged(); + void availableCamerasChanged(); + +private: + QJSEngine *m_engine; +}; QT_END_NAMESPACE |