forked from qt-creator/qt-creator
New qml based .qmproject file format
This commit is contained in:
121
src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp
Normal file
121
src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp
Normal file
@@ -0,0 +1,121 @@
|
||||
#include "filefilteritems.h"
|
||||
#include <qdebug.h>
|
||||
|
||||
namespace QmlProjectManager {
|
||||
|
||||
FileFilterBaseItem::FileFilterBaseItem(QObject *parent) :
|
||||
QmlProjectContentItem(parent),
|
||||
m_recursive(false)
|
||||
{
|
||||
}
|
||||
|
||||
QString FileFilterBaseItem::directory() const
|
||||
{
|
||||
return m_rootDir;
|
||||
}
|
||||
|
||||
void FileFilterBaseItem::setDirectory(const QString &dirPath)
|
||||
{
|
||||
if (m_rootDir == dirPath)
|
||||
return;
|
||||
m_rootDir = dirPath;
|
||||
emit directoryChanged();
|
||||
|
||||
updateFileList();
|
||||
}
|
||||
|
||||
void FileFilterBaseItem::setDefaultDirectory(const QString &dirPath)
|
||||
{
|
||||
if (m_defaultDir == dirPath)
|
||||
return;
|
||||
m_defaultDir = dirPath;
|
||||
|
||||
updateFileList();
|
||||
}
|
||||
|
||||
QString FileFilterBaseItem::filter() const
|
||||
{
|
||||
return m_filter;
|
||||
}
|
||||
|
||||
void FileFilterBaseItem::setFilter(const QString &filter)
|
||||
{
|
||||
if (filter == m_filter)
|
||||
return;
|
||||
m_filter = filter;
|
||||
m_regex.setPattern(m_filter);
|
||||
m_regex.setPatternSyntax(QRegExp::Wildcard);
|
||||
|
||||
emit filterChanged();
|
||||
updateFileList();
|
||||
}
|
||||
|
||||
bool FileFilterBaseItem::recursive() const
|
||||
{
|
||||
return m_recursive;
|
||||
}
|
||||
|
||||
void FileFilterBaseItem::setRecursive(bool recursive)
|
||||
{
|
||||
if (recursive == m_recursive)
|
||||
return;
|
||||
m_recursive = recursive;
|
||||
updateFileList();
|
||||
}
|
||||
|
||||
QStringList FileFilterBaseItem::files() const
|
||||
{
|
||||
return m_files.toList();
|
||||
}
|
||||
|
||||
QString FileFilterBaseItem::absoluteDir() const
|
||||
{
|
||||
QString absoluteDir;
|
||||
if (QFileInfo(m_rootDir).isAbsolute()) {
|
||||
absoluteDir = m_rootDir;
|
||||
} else if (!m_defaultDir.isEmpty()) {
|
||||
absoluteDir = m_defaultDir + QLatin1Char('/') + m_rootDir;
|
||||
}
|
||||
|
||||
return absoluteDir;
|
||||
}
|
||||
|
||||
void FileFilterBaseItem::updateFileList()
|
||||
{
|
||||
const QString dir = absoluteDir();
|
||||
if (dir.isEmpty())
|
||||
return;
|
||||
|
||||
const QSet<QString> newFiles = filesInSubTree(QDir(m_defaultDir), QDir(dir));
|
||||
if (newFiles != m_files) {
|
||||
m_files = newFiles;
|
||||
emit filesChanged();
|
||||
}
|
||||
}
|
||||
|
||||
QSet<QString> FileFilterBaseItem::filesInSubTree(const QDir &rootDir, const QDir &dir)
|
||||
{
|
||||
QSet<QString> fileSet;
|
||||
|
||||
foreach (const QFileInfo &file, dir.entryInfoList(QDir::Files)) {
|
||||
if (m_regex.exactMatch(file.fileName()))
|
||||
fileSet.insert(rootDir.relativeFilePath(file.absoluteFilePath()));
|
||||
}
|
||||
|
||||
if (m_recursive) {
|
||||
foreach (const QFileInfo &subDir, dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) {
|
||||
fileSet += filesInSubTree(rootDir, QDir(subDir.absoluteFilePath()));
|
||||
}
|
||||
}
|
||||
return fileSet;
|
||||
}
|
||||
|
||||
QmlFileFilterItem::QmlFileFilterItem(QObject *parent)
|
||||
: FileFilterBaseItem(parent)
|
||||
{
|
||||
setFilter(QLatin1String("*.qml"));
|
||||
}
|
||||
|
||||
} // namespace QmlProjectManager
|
||||
|
||||
QML_DEFINE_TYPE(QmlProject,1,0,QmlFiles,QmlProjectManager::QmlFileFilterItem)
|
||||
72
src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
Normal file
72
src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
Normal file
@@ -0,0 +1,72 @@
|
||||
#ifndef FILEFILTERITEMS_H
|
||||
#define FILEFILTERITEMS_H
|
||||
|
||||
#include <QDir>
|
||||
#include <QObject>
|
||||
#include <QSet>
|
||||
#include <qml.h>
|
||||
|
||||
#include "qmlprojectitem.h"
|
||||
|
||||
namespace QmlProjectManager {
|
||||
|
||||
class FileFilterBaseItem : public QmlProjectContentItem {
|
||||
Q_OBJECT
|
||||
|
||||
Q_PROPERTY(QString directory READ directory WRITE setDirectory NOTIFY directoryChanged)
|
||||
Q_PROPERTY(bool recursive READ recursive WRITE setRecursive NOTIFY recursiveChanged)
|
||||
|
||||
Q_PROPERTY(QList<QString> files READ files NOTIFY filesChanged)
|
||||
|
||||
public:
|
||||
FileFilterBaseItem(QObject *parent = 0);
|
||||
|
||||
QString directory() const;
|
||||
void setDirectory(const QString &directoryPath);
|
||||
|
||||
void setDefaultDirectory(const QString &directoryPath);
|
||||
|
||||
QString filter() const;
|
||||
void setFilter(const QString &filter);
|
||||
|
||||
bool recursive() const;
|
||||
void setRecursive(bool recursive);
|
||||
|
||||
virtual QStringList files() const;
|
||||
|
||||
signals:
|
||||
void directoryChanged();
|
||||
void recursiveChanged();
|
||||
void filterChanged();
|
||||
void filesChanged();
|
||||
|
||||
private:
|
||||
QString absoluteDir() const;
|
||||
|
||||
void updateFileList();
|
||||
QSet<QString> filesInSubTree(const QDir &rootDir, const QDir &dir);
|
||||
|
||||
QString m_rootDir;
|
||||
QString m_defaultDir;
|
||||
|
||||
QString m_filter;
|
||||
QRegExp m_regex;
|
||||
bool m_recursive;
|
||||
|
||||
QSet<QString> m_files;
|
||||
|
||||
friend class ProjectItem;
|
||||
};
|
||||
|
||||
class QmlFileFilterItem : public FileFilterBaseItem {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QmlFileFilterItem(QObject *parent = 0);
|
||||
};
|
||||
|
||||
} // namespace QmlProjectManager
|
||||
|
||||
QML_DECLARE_TYPE(QmlProjectManager::QmlFileFilterItem)
|
||||
|
||||
#endif // FILEFILTERITEMS_HPROJECTITEM_H
|
||||
4
src/plugins/qmlprojectmanager/fileformat/fileformat.pri
Normal file
4
src/plugins/qmlprojectmanager/fileformat/fileformat.pri
Normal file
@@ -0,0 +1,4 @@
|
||||
HEADERS += $$PWD/qmlprojectitem.h \
|
||||
$$PWD/filefilteritems.h
|
||||
SOURCES += $$PWD/qmlprojectitem.cpp \
|
||||
$$PWD/filefilteritems.cpp
|
||||
101
src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
Normal file
101
src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
Normal file
@@ -0,0 +1,101 @@
|
||||
#include "qmlprojectitem.h"
|
||||
#include "filefilteritems.h"
|
||||
#include <qdebug.h>
|
||||
|
||||
namespace QmlProjectManager {
|
||||
|
||||
class QmlProjectItemPrivate : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QString sourceDirectory;
|
||||
|
||||
QList<QmlFileFilterItem*> qmlFileFilters() const;
|
||||
|
||||
// content property
|
||||
QmlConcreteList<QmlProjectContentItem*> content;
|
||||
};
|
||||
|
||||
QList<QmlFileFilterItem*> QmlProjectItemPrivate::qmlFileFilters() const
|
||||
{
|
||||
QList<QmlFileFilterItem*> qmlFilters;
|
||||
for (int i = 0; i < content.size(); ++i) {
|
||||
QmlProjectContentItem *contentElement = content.at(i);
|
||||
QmlFileFilterItem *qmlFileFilter = qobject_cast<QmlFileFilterItem*>(contentElement);
|
||||
if (qmlFileFilter) {
|
||||
qmlFilters << qmlFileFilter;
|
||||
}
|
||||
}
|
||||
return qmlFilters;
|
||||
}
|
||||
|
||||
QmlProjectItem::QmlProjectItem(QObject *parent) :
|
||||
QObject(parent),
|
||||
d_ptr(new QmlProjectItemPrivate)
|
||||
{
|
||||
// Q_D(QmlProjectItem);
|
||||
//
|
||||
// QmlFileFilter *defaultQmlFilter = new QmlFileFilter(this);
|
||||
// d->content.append(defaultQmlFilter);
|
||||
}
|
||||
|
||||
QmlProjectItem::~QmlProjectItem()
|
||||
{
|
||||
delete d_ptr;
|
||||
}
|
||||
|
||||
QmlList<QmlProjectContentItem*> *QmlProjectItem::content()
|
||||
{
|
||||
Q_D(QmlProjectItem);
|
||||
return &d->content;
|
||||
}
|
||||
|
||||
QString QmlProjectItem::sourceDirectory() const
|
||||
{
|
||||
const Q_D(QmlProjectItem);
|
||||
return d->sourceDirectory;
|
||||
}
|
||||
|
||||
void QmlProjectItem::setSourceDirectory(const QString &directoryPath)
|
||||
{
|
||||
Q_D(QmlProjectItem);
|
||||
|
||||
if (d->sourceDirectory == directoryPath)
|
||||
return;
|
||||
|
||||
d->sourceDirectory = directoryPath;
|
||||
|
||||
for (int i = 0; i < d->content.size(); ++i) {
|
||||
QmlProjectContentItem *contentElement = d->content.at(i);
|
||||
FileFilterBaseItem *fileFilter = qobject_cast<FileFilterBaseItem*>(contentElement);
|
||||
if (fileFilter)
|
||||
fileFilter->setDefaultDirectory(directoryPath);
|
||||
}
|
||||
|
||||
emit sourceDirectoryChanged();
|
||||
}
|
||||
|
||||
QStringList QmlProjectItem::qmlFiles() const
|
||||
{
|
||||
const Q_D(QmlProjectItem);
|
||||
QStringList qmlFiles;
|
||||
|
||||
for (int i = 0; i < d->content.size(); ++i) {
|
||||
QmlProjectContentItem *contentElement = d->content.at(i);
|
||||
QmlFileFilterItem *qmlFileFilter = qobject_cast<QmlFileFilterItem*>(contentElement);
|
||||
if (qmlFileFilter) {
|
||||
foreach (const QString &file, qmlFileFilter->files()) {
|
||||
if (!qmlFiles.contains(file))
|
||||
qmlFiles << file;
|
||||
}
|
||||
}
|
||||
}
|
||||
return qmlFiles;
|
||||
}
|
||||
|
||||
} // namespace QmlProjectManager
|
||||
|
||||
QML_DEFINE_NOCREATE_TYPE(QmlProjectManager::QmlProjectContentItem)
|
||||
QML_DEFINE_TYPE(QmlProject,1,0,Project,QmlProjectManager::QmlProjectItem)
|
||||
|
||||
#include "qmlprojectitem.moc"
|
||||
55
src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
Normal file
55
src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
Normal file
@@ -0,0 +1,55 @@
|
||||
#ifndef PROJECTITEM_H
|
||||
#define PROJECTITEM_H
|
||||
|
||||
#include <QObject>
|
||||
#include <qml.h>
|
||||
|
||||
namespace QmlProjectManager {
|
||||
|
||||
class QmlProjectContentItem : public QObject {
|
||||
// base class for all elements that should be direct children of Project element
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QmlProjectContentItem(QObject *parent = 0) : QObject(parent) {}
|
||||
};
|
||||
|
||||
class QmlProjectItemPrivate;
|
||||
|
||||
class QmlProjectItem : public QObject {
|
||||
Q_OBJECT
|
||||
Q_DECLARE_PRIVATE(QmlProjectItem)
|
||||
Q_DISABLE_COPY(QmlProjectItem)
|
||||
|
||||
Q_PROPERTY(QmlList<QmlProjectManager::QmlProjectContentItem*> *content READ content DESIGNABLE false)
|
||||
Q_PROPERTY(QString sourceDirectory READ sourceDirectory NOTIFY sourceDirectoryChanged)
|
||||
|
||||
Q_CLASSINFO("DefaultProperty", "content");
|
||||
|
||||
public:
|
||||
QmlProjectItem(QObject *parent = 0);
|
||||
~QmlProjectItem();
|
||||
|
||||
QmlList<QmlProjectContentItem*> *content();
|
||||
|
||||
QString sourceDirectory() const;
|
||||
void setSourceDirectory(const QString &directoryPath);
|
||||
|
||||
QStringList qmlFiles() const;
|
||||
|
||||
signals:
|
||||
void sourceDirectoryChanged();
|
||||
|
||||
protected:
|
||||
QmlProjectItemPrivate *d_ptr;
|
||||
|
||||
};
|
||||
|
||||
} // namespace QmlProjectManager
|
||||
|
||||
QML_DECLARE_TYPE(QmlProjectManager::QmlProjectItem);
|
||||
QML_DECLARE_TYPE(QmlProjectManager::QmlProjectContentItem);
|
||||
Q_DECLARE_METATYPE(QList<QmlProjectManager::QmlProjectContentItem *>);
|
||||
|
||||
|
||||
#endif // PROJECTITEM_H
|
||||
Reference in New Issue
Block a user