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 <QSet>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
#include <qdeclarative.h>
|
|
||||||
|
|
||||||
QT_FORWARD_DECLARE_CLASS(QDir)
|
QT_FORWARD_DECLARE_CLASS(QDir)
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
@@ -181,10 +179,4 @@ public:
|
|||||||
|
|
||||||
} // namespace QmlProjectManager
|
} // 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
|
#endif // FILEFILTERITEMS_HPROJECTITEM_H
|
||||||
|
@@ -30,26 +30,102 @@
|
|||||||
#include "qmlprojectfileformat.h"
|
#include "qmlprojectfileformat.h"
|
||||||
#include "qmlprojectitem.h"
|
#include "qmlprojectitem.h"
|
||||||
#include "filefilteritems.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 {
|
namespace QmlProjectManager {
|
||||||
|
|
||||||
void QmlProjectFileFormat::registerDeclarativeTypes()
|
QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const QString &fileName, QString *errorMessage)
|
||||||
{
|
{
|
||||||
qmlRegisterType<QmlProjectManager::QmlProjectContentItem>();
|
QmlJS::SimpleReader simpleQmlJSReader;
|
||||||
qmlRegisterType<QmlProjectManager::QmlProjectItem>("QmlProject",1,0,"Project");
|
|
||||||
qmlRegisterType<QmlProjectManager::QmlProjectItem>("QmlProject",1,1,"Project");
|
|
||||||
|
|
||||||
qmlRegisterType<QmlProjectManager::QmlFileFilterItem>("QmlProject",1,0,"QmlFiles");
|
const QmlJS::SimpleReaderNode::Ptr rootNode = simpleQmlJSReader.readFile(fileName);
|
||||||
qmlRegisterType<QmlProjectManager::QmlFileFilterItem>("QmlProject",1,1,"QmlFiles");
|
|
||||||
qmlRegisterType<QmlProjectManager::JsFileFilterItem>("QmlProject",1,0,"JavaScriptFiles");
|
if (!simpleQmlJSReader.errors().isEmpty() || !rootNode->isValid()) {
|
||||||
qmlRegisterType<QmlProjectManager::JsFileFilterItem>("QmlProject",1,1,"JavaScriptFiles");
|
qWarning() << "unable to parse:" << fileName;
|
||||||
qmlRegisterType<QmlProjectManager::ImageFileFilterItem>("QmlProject",1,0,"ImageFiles");
|
qWarning() << simpleQmlJSReader.errors();
|
||||||
qmlRegisterType<QmlProjectManager::ImageFileFilterItem>("QmlProject",1,1,"ImageFiles");
|
if (errorMessage)
|
||||||
qmlRegisterType<QmlProjectManager::CssFileFilterItem>("QmlProject",1,0,"CssFiles");
|
*errorMessage = simpleQmlJSReader.errors().join(QLatin1String(", "));
|
||||||
qmlRegisterType<QmlProjectManager::CssFileFilterItem>("QmlProject",1,1,"CssFiles");
|
return 0;
|
||||||
qmlRegisterType<QmlProjectManager::OtherFileFilterItem>("QmlProject",1,1,"Files");
|
}
|
||||||
|
|
||||||
|
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
|
} // namespace QmlProjectManager
|
||||||
|
@@ -32,9 +32,14 @@
|
|||||||
|
|
||||||
namespace QmlProjectManager {
|
namespace QmlProjectManager {
|
||||||
|
|
||||||
class QmlProjectFileFormat {
|
class QmlProjectItem;
|
||||||
|
|
||||||
|
class QmlProjectFileFormat
|
||||||
|
{
|
||||||
|
Q_DECLARE_TR_FUNCTIONS(QmlProjectManager::QmlProjectFileFormat);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void registerDeclarativeTypes();
|
static QmlProjectItem *parseProjectFile(const QString &fileName, QString *errorMessage = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QmlProjectManager
|
} // namespace QmlProjectManager
|
||||||
|
@@ -77,12 +77,6 @@ QmlProjectItem::~QmlProjectItem()
|
|||||||
delete d_ptr;
|
delete d_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDeclarativeListProperty<QmlProjectContentItem> QmlProjectItem::content()
|
|
||||||
{
|
|
||||||
Q_D(QmlProjectItem);
|
|
||||||
return QDeclarativeListProperty<QmlProjectContentItem>(this, d->content);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QmlProjectItem::sourceDirectory() const
|
QString QmlProjectItem::sourceDirectory() const
|
||||||
{
|
{
|
||||||
Q_D(const QmlProjectItem);
|
Q_D(const QmlProjectItem);
|
||||||
@@ -194,6 +188,12 @@ void QmlProjectItem::setMainFile(const QString &mainFilePath)
|
|||||||
emit mainFileChanged();
|
emit mainFileChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QmlProjectItem::appendContent(QmlProjectContentItem *contentItem)
|
||||||
|
{
|
||||||
|
Q_D(QmlProjectItem);
|
||||||
|
d->content.append(contentItem);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace QmlProjectManager
|
} // namespace QmlProjectManager
|
||||||
|
|
||||||
#include "qmlprojectitem.moc"
|
#include "qmlprojectitem.moc"
|
||||||
|
@@ -33,7 +33,6 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <qdeclarative.h>
|
|
||||||
|
|
||||||
namespace QmlProjectManager {
|
namespace QmlProjectManager {
|
||||||
|
|
||||||
@@ -52,19 +51,14 @@ class QmlProjectItem : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DECLARE_PRIVATE(QmlProjectItem)
|
Q_DECLARE_PRIVATE(QmlProjectItem)
|
||||||
|
|
||||||
Q_PROPERTY(QDeclarativeListProperty<QmlProjectManager::QmlProjectContentItem> content READ content DESIGNABLE false)
|
|
||||||
Q_PROPERTY(QString sourceDirectory READ sourceDirectory NOTIFY sourceDirectoryChanged)
|
Q_PROPERTY(QString sourceDirectory READ sourceDirectory NOTIFY sourceDirectoryChanged)
|
||||||
Q_PROPERTY(QStringList importPaths READ importPaths WRITE setImportPaths NOTIFY importPathsChanged)
|
Q_PROPERTY(QStringList importPaths READ importPaths WRITE setImportPaths NOTIFY importPathsChanged)
|
||||||
Q_PROPERTY(QString mainFile READ mainFile WRITE setMainFile NOTIFY mainFileChanged)
|
Q_PROPERTY(QString mainFile READ mainFile WRITE setMainFile NOTIFY mainFileChanged)
|
||||||
|
|
||||||
Q_CLASSINFO("DefaultProperty", "content")
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QmlProjectItem(QObject *parent = 0);
|
QmlProjectItem(QObject *parent = 0);
|
||||||
~QmlProjectItem();
|
~QmlProjectItem();
|
||||||
|
|
||||||
QDeclarativeListProperty<QmlProjectContentItem> content();
|
|
||||||
|
|
||||||
QString sourceDirectory() const;
|
QString sourceDirectory() const;
|
||||||
void setSourceDirectory(const QString &directoryPath);
|
void setSourceDirectory(const QString &directoryPath);
|
||||||
|
|
||||||
@@ -77,6 +71,7 @@ public:
|
|||||||
QString mainFile() const;
|
QString mainFile() const;
|
||||||
void setMainFile(const QString &mainFilePath);
|
void setMainFile(const QString &mainFilePath);
|
||||||
|
|
||||||
|
void appendContent(QmlProjectContentItem* contentItem);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void qmlFilesChanged(const QSet<QString> &, const QSet<QString> &);
|
void qmlFilesChanged(const QSet<QString> &, const QSet<QString> &);
|
||||||
@@ -90,8 +85,4 @@ protected:
|
|||||||
|
|
||||||
} // namespace QmlProjectManager
|
} // namespace QmlProjectManager
|
||||||
|
|
||||||
QML_DECLARE_TYPE(QmlProjectManager::QmlProjectItem)
|
|
||||||
QML_DECLARE_TYPE(QmlProjectManager::QmlProjectContentItem)
|
|
||||||
Q_DECLARE_METATYPE(QList<QmlProjectManager::QmlProjectContentItem *>)
|
|
||||||
|
|
||||||
#endif // QMLPROJECTITEM_H
|
#endif // QMLPROJECTITEM_H
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include "qmlproject.h"
|
#include "qmlproject.h"
|
||||||
#include "qmlprojectfile.h"
|
#include "qmlprojectfile.h"
|
||||||
|
#include "fileformat/qmlprojectfileformat.h"
|
||||||
#include "fileformat/qmlprojectitem.h"
|
#include "fileformat/qmlprojectitem.h"
|
||||||
#include "qmlprojectrunconfiguration.h"
|
#include "qmlprojectrunconfiguration.h"
|
||||||
#include "qmlprojectconstants.h"
|
#include "qmlprojectconstants.h"
|
||||||
@@ -46,13 +47,14 @@
|
|||||||
#include <projectexplorer/target.h>
|
#include <projectexplorer/target.h>
|
||||||
#include <qtsupport/qtsupportconstants.h>
|
#include <qtsupport/qtsupportconstants.h>
|
||||||
|
|
||||||
#include <QDeclarativeComponent>
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
namespace QmlProjectManager {
|
namespace QmlProjectManager {
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class QmlProjectKitMatcher : public ProjectExplorer::KitMatcher
|
class QmlProjectKitMatcher : public ProjectExplorer::KitMatcher
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -182,21 +184,15 @@ void QmlProject::parseProject(RefreshOptions options)
|
|||||||
if (options & ProjectFile)
|
if (options & ProjectFile)
|
||||||
delete m_projectItem.data();
|
delete m_projectItem.data();
|
||||||
if (!m_projectItem) {
|
if (!m_projectItem) {
|
||||||
Utils::FileReader reader;
|
QString errorMessage;
|
||||||
if (reader.fetch(m_fileName)) {
|
m_projectItem = QmlProjectFileFormat::parseProjectFile(m_fileName, &errorMessage);
|
||||||
QDeclarativeComponent *component = new QDeclarativeComponent(&m_engine, this);
|
if (m_projectItem) {
|
||||||
component->setData(reader.data(), QUrl::fromLocalFile(m_fileName));
|
|
||||||
if (component->isReady()
|
|
||||||
&& qobject_cast<QmlProjectItem*>(component->create())) {
|
|
||||||
m_projectItem = qobject_cast<QmlProjectItem*>(component->create());
|
|
||||||
connect(m_projectItem.data(), SIGNAL(qmlFilesChanged(QSet<QString>,QSet<QString>)),
|
connect(m_projectItem.data(), SIGNAL(qmlFilesChanged(QSet<QString>,QSet<QString>)),
|
||||||
this, SLOT(refreshFiles(QSet<QString>,QSet<QString>)));
|
this, SLOT(refreshFiles(QSet<QString>,QSet<QString>)));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
messageManager->printToOutputPane(tr("Error while loading project file %1.").arg(m_fileName), Core::MessageManager::NoModeSwitch);
|
messageManager->printToOutputPane(tr("Error while loading project file %1.").arg(m_fileName), Core::MessageManager::NoModeSwitch);
|
||||||
messageManager->printToOutputPane(component->errorString(), Core::MessageManager::NoModeSwitch);
|
messageManager->printToOutputPane(errorMessage, Core::MessageManager::NoModeSwitch);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
messageManager->printToOutputPane(tr("QML project: %1").arg(reader.errorString()), Core::MessageManager::NoModeSwitch);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m_projectItem) {
|
if (m_projectItem) {
|
||||||
|
@@ -34,7 +34,6 @@
|
|||||||
|
|
||||||
#include <projectexplorer/project.h>
|
#include <projectexplorer/project.h>
|
||||||
|
|
||||||
#include <QDeclarativeEngine>
|
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
|
|
||||||
namespace ProjectExplorer { class RunConfiguration; }
|
namespace ProjectExplorer { class RunConfiguration; }
|
||||||
@@ -119,8 +118,6 @@ private:
|
|||||||
// plain format
|
// plain format
|
||||||
QStringList m_files;
|
QStringList m_files;
|
||||||
|
|
||||||
// qml based, new format
|
|
||||||
QDeclarativeEngine m_engine;
|
|
||||||
QPointer<QmlProjectItem> m_projectItem;
|
QPointer<QmlProjectItem> m_projectItem;
|
||||||
|
|
||||||
Internal::QmlProjectNode *m_rootNode;
|
Internal::QmlProjectNode *m_rootNode;
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
QT += network declarative
|
QT += network
|
||||||
|
|
||||||
include(../../qtcreatorplugin.pri)
|
include(../../qtcreatorplugin.pri)
|
||||||
include(fileformat/fileformat.pri)
|
include(fileformat/fileformat.pri)
|
||||||
|
@@ -76,8 +76,6 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
|
|||||||
|
|
||||||
Internal::QmlApplicationWizard::createInstances(this);
|
Internal::QmlApplicationWizard::createInstances(this);
|
||||||
|
|
||||||
QmlProjectFileFormat::registerDeclarativeTypes();
|
|
||||||
|
|
||||||
Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance();
|
Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance();
|
||||||
iconProvider->registerIconOverlayForSuffix(QIcon(QLatin1String(":/qmlproject/images/qmlproject.png")),
|
iconProvider->registerIconOverlayForSuffix(QIcon(QLatin1String(":/qmlproject/images/qmlproject.png")),
|
||||||
QLatin1String("qmlproject"));
|
QLatin1String("qmlproject"));
|
||||||
|
Reference in New Issue
Block a user