diff options
author | Thomas Hartmann <Thomas.Hartmann@digia.com> | 2013-11-01 16:29:32 +0100 |
---|---|---|
committer | Thomas Hartmann <Thomas.Hartmann@digia.com> | 2013-11-01 16:30:38 +0100 |
commit | 318aec875ecc03e30f945ef54decab864db89a2a (patch) | |
tree | 823d22b432ed0c983c11a1fe714f84356f1891c5 | |
parent | dfacab0d5528c495c769bf6e69d0f74746db9691 (diff) | |
download | qt-creator-318aec875ecc03e30f945ef54decab864db89a2a.tar.gz |
QmlDesigner.PropertyEditor: Adding FileResourcesModel
This is a special StringList based model for files
in the project hierarchy.
Change-Id: Ie75961bdc0492febfab14c9b63be4bcec1bef1c6
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
4 files changed, 262 insertions, 2 deletions
diff --git a/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.cpp new file mode 100644 index 0000000000..fb29dd6a9e --- /dev/null +++ b/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.cpp @@ -0,0 +1,166 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** 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. +** +****************************************************************************/ + +#include "fileresourcesmodel.h" + +#include <model.h> + +#include <QFileDialog> +#include <QDirIterator> +#include <qmlanchorbindingproxy.h> + +static QString s_lastBrowserPath; + +FileResourcesModel::FileResourcesModel(QObject *parent) : + QObject(parent), m_filter("(*.*)"), m_lock(false) +{ +} + +void FileResourcesModel::setAnchorBackend(const QVariant anchorBackend) +{ + + QObject* anchorBackendObject = anchorBackend.value<QObject*>(); + + const QmlDesigner::Internal::QmlAnchorBindingProxy *backendCasted = + qobject_cast<const QmlDesigner::Internal::QmlAnchorBindingProxy *>(anchorBackendObject); + + if (backendCasted) + m_path = backendCasted->getItemNode().modelNode().model()->fileUrl(); + + setupModel(); + emit anchorBackendChanged(); +} + +QString FileResourcesModel::fileName() const +{ + return m_fileName.toString(); +} + +void FileResourcesModel::setFileNameStr(const QString &fileName) +{ + setFileName(QUrl(fileName)); +} +void FileResourcesModel::setFileName(const QUrl &fileName) +{ + if (fileName == m_fileName) + return; + + m_fileName = fileName; + + emit fileNameChanged(fileName); +} + +void FileResourcesModel::setPath(const QUrl &url) +{ + m_path = url; + setupModel(); +} + +QUrl FileResourcesModel::path() const +{ + return m_path; +} + +void FileResourcesModel::setFilter(const QString &filter) +{ + m_filter = filter; +} + +QString FileResourcesModel::filter() const +{ + return m_filter; +} + +QStringList FileResourcesModel::fileModel() const +{ + return m_model; +} + +void FileResourcesModel::openFileDialog() +{ + QString modelPath; + + modelPath = m_path.toLocalFile(); + + m_lastModelPath = modelPath; + + bool documentChanged = m_lastModelPath == modelPath; + + //First we try the last path this browser widget was opened with + //if the document was not changed + QString path = documentChanged ? QString() : m_currentPath; + + + //If that one is not valid we try the path for the current file + if (path.isEmpty() && !m_fileName.isEmpty()) + path = QFileInfo(modelPath + QLatin1String("/") + m_fileName.toString()).absoluteDir().absolutePath(); + + + //Next we try to fall back to the path any file browser was opened with + if (!QFileInfo(path).exists()) + path = s_lastBrowserPath; + + //The last fallback is to try the path of the document + if (!QFileInfo(path).exists()) + path = modelPath; + + QString newFile = QFileDialog::getOpenFileName(0, tr("Open File"), path, m_filter); + + if (!newFile.isEmpty()) { + setFileNameStr(newFile); + + m_currentPath = QFileInfo(newFile).absolutePath(); + s_lastBrowserPath = m_currentPath; + } +} + +void FileResourcesModel::registerDeclarativeType() +{ + qmlRegisterType<FileResourcesModel>("HelperWidgets",2,0,"FileResourcesModel"); +} + +void FileResourcesModel::setupModel() +{ + m_lock = true; + m_model.clear(); + + QDir dir; + + dir = QFileInfo(m_path.toLocalFile()).dir(); + + QStringList filterList = m_filter.split(' '); + + QDirIterator it(dir.absolutePath(), filterList, QDir::Files, QDirIterator::Subdirectories); + while (it.hasNext()) { + QString absolutePath = it.next(); + m_model.append(dir.relativeFilePath(absolutePath)); + } + + m_lock = false; +} diff --git a/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.h b/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.h new file mode 100644 index 0000000000..a6a3fb069d --- /dev/null +++ b/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** 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. +** +****************************************************************************/ + +#ifndef FILERESOURCESMODEL_H +#define FILERESOURCESMODEL_H + +#include <qmlitemnode.h> + +#include <QObject> +#include <QStringList> +#include <QUrl> +#include <QtQml> + +class FileResourcesModel : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString fileName READ fileName WRITE setFileNameStr NOTIFY fileNameChanged) + Q_PROPERTY(QString filter READ filter WRITE setFilter) + Q_PROPERTY(QVariant anchorBackendProperty READ anchorBackend WRITE setAnchorBackend NOTIFY anchorBackendChanged) + Q_PROPERTY(QUrl path READ path WRITE setPath) + Q_PROPERTY(QStringList fileModel READ fileModel NOTIFY anchorBackendChanged) + +public: + explicit FileResourcesModel(QObject *parent = 0); + + void setAnchorBackend(const QVariant anchorBackend); + QString fileName() const; + void setFileName(const QUrl &fileName); + void setFileNameStr(const QString &fileName); + void setPath(const QUrl &url); + QUrl path() const; + void setFilter(const QString &filter); + QString filter() const; + QStringList fileModel() const; + void setupModel(); + + Q_INVOKABLE void openFileDialog(); + + static void registerDeclarativeType(); + +signals: + void fileNameChanged(const QUrl &fileName); + void anchorBackendChanged(); + +public slots: + +private: + QVariant anchorBackend() const {return QVariant(); } + +private: + QUrl m_fileName; + QUrl m_path; + QString m_filter; + bool m_lock; + QString m_currentPath; + QString m_lastModelPath; + QStringList m_model; + +}; + +QML_DECLARE_TYPE(FileResourcesModel) + +#endif // FILERESOURCESMODEL_H diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri index 61874b4252..3908f51c74 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri @@ -12,7 +12,8 @@ SOURCES += propertyeditorview.cpp \ quick2propertyeditorview.cpp \ gradientlineqmladaptor.cpp \ propertyeditorqmlbackend.cpp \ - propertyeditorwidget.cpp + propertyeditorwidget.cpp \ + fileresourcesmodel.cpp HEADERS += propertyeditorview.h \ qmlanchorbindingproxy.h \ @@ -27,7 +28,8 @@ HEADERS += propertyeditorview.h \ quick2propertyeditorview.h \ gradientlineqmladaptor.h \ propertyeditorqmlbackend.h \ - propertyeditorwidget.h + propertyeditorwidget.h \ + fileresourcesmodel.h QT += qml quick diff --git a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp index 4184dc1bc6..67dcef3c30 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp @@ -30,6 +30,7 @@ #include "quick2propertyeditorview.h" #include "propertyeditorvalue.h" +#include "fileresourcesmodel.h" #include <QVBoxLayout> @@ -106,6 +107,7 @@ void Quick2PropertyEditorView::registerQmlTypes() if (!declarativeTypesRegistered) { declarativeTypesRegistered = true; PropertyEditorValue::registerDeclarativeTypes(); + FileResourcesModel::registerDeclarativeType(); } } |