New qml based .qmproject file format

This commit is contained in:
Kai Koehne
2010-01-19 09:33:06 +01:00
parent 10f48384a0
commit 47155f8518
13 changed files with 519 additions and 1 deletions

View 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)

View 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

View File

@@ -0,0 +1,4 @@
HEADERS += $$PWD/qmlprojectitem.h \
$$PWD/filefilteritems.h
SOURCES += $$PWD/qmlprojectitem.cpp \
$$PWD/filefilteritems.cpp

View 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"

View 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