Commit 318aec87 authored by Thomas Hartmann's avatar Thomas Hartmann
Browse files

QmlDesigner.PropertyEditor: Adding FileResourcesModel



This is a special StringList based model for files
in the project hierarchy.

Change-Id: Ie75961bdc0492febfab14c9b63be4bcec1bef1c6
Reviewed-by: default avatarThomas Hartmann <Thomas.Hartmann@digia.com>
parent dfacab0d
/****************************************************************************
**
** 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;
}
/****************************************************************************
**
** 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
......@@ -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
......
......@@ -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();
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment