forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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"
|
||||
|
@@ -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
|
||||
|
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "qmlproject.h"
|
||||
#include "qmlprojectfile.h"
|
||||
#include "fileformat/qmlprojectfileformat.h"
|
||||
#include "fileformat/qmlprojectitem.h"
|
||||
#include "qmlprojectrunconfiguration.h"
|
||||
#include "qmlprojectconstants.h"
|
||||
@@ -46,13 +47,14 @@
|
||||
#include <projectexplorer/target.h>
|
||||
#include <qtsupport/qtsupportconstants.h>
|
||||
|
||||
#include <QDeclarativeComponent>
|
||||
#include <QDebug>
|
||||
|
||||
namespace QmlProjectManager {
|
||||
|
||||
namespace Internal {
|
||||
|
||||
|
||||
|
||||
class QmlProjectKitMatcher : public ProjectExplorer::KitMatcher
|
||||
{
|
||||
public:
|
||||
@@ -182,21 +184,15 @@ void QmlProject::parseProject(RefreshOptions options)
|
||||
if (options & ProjectFile)
|
||||
delete m_projectItem.data();
|
||||
if (!m_projectItem) {
|
||||
Utils::FileReader reader;
|
||||
if (reader.fetch(m_fileName)) {
|
||||
QDeclarativeComponent *component = new QDeclarativeComponent(&m_engine, this);
|
||||
component->setData(reader.data(), QUrl::fromLocalFile(m_fileName));
|
||||
if (component->isReady()
|
||||
&& qobject_cast<QmlProjectItem*>(component->create())) {
|
||||
m_projectItem = qobject_cast<QmlProjectItem*>(component->create());
|
||||
QString errorMessage;
|
||||
m_projectItem = QmlProjectFileFormat::parseProjectFile(m_fileName, &errorMessage);
|
||||
if (m_projectItem) {
|
||||
connect(m_projectItem.data(), SIGNAL(qmlFilesChanged(QSet<QString>,QSet<QString>)),
|
||||
this, SLOT(refreshFiles(QSet<QString>,QSet<QString>)));
|
||||
|
||||
} else {
|
||||
messageManager->printToOutputPane(tr("Error while loading project file %1.").arg(m_fileName), Core::MessageManager::NoModeSwitch);
|
||||
messageManager->printToOutputPane(component->errorString(), Core::MessageManager::NoModeSwitch);
|
||||
}
|
||||
} else {
|
||||
messageManager->printToOutputPane(tr("QML project: %1").arg(reader.errorString()), Core::MessageManager::NoModeSwitch);
|
||||
messageManager->printToOutputPane(errorMessage, Core::MessageManager::NoModeSwitch);
|
||||
}
|
||||
}
|
||||
if (m_projectItem) {
|
||||
|
@@ -34,7 +34,6 @@
|
||||
|
||||
#include <projectexplorer/project.h>
|
||||
|
||||
#include <QDeclarativeEngine>
|
||||
#include <QPointer>
|
||||
|
||||
namespace ProjectExplorer { class RunConfiguration; }
|
||||
@@ -119,8 +118,6 @@ private:
|
||||
// plain format
|
||||
QStringList m_files;
|
||||
|
||||
// qml based, new format
|
||||
QDeclarativeEngine m_engine;
|
||||
QPointer<QmlProjectItem> m_projectItem;
|
||||
|
||||
Internal::QmlProjectNode *m_rootNode;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
QT += network declarative
|
||||
QT += network
|
||||
|
||||
include(../../qtcreatorplugin.pri)
|
||||
include(fileformat/fileformat.pri)
|
||||
|
@@ -76,8 +76,6 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
|
||||
|
||||
Internal::QmlApplicationWizard::createInstances(this);
|
||||
|
||||
QmlProjectFileFormat::registerDeclarativeTypes();
|
||||
|
||||
Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance();
|
||||
iconProvider->registerIconOverlayForSuffix(QIcon(QLatin1String(":/qmlproject/images/qmlproject.png")),
|
||||
QLatin1String("qmlproject"));
|
||||
|
Reference in New Issue
Block a user