QmlProjectManager: removing declarative dependency

We can parse the .qmlproject files without using the declarative module.

Change-Id: I78a910c9ec9477f5c6fbcdca23f62ab841ca4368
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
This commit is contained in:
Thomas Hartmann
2013-07-11 17:37:02 +02:00
parent 18c739c82d
commit e7f81afc4f
9 changed files with 118 additions and 63 deletions

View File

@@ -36,8 +36,6 @@
#include <QSet>
#include <QTimer>
#include <qdeclarative.h>
QT_FORWARD_DECLARE_CLASS(QDir)
namespace Utils {
@@ -181,10 +179,4 @@ public:
} // namespace QmlProjectManager
QML_DECLARE_TYPE(QmlProjectManager::QmlFileFilterItem)
QML_DECLARE_TYPE(QmlProjectManager::JsFileFilterItem)
QML_DECLARE_TYPE(QmlProjectManager::ImageFileFilterItem)
QML_DECLARE_TYPE(QmlProjectManager::CssFileFilterItem)
QML_DECLARE_TYPE(QmlProjectManager::OtherFileFilterItem)
#endif // FILEFILTERITEMS_HPROJECTITEM_H

View File

@@ -30,26 +30,102 @@
#include "qmlprojectfileformat.h"
#include "qmlprojectitem.h"
#include "filefilteritems.h"
#include <qmljs/qmljssimplereader.h>
#include <qdeclarative.h>
enum {
debug = false
};
namespace {
void setupFileFilterItem(QmlProjectManager::FileFilterBaseItem *fileFilterItem, const QmlJS::SimpleReaderNode::Ptr &node)
{
const QVariant directoryProperty = node->property(QLatin1String("directory"));
if (directoryProperty.isValid())
fileFilterItem->setDirectory(directoryProperty.toString());
const QVariant recursiveProperty = node->property(QLatin1String("recursive"));
if (recursiveProperty.isValid())
fileFilterItem->setRecursive(recursiveProperty.toBool());
const QVariant pathsProperty = node->property(QLatin1String("paths"));
if (pathsProperty.isValid())
fileFilterItem->setPathsProperty(pathsProperty.toStringList());
if (debug)
qDebug() << "directory:" << directoryProperty << "recursive" << recursiveProperty << "paths" << pathsProperty;
}
} //namespace
namespace QmlProjectManager {
void QmlProjectFileFormat::registerDeclarativeTypes()
QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const QString &fileName, QString *errorMessage)
{
qmlRegisterType<QmlProjectManager::QmlProjectContentItem>();
qmlRegisterType<QmlProjectManager::QmlProjectItem>("QmlProject",1,0,"Project");
qmlRegisterType<QmlProjectManager::QmlProjectItem>("QmlProject",1,1,"Project");
QmlJS::SimpleReader simpleQmlJSReader;
qmlRegisterType<QmlProjectManager::QmlFileFilterItem>("QmlProject",1,0,"QmlFiles");
qmlRegisterType<QmlProjectManager::QmlFileFilterItem>("QmlProject",1,1,"QmlFiles");
qmlRegisterType<QmlProjectManager::JsFileFilterItem>("QmlProject",1,0,"JavaScriptFiles");
qmlRegisterType<QmlProjectManager::JsFileFilterItem>("QmlProject",1,1,"JavaScriptFiles");
qmlRegisterType<QmlProjectManager::ImageFileFilterItem>("QmlProject",1,0,"ImageFiles");
qmlRegisterType<QmlProjectManager::ImageFileFilterItem>("QmlProject",1,1,"ImageFiles");
qmlRegisterType<QmlProjectManager::CssFileFilterItem>("QmlProject",1,0,"CssFiles");
qmlRegisterType<QmlProjectManager::CssFileFilterItem>("QmlProject",1,1,"CssFiles");
qmlRegisterType<QmlProjectManager::OtherFileFilterItem>("QmlProject",1,1,"Files");
const QmlJS::SimpleReaderNode::Ptr rootNode = simpleQmlJSReader.readFile(fileName);
if (!simpleQmlJSReader.errors().isEmpty() || !rootNode->isValid()) {
qWarning() << "unable to parse:" << fileName;
qWarning() << simpleQmlJSReader.errors();
if (errorMessage)
*errorMessage = simpleQmlJSReader.errors().join(QLatin1String(", "));
return 0;
}
if (rootNode->name() == QLatin1String("Project")) {
QmlProjectItem *projectItem = new QmlProjectItem();
const QVariant mainFileProperty = rootNode->property(QLatin1String("mainFile"));
if (mainFileProperty.isValid())
projectItem->setMainFile(mainFileProperty.toString());
const QVariant importPathsProperty = rootNode->property(QLatin1String("importPaths"));
if (importPathsProperty.isValid())
projectItem->setImportPaths(importPathsProperty.toStringList());
if (debug) {
qDebug() << "importPath:" << importPathsProperty << "mainFile:" << mainFileProperty;
}
foreach (const QmlJS::SimpleReaderNode::Ptr &childNode, rootNode->children()) {
if (childNode->name() == QLatin1String("QmlFiles")) {
if (debug)
qDebug() << "QmlFiles";
QmlFileFilterItem *qmlFileFilterItem = new QmlFileFilterItem(projectItem);
setupFileFilterItem(qmlFileFilterItem, childNode);
projectItem->appendContent(qmlFileFilterItem);
} else if (childNode->name() == QLatin1String("JavaScriptFiles")) {
if (debug)
qDebug() << "JavaScriptFiles";
JsFileFilterItem *jsFileFilterItem = new JsFileFilterItem(projectItem);
setupFileFilterItem(jsFileFilterItem, childNode);
projectItem->appendContent(jsFileFilterItem);
} else if (childNode->name() == QLatin1String("ImageFiles")) {
if (debug)
qDebug() << "ImageFiles";
ImageFileFilterItem *imageFileFilterItem = new ImageFileFilterItem(projectItem);
setupFileFilterItem(imageFileFilterItem, childNode);
projectItem->appendContent(imageFileFilterItem);
} else if (childNode->name() == QLatin1String("CssFiles")) {
if (debug)
qDebug() << "CssFiles";
CssFileFilterItem *cssFileFilterItem = new CssFileFilterItem(projectItem);
setupFileFilterItem(cssFileFilterItem, childNode);
projectItem->appendContent(cssFileFilterItem);
} else {
qWarning() << "Unkwown type:" << childNode->name();
}
}
return projectItem;
}
if (errorMessage)
*errorMessage = tr("Invalid root element: %1").arg(rootNode->name());
return 0;
}
} // namespace QmlProjectManager

View File

@@ -32,9 +32,14 @@
namespace QmlProjectManager {
class QmlProjectFileFormat {
class QmlProjectItem;
class QmlProjectFileFormat
{
Q_DECLARE_TR_FUNCTIONS(QmlProjectManager::QmlProjectFileFormat);
public:
static void registerDeclarativeTypes();
static QmlProjectItem *parseProjectFile(const QString &fileName, QString *errorMessage = 0);
};
} // namespace QmlProjectManager

View File

@@ -77,12 +77,6 @@ QmlProjectItem::~QmlProjectItem()
delete d_ptr;
}
QDeclarativeListProperty<QmlProjectContentItem> QmlProjectItem::content()
{
Q_D(QmlProjectItem);
return QDeclarativeListProperty<QmlProjectContentItem>(this, d->content);
}
QString QmlProjectItem::sourceDirectory() const
{
Q_D(const QmlProjectItem);
@@ -194,6 +188,12 @@ void QmlProjectItem::setMainFile(const QString &mainFilePath)
emit mainFileChanged();
}
void QmlProjectItem::appendContent(QmlProjectContentItem *contentItem)
{
Q_D(QmlProjectItem);
d->content.append(contentItem);
}
} // namespace QmlProjectManager
#include "qmlprojectitem.moc"

View File

@@ -33,7 +33,6 @@
#include <QObject>
#include <QSet>
#include <QStringList>
#include <qdeclarative.h>
namespace QmlProjectManager {
@@ -52,19 +51,14 @@ class QmlProjectItem : public QObject
Q_OBJECT
Q_DECLARE_PRIVATE(QmlProjectItem)
Q_PROPERTY(QDeclarativeListProperty<QmlProjectManager::QmlProjectContentItem> content READ content DESIGNABLE false)
Q_PROPERTY(QString sourceDirectory READ sourceDirectory NOTIFY sourceDirectoryChanged)
Q_PROPERTY(QStringList importPaths READ importPaths WRITE setImportPaths NOTIFY importPathsChanged)
Q_PROPERTY(QString mainFile READ mainFile WRITE setMainFile NOTIFY mainFileChanged)
Q_CLASSINFO("DefaultProperty", "content")
public:
QmlProjectItem(QObject *parent = 0);
~QmlProjectItem();
QDeclarativeListProperty<QmlProjectContentItem> content();
QString sourceDirectory() const;
void setSourceDirectory(const QString &directoryPath);
@@ -77,6 +71,7 @@ public:
QString mainFile() const;
void setMainFile(const QString &mainFilePath);
void appendContent(QmlProjectContentItem* contentItem);
signals:
void qmlFilesChanged(const QSet<QString> &, const QSet<QString> &);
@@ -90,8 +85,4 @@ protected:
} // namespace QmlProjectManager
QML_DECLARE_TYPE(QmlProjectManager::QmlProjectItem)
QML_DECLARE_TYPE(QmlProjectManager::QmlProjectContentItem)
Q_DECLARE_METATYPE(QList<QmlProjectManager::QmlProjectContentItem *>)
#endif // QMLPROJECTITEM_H