diff options
author | Alan Alpert <aalpert@blackberry.com> | 2013-07-05 14:31:06 -0700 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-20 01:08:53 +0200 |
commit | 67ee1cd27b5e951e782e49edf382e8e7d8ee431f (patch) | |
tree | ccd28910830fedd30732156d350563c5a29ed762 /src/qml/qml | |
parent | a5052ea1e7286aee60e2e138a405d9864750db24 (diff) |
Apply file selectors to QQmlApplicationEngine apps
You can also manually apply them to a QQmlEngine using
setUrlInterceptor(new QQmlFileSelector(parent)), or using
your own QQmlAbstractUrlInterceptor subclass.
Change-Id: I0c0ff8b080c138686b3c03e0bc3b9f25bcd11a85
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qml.pri | 7 | ||||
-rw-r--r-- | src/qml/qml/qqmlapplicationengine.cpp | 7 | ||||
-rw-r--r-- | src/qml/qml/qqmlapplicationengine_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmlfileselector.cpp | 138 | ||||
-rw-r--r-- | src/qml/qml/qqmlfileselector.h | 71 | ||||
-rw-r--r-- | src/qml/qml/qqmlfileselector_p.h | 74 |
6 files changed, 293 insertions, 5 deletions
diff --git a/src/qml/qml/qml.pri b/src/qml/qml/qml.pri index 8dfe0f1d3b..29c007ad07 100644 --- a/src/qml/qml/qml.pri +++ b/src/qml/qml/qml.pri @@ -54,7 +54,8 @@ SOURCES += \ $$PWD/qqmllistwrapper.cpp \ $$PWD/qqmlcontextwrapper.cpp \ $$PWD/qqmlvaluetypewrapper.cpp \ - $$PWD/qqmltypewrapper.cpp + $$PWD/qqmltypewrapper.cpp \ + $$PWD/qqmlfileselector.cpp HEADERS += \ $$PWD/qqmlglobal_p.h \ @@ -130,7 +131,9 @@ HEADERS += \ $$PWD/qqmllistwrapper_p.h \ $$PWD/qqmlcontextwrapper_p.h \ $$PWD/qqmlvaluetypewrapper_p.h \ - $$PWD/qqmltypewrapper_p.h + $$PWD/qqmltypewrapper_p.h \ + $$PWD/qqmlfileselector_p.h \ + $$PWD/qqmlfileselector.h include(ftw/ftw.pri) include(v8/v8.pri) diff --git a/src/qml/qml/qqmlapplicationengine.cpp b/src/qml/qml/qqmlapplicationengine.cpp index 85aeaf5786..3f13f8a140 100644 --- a/src/qml/qml/qqmlapplicationengine.cpp +++ b/src/qml/qml/qqmlapplicationengine.cpp @@ -44,6 +44,7 @@ #include <QQmlComponent> #include "qqmlapplicationengine.h" #include "qqmlapplicationengine_p.h" +#include "qqmlfileselector.h" QT_BEGIN_NAMESPACE @@ -76,6 +77,7 @@ void QQmlApplicationEnginePrivate::init() QCoreApplication::installTranslator(qtTranslator); translators << qtTranslator; #endif + q->setUrlInterceptor(new QQmlFileSelector(q)); QCoreApplication::instance()->setProperty("__qml_using_qqmlapplicationengine", QVariant(true)); } @@ -172,13 +174,12 @@ void QQmlApplicationEnginePrivate::_q_finishLoad(QObject *o) \li Connecting Qt.quit() to QCoreApplication::quit() \li Automatically loads translation files from an i18n directory adjacent to the main QML file. \li Automatically sets an incubuation controller if the scene contains a QQuickWindow. + \li Automatically sets a \c QQmlFileSelector as the url interceptor, applying file selectors to all + QML files and assets. \endlist The engine behavior can be further tweaked by using the inherited methods from QQmlEngine. - \note In the future QQmlApplicationEngine may automatically apply file selectors. - To ensure forwards compatibility, do not use folder names containing a '+' character in your QML file - structure. */ /*! diff --git a/src/qml/qml/qqmlapplicationengine_p.h b/src/qml/qml/qqmlapplicationengine_p.h index cc38c62c02..75d7cf768f 100644 --- a/src/qml/qml/qqmlapplicationengine_p.h +++ b/src/qml/qml/qqmlapplicationengine_p.h @@ -63,6 +63,7 @@ QT_BEGIN_NAMESPACE class QTranslator; +class QFileSelector; class Q_QML_PRIVATE_EXPORT QQmlApplicationEnginePrivate : public QQmlEnginePrivate { Q_DECLARE_PUBLIC(QQmlApplicationEngine) diff --git a/src/qml/qml/qqmlfileselector.cpp b/src/qml/qml/qqmlfileselector.cpp new file mode 100644 index 0000000000..5810e269eb --- /dev/null +++ b/src/qml/qml/qqmlfileselector.cpp @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore/QFileSelector> +#include "qqmlfileselector.h" +#include "qqmlfileselector_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \class QQmlFileSelector + \since 5.2 + \inmodule QtQml + \brief A convenience class for applying a QFileSelector to QML file loading + + QQmlFileSelector is a QQmlAbstractUrlInterceptor which will automatically apply a QFileSelector to + qml file and asset paths. + + It is used as follows: + + \code + QQmlEngine engine; + QQmlFileSelector selector; + engine.setUrlInterceptor(&selector); + \endcode + + Then you can swap out files like so: + \code + main.qml + Component.qml + asset.png + +unix/Component.qml + +mac/asset.png + \endcode + + In this example, main.qml will normally use Component.qml for the Component type. However on a + unix platform, the unix selector will be present and the +unix/Component.qml version will be + used instead. Note that this acts like swapping out Component.qml with +unix/Component.qml, so + when using Component.qml you should not need to alter any paths based on which version was + selected. + + For example, to pass the "asset.png" file path around you would refer to it just as "asset.png" in + all of main.qml, Component.qml, and +linux/Component.qml. It will be replaced with +mac/asset.png + on Mac platforms in all cases. + + For a list of available selectors, see \c QFileSelector. + + Your platform may also provide additional selectors for you to use. As specified by QFileSelector, + directories used for selection must start with a '+' character, so you will not accidentally + trigger this feature unless you have directories with such names inside your project. + */ + +/*! + Creates a new QQmlFileSelector, which includes its own QFileSelector. +*/ + +QQmlFileSelector::QQmlFileSelector(QObject* parent) + : QObject(*(new QQmlFileSelectorPrivate), parent) +{ +} + +QQmlFileSelectorPrivate::QQmlFileSelectorPrivate() +{ + Q_Q(QQmlFileSelector); + ownSelector = true; + selector = new QFileSelector(q); +} + +/*! + Sets a different QFileSelector instance for use by the QQmlFileSelector. QQmlFileSelector does not + take ownership of the new QFileSelector. To reset QQmlFileSelector to use its internal + QFileSelector instance, call setSelector(0). +*/ + +void QQmlFileSelector::setSelector(QFileSelector *selector) +{ + Q_D(QQmlFileSelector); + if (selector) { + if (d->ownSelector) { + delete d->selector; + d->ownSelector = false; + } + d->selector = selector; + } else { + if (!d->ownSelector) { + d->ownSelector = true; + d->selector = new QFileSelector(this); + } // Do nothing if already using internal selector + } +} + +QUrl QQmlFileSelector::intercept(const QUrl &path, DataType type) +{ + Q_D(QQmlFileSelector); + if ( type == QQmlAbstractUrlInterceptor::QmldirFile ) //Don't intercept qmldir files, to prevent double interception + return path; + return d->selector->select(path); +} + +QT_END_NAMESPACE diff --git a/src/qml/qml/qqmlfileselector.h b/src/qml/qml/qqmlfileselector.h new file mode 100644 index 0000000000..0152ce292a --- /dev/null +++ b/src/qml/qml/qqmlfileselector.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQMLFILESELECTOR_H +#define QQMLFILESELECTOR_H + +#include <QtCore/QObject> +#include <QtCore/QUrl> +#include <QtQml/QQmlAbstractUrlInterceptor> +#include <qtqmlglobal.h> + +QT_BEGIN_NAMESPACE + +class QFileSelector; +class QQmlFileSelectorPrivate; +class Q_QML_EXPORT QQmlFileSelector : public QObject, public QQmlAbstractUrlInterceptor +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QQmlFileSelector) +public: + QQmlFileSelector(QObject* parent=0); + void setSelector(QFileSelector *selector); + +protected: + virtual QUrl intercept(const QUrl &path, DataType type); + +private: + Q_DISABLE_COPY(QQmlFileSelector) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/qml/qml/qqmlfileselector_p.h b/src/qml/qml/qqmlfileselector_p.h new file mode 100644 index 0000000000..60d6072c8c --- /dev/null +++ b/src/qml/qml/qqmlfileselector_p.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQMLFILESELECTOR_P_H +#define QQMLFILESELECTOR_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qqmlfileselector.h" +#include <private/qobject_p.h> +#include <private/qtqmlglobal_p.h> + +QT_BEGIN_NAMESPACE + +class QFileSelector; +class Q_QML_PRIVATE_EXPORT QQmlFileSelectorPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QQmlFileSelector) +public: + QQmlFileSelectorPrivate(); + QFileSelector* selector; + bool ownSelector; +}; + +QT_END_NAMESPACE + +#endif |