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/qqmlfileselector.cpp | |
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/qqmlfileselector.cpp')
-rw-r--r-- | src/qml/qml/qqmlfileselector.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
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 |