forked from qt-creator/qt-creator
QmlDesigner: import only working imports
Change-Id: Ic7d74237eeb86e34925f1b048befa5da9420c278 Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
This commit is contained in:
@@ -68,15 +68,8 @@ bool ComponentNodeInstance::hasContent() const
|
|||||||
|
|
||||||
void ComponentNodeInstance::setNodeSource(const QString &source)
|
void ComponentNodeInstance::setNodeSource(const QString &source)
|
||||||
{
|
{
|
||||||
QByteArray importArray;
|
QByteArray data(source.toUtf8() + "\n");
|
||||||
foreach (const QString &import, nodeInstanceServer()->imports()) {
|
data.prepend(nodeInstanceServer()->importCode());
|
||||||
importArray.append(import.toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray data(source.toUtf8());
|
|
||||||
|
|
||||||
data.prepend(importArray);
|
|
||||||
data.append("\n");
|
|
||||||
|
|
||||||
component()->setData(data, QUrl(nodeInstanceServer()->fileUrl().toString() +
|
component()->setData(data, QUrl(nodeInstanceServer()->fileUrl().toString() +
|
||||||
QLatin1Char('_')+ id()));
|
QLatin1Char('_')+ id()));
|
||||||
|
@@ -28,7 +28,9 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "nodeinstanceserver.h"
|
#include "nodeinstanceserver.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
#include <QQmlEngine>
|
#include <QQmlEngine>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
#include <QFileSystemWatcher>
|
#include <QFileSystemWatcher>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
@@ -42,6 +44,7 @@
|
|||||||
#include <private/qabstractanimation_p.h>
|
#include <private/qabstractanimation_p.h>
|
||||||
#include <QMutableVectorIterator>
|
#include <QMutableVectorIterator>
|
||||||
#include <private/qquickview_p.h>
|
#include <private/qquickview_p.h>
|
||||||
|
#include <designersupport.h>
|
||||||
|
|
||||||
#include "servernodeinstance.h"
|
#include "servernodeinstance.h"
|
||||||
#include "objectnodeinstance.h"
|
#include "objectnodeinstance.h"
|
||||||
@@ -76,6 +79,26 @@
|
|||||||
|
|
||||||
#include "dummycontextobject.h"
|
#include "dummycontextobject.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
bool testImportStatements(const QStringList &importStatementList, bool enableErrorOutput = false) {
|
||||||
|
static const QUrl localEmptyUrl(QUrl::fromLocalFile(""));
|
||||||
|
QQmlEngine engine;
|
||||||
|
QQmlComponent testImportComponent(&engine);
|
||||||
|
|
||||||
|
QByteArray testComponentCode = QStringList(importStatementList).join("\n").toUtf8();
|
||||||
|
|
||||||
|
testImportComponent.setData(testComponentCode.append("\nItem {}\n"), localEmptyUrl);
|
||||||
|
testImportComponent.create();
|
||||||
|
|
||||||
|
if (testImportComponent.errors().isEmpty()) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if (enableErrorOutput)
|
||||||
|
qWarning() << "found not working imports: " << testImportComponent.errorString();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
|
|
||||||
@@ -224,7 +247,7 @@ void NodeInstanceServer::stopRenderTimer()
|
|||||||
|
|
||||||
void NodeInstanceServer::createScene(const CreateSceneCommand &command)
|
void NodeInstanceServer::createScene(const CreateSceneCommand &command)
|
||||||
{
|
{
|
||||||
initializeView(command.imports());
|
initializeView();
|
||||||
QUnifiedTimer::instance()->setSlowdownFactor(0.00001);
|
QUnifiedTimer::instance()->setSlowdownFactor(0.00001);
|
||||||
QUnifiedTimer::instance()->setSlowModeEnabled(true);
|
QUnifiedTimer::instance()->setSlowModeEnabled(true);
|
||||||
|
|
||||||
@@ -348,6 +371,8 @@ void NodeInstanceServer::removeSharedMemory(const RemoveSharedMemoryCommand &/*c
|
|||||||
|
|
||||||
void NodeInstanceServer::setupImports(const QVector<AddImportContainer> &containerVector)
|
void NodeInstanceServer::setupImports(const QVector<AddImportContainer> &containerVector)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(quickView());
|
||||||
|
QSet<QString> importStatementSet;
|
||||||
foreach (const AddImportContainer &container, containerVector) {
|
foreach (const AddImportContainer &container, containerVector) {
|
||||||
QString importStatement = QString("import ");
|
QString importStatement = QString("import ");
|
||||||
|
|
||||||
@@ -362,31 +387,53 @@ void NodeInstanceServer::setupImports(const QVector<AddImportContainer> &contain
|
|||||||
if (!container.alias().isEmpty())
|
if (!container.alias().isEmpty())
|
||||||
importStatement += " as " + container.alias();
|
importStatement += " as " + container.alias();
|
||||||
|
|
||||||
importStatement.append('\n');
|
importStatementSet.insert(importStatement);
|
||||||
|
|
||||||
if (!m_importList.contains(importStatement))
|
|
||||||
m_importList.append(importStatement);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete m_importComponent.data();
|
delete m_importComponent.data();
|
||||||
delete m_importComponentObject.data();
|
delete m_importComponentObject.data();
|
||||||
|
QStringList importStatementList(importStatementSet.toList());
|
||||||
|
QStringList workingImportStatementList;
|
||||||
|
|
||||||
QString componentString;
|
// check possible import statements combinations
|
||||||
foreach (const QString &importStatement, m_importList)
|
bool enableErrorOutput(true);
|
||||||
componentString += QString("%1").arg(importStatement);
|
|
||||||
|
|
||||||
componentString += QString("Item {}\n");
|
// maybe it just works
|
||||||
|
if (testImportStatements(importStatementList)) {
|
||||||
|
workingImportStatementList = importStatementList;
|
||||||
|
} else {
|
||||||
|
QString firstWorkingImportStatement; //usually this will be "import QtQuick x.x"
|
||||||
|
QStringList otherImportStatements;
|
||||||
|
foreach (const QString &importStatement, importStatementList) {
|
||||||
|
if (testImportStatements(QStringList(importStatement)))
|
||||||
|
firstWorkingImportStatement = importStatement;
|
||||||
|
else
|
||||||
|
otherImportStatements.append(importStatement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the bad imports from otherImportStatements
|
||||||
|
foreach (const QString &importStatement, otherImportStatements) {
|
||||||
|
if (testImportStatements(QStringList(firstWorkingImportStatement) << importStatement, enableErrorOutput))
|
||||||
|
workingImportStatementList.append(importStatement);
|
||||||
|
}
|
||||||
|
workingImportStatementList.prepend(firstWorkingImportStatement);
|
||||||
|
}
|
||||||
|
|
||||||
|
setupOnlyWorkingImports(workingImportStatementList);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NodeInstanceServer::setupOnlyWorkingImports(const QStringList &workingImportStatementList)
|
||||||
|
{
|
||||||
|
QByteArray componentCode = workingImportStatementList.join("\n").toUtf8();
|
||||||
|
m_importCode = componentCode;
|
||||||
|
|
||||||
m_importComponent = new QQmlComponent(engine(), quickView());
|
m_importComponent = new QQmlComponent(engine(), quickView());
|
||||||
|
quickView()->setContent(fileUrl(), m_importComponent, quickView()->rootObject());
|
||||||
|
|
||||||
if (quickView())
|
m_importComponent->setData(componentCode.append("\nItem {}\n"), fileUrl());
|
||||||
quickView()->setContent(fileUrl(), m_importComponent, quickView()->rootObject());
|
|
||||||
|
|
||||||
m_importComponent->setData(componentString.toUtf8(), fileUrl());
|
|
||||||
m_importComponentObject = m_importComponent->create();
|
m_importComponentObject = m_importComponent->create();
|
||||||
|
Q_ASSERT(m_importComponent && m_importComponentObject);
|
||||||
if (!m_importComponent->errorString().isEmpty())
|
Q_ASSERT_X(m_importComponent->errors().isEmpty(), __FUNCTION__, m_importComponent->errorString().toLatin1());
|
||||||
qDebug() << "QmlDesigner.NodeInstances: import wrong: " << m_importComponent->errorString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeInstanceServer::setupFileUrl(const QUrl &fileUrl)
|
void NodeInstanceServer::setupFileUrl(const QUrl &fileUrl)
|
||||||
@@ -1024,14 +1071,9 @@ ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVecto
|
|||||||
return ValuesChangedCommand(valueVector);
|
return ValuesChangedCommand(valueVector);
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList NodeInstanceServer::imports() const
|
QByteArray NodeInstanceServer::importCode() const
|
||||||
{
|
{
|
||||||
return m_importList;
|
return m_importCode;
|
||||||
}
|
|
||||||
|
|
||||||
void NodeInstanceServer::addImportString(const QString &import)
|
|
||||||
{
|
|
||||||
m_importList.append(import);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject *NodeInstanceServer::dummyContextObject() const
|
QObject *NodeInstanceServer::dummyContextObject() const
|
||||||
|
@@ -120,7 +120,7 @@ public:
|
|||||||
|
|
||||||
void notifyPropertyChange(qint32 instanceid, const PropertyName &propertyName);
|
void notifyPropertyChange(qint32 instanceid, const PropertyName &propertyName);
|
||||||
|
|
||||||
QStringList imports() const;
|
QByteArray importCode() const;
|
||||||
QObject *dummyContextObject() const;
|
QObject *dummyContextObject() const;
|
||||||
|
|
||||||
virtual QQmlView *declarativeView() const = 0;
|
virtual QQmlView *declarativeView() const = 0;
|
||||||
@@ -136,7 +136,6 @@ public slots:
|
|||||||
protected:
|
protected:
|
||||||
QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container);
|
QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container);
|
||||||
void reparentInstances(const QVector<ReparentContainer> &containerVector);
|
void reparentInstances(const QVector<ReparentContainer> &containerVector);
|
||||||
void addImportString(const QString &import);
|
|
||||||
|
|
||||||
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
||||||
void resetInstanceProperty(const PropertyAbstractContainer &propertyContainer);
|
void resetInstanceProperty(const PropertyAbstractContainer &propertyContainer);
|
||||||
@@ -170,7 +169,7 @@ protected:
|
|||||||
int renderTimerInterval() const;
|
int renderTimerInterval() const;
|
||||||
void setSlowRenderTimerInterval(int timerInterval);
|
void setSlowRenderTimerInterval(int timerInterval);
|
||||||
|
|
||||||
virtual void initializeView(const QVector<AddImportContainer> &importVector) = 0;
|
virtual void initializeView() = 0;
|
||||||
virtual QList<ServerNodeInstance> setupScene(const CreateSceneCommand &command) = 0;
|
virtual QList<ServerNodeInstance> setupScene(const CreateSceneCommand &command) = 0;
|
||||||
void loadDummyDataFiles(const QString& directory);
|
void loadDummyDataFiles(const QString& directory);
|
||||||
void loadDummyDataContext(const QString& directory);
|
void loadDummyDataContext(const QString& directory);
|
||||||
@@ -203,6 +202,7 @@ protected:
|
|||||||
virtual void resizeCanvasSizeToRootItemSize() = 0;
|
virtual void resizeCanvasSizeToRootItemSize() = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void setupOnlyWorkingImports(const QStringList &workingImportStatementList);
|
||||||
ServerNodeInstance m_rootNodeInstance;
|
ServerNodeInstance m_rootNodeInstance;
|
||||||
ServerNodeInstance m_activeStateInstance;
|
ServerNodeInstance m_activeStateInstance;
|
||||||
QHash<qint32, ServerNodeInstance> m_idInstanceHash;
|
QHash<qint32, ServerNodeInstance> m_idInstanceHash;
|
||||||
@@ -219,7 +219,7 @@ private:
|
|||||||
bool m_slowRenderTimer;
|
bool m_slowRenderTimer;
|
||||||
int m_slowRenderTimerInterval;
|
int m_slowRenderTimerInterval;
|
||||||
QVector<InstancePropertyPair> m_changedPropertyList;
|
QVector<InstancePropertyPair> m_changedPropertyList;
|
||||||
QStringList m_importList;
|
QByteArray m_importCode;
|
||||||
QPointer<QObject> m_dummyContextObject;
|
QPointer<QObject> m_dummyContextObject;
|
||||||
QPointer<QQmlComponent> m_importComponent;
|
QPointer<QQmlComponent> m_importComponent;
|
||||||
QPointer<QObject> m_importComponentObject;
|
QPointer<QObject> m_importComponentObject;
|
||||||
|
@@ -958,7 +958,7 @@ void tweakObjects(QObject *object)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, const QStringList &imports, QQmlContext *context)
|
QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, const QByteArray &importCode, QQmlContext *context)
|
||||||
{
|
{
|
||||||
ComponentCompleteDisabler disableComponentComplete;
|
ComponentCompleteDisabler disableComponentComplete;
|
||||||
|
|
||||||
@@ -966,16 +966,8 @@ QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, cons
|
|||||||
|
|
||||||
QQmlComponent *component = new QQmlComponent(context->engine());
|
QQmlComponent *component = new QQmlComponent(context->engine());
|
||||||
|
|
||||||
QByteArray importArray;
|
|
||||||
|
|
||||||
foreach (const QString &import, imports) {
|
|
||||||
importArray.append(import.toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray data(nodeSource.toUtf8());
|
QByteArray data(nodeSource.toUtf8());
|
||||||
|
data.prepend(importCode);
|
||||||
data.prepend(importArray);
|
|
||||||
|
|
||||||
component->setData(data, context->baseUrl().resolved(QUrl("createComponent.qml")));
|
component->setData(data, context->baseUrl().resolved(QUrl("createComponent.qml")));
|
||||||
|
|
||||||
QObject *object = component;
|
QObject *object = component;
|
||||||
@@ -1062,7 +1054,7 @@ QObject *ObjectNodeInstance::createComponent(const QUrl &componentUrl, QQmlConte
|
|||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject *ObjectNodeInstance::createCustomParserObject(const QString &nodeSource, const QStringList &imports, QQmlContext *context)
|
QObject *ObjectNodeInstance::createCustomParserObject(const QString &nodeSource, const QByteArray &importCode, QQmlContext *context)
|
||||||
{
|
{
|
||||||
ComponentCompleteDisabler disableComponentComplete;
|
ComponentCompleteDisabler disableComponentComplete;
|
||||||
|
|
||||||
@@ -1070,15 +1062,8 @@ QObject *ObjectNodeInstance::createCustomParserObject(const QString &nodeSource,
|
|||||||
|
|
||||||
QQmlComponent component(context->engine());
|
QQmlComponent component(context->engine());
|
||||||
|
|
||||||
QByteArray importArray;
|
|
||||||
foreach (const QString &import, imports) {
|
|
||||||
importArray.append(import.toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray data(nodeSource.toUtf8());
|
QByteArray data(nodeSource.toUtf8());
|
||||||
|
data.prepend(importCode);
|
||||||
data.prepend(importArray);
|
|
||||||
|
|
||||||
component.setData(data, context->baseUrl().resolved(QUrl("createCustomParserObject.qml")));
|
component.setData(data, context->baseUrl().resolved(QUrl("createCustomParserObject.qml")));
|
||||||
|
|
||||||
QObject *object = component.beginCreate(context);
|
QObject *object = component.beginCreate(context);
|
||||||
|
@@ -74,10 +74,10 @@ public:
|
|||||||
|
|
||||||
static Pointer create(QObject *objectToBeWrapped);
|
static Pointer create(QObject *objectToBeWrapped);
|
||||||
static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context);
|
static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context);
|
||||||
static QObject *createCustomParserObject(const QString &nodeSource, const QStringList &imports, QQmlContext *context);
|
static QObject *createCustomParserObject(const QString &nodeSource, const QByteArray &importCode, QQmlContext *context);
|
||||||
static QObject *createComponent(const QString &componentPath, QQmlContext *context);
|
static QObject *createComponent(const QString &componentPath, QQmlContext *context);
|
||||||
static QObject *createComponent(const QUrl &componentUrl, QQmlContext *context);
|
static QObject *createComponent(const QUrl &componentUrl, QQmlContext *context);
|
||||||
static QObject *createComponentWrap(const QString &nodeSource, const QStringList &imports, QQmlContext *context);
|
static QObject *createComponentWrap(const QString &nodeSource, const QByteArray &importCode, QQmlContext *context);
|
||||||
|
|
||||||
void setInstanceId(qint32 id);
|
void setInstanceId(qint32 id);
|
||||||
qint32 instanceId() const;
|
qint32 instanceId() const;
|
||||||
|
@@ -44,7 +44,6 @@ Qt5NodeInstanceServer::Qt5NodeInstanceServer(NodeInstanceClientInterface *nodeIn
|
|||||||
: NodeInstanceServer(nodeInstanceClient),
|
: NodeInstanceServer(nodeInstanceClient),
|
||||||
m_designerSupport(new DesignerSupport)
|
m_designerSupport(new DesignerSupport)
|
||||||
{
|
{
|
||||||
addImportString("import QtQuick 2.0\n");
|
|
||||||
DesignerSupport::activateDesignerMode();
|
DesignerSupport::activateDesignerMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +59,7 @@ QQuickView *Qt5NodeInstanceServer::quickView() const
|
|||||||
return m_quickView.data();
|
return m_quickView.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Qt5NodeInstanceServer::initializeView(const QVector<AddImportContainer> &/*importVector*/)
|
void Qt5NodeInstanceServer::initializeView()
|
||||||
{
|
{
|
||||||
Q_ASSERT(!quickView());
|
Q_ASSERT(!quickView());
|
||||||
|
|
||||||
|
@@ -60,7 +60,7 @@ public:
|
|||||||
void reparentInstances(const ReparentInstancesCommand &command) Q_DECL_OVERRIDE;
|
void reparentInstances(const ReparentInstancesCommand &command) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initializeView(const QVector<AddImportContainer> &importVector) Q_DECL_OVERRIDE;
|
void initializeView() Q_DECL_OVERRIDE;
|
||||||
void resizeCanvasSizeToRootItemSize() Q_DECL_OVERRIDE;
|
void resizeCanvasSizeToRootItemSize() Q_DECL_OVERRIDE;
|
||||||
void resetAllItems();
|
void resetAllItems();
|
||||||
QList<ServerNodeInstance> setupScene(const CreateSceneCommand &command) Q_DECL_OVERRIDE;
|
QList<ServerNodeInstance> setupScene(const CreateSceneCommand &command) Q_DECL_OVERRIDE;
|
||||||
|
@@ -48,7 +48,7 @@ Qt5PreviewNodeInstanceServer::Qt5PreviewNodeInstanceServer(NodeInstanceClientInt
|
|||||||
|
|
||||||
void Qt5PreviewNodeInstanceServer::createScene(const CreateSceneCommand &command)
|
void Qt5PreviewNodeInstanceServer::createScene(const CreateSceneCommand &command)
|
||||||
{
|
{
|
||||||
initializeView(command.imports());
|
initializeView();
|
||||||
setupScene(command);
|
setupScene(command);
|
||||||
|
|
||||||
startRenderTimer();
|
startRenderTimer();
|
||||||
|
@@ -213,9 +213,9 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe
|
|||||||
|
|
||||||
QObject *object = 0;
|
QObject *object = 0;
|
||||||
if (componentWrap == WrapAsComponent) {
|
if (componentWrap == WrapAsComponent) {
|
||||||
object = Internal::ObjectNodeInstance::createComponentWrap(instanceContainer.nodeSource(), nodeInstanceServer->imports(), nodeInstanceServer->context());
|
object = Internal::ObjectNodeInstance::createComponentWrap(instanceContainer.nodeSource(), nodeInstanceServer->importCode(), nodeInstanceServer->context());
|
||||||
} else if (!instanceContainer.nodeSource().isEmpty()) {
|
} else if (!instanceContainer.nodeSource().isEmpty()) {
|
||||||
object = Internal::ObjectNodeInstance::createCustomParserObject(instanceContainer.nodeSource(), nodeInstanceServer->imports(), nodeInstanceServer->context());
|
object = Internal::ObjectNodeInstance::createCustomParserObject(instanceContainer.nodeSource(), nodeInstanceServer->importCode(), nodeInstanceServer->context());
|
||||||
if (object == 0)
|
if (object == 0)
|
||||||
nodeInstanceServer->sendDebugOutput(DebugOutputCommand::ErrorType, QLatin1String("Custom parser object could not be created."));
|
nodeInstanceServer->sendDebugOutput(DebugOutputCommand::ErrorType, QLatin1String("Custom parser object could not be created."));
|
||||||
} else if (!instanceContainer.componentPath().isEmpty()) {
|
} else if (!instanceContainer.componentPath().isEmpty()) {
|
||||||
|
@@ -69,15 +69,9 @@ bool ComponentNodeInstance::hasContent() const
|
|||||||
|
|
||||||
void ComponentNodeInstance::setNodeSource(const QString &source)
|
void ComponentNodeInstance::setNodeSource(const QString &source)
|
||||||
{
|
{
|
||||||
QByteArray importArray;
|
|
||||||
foreach (const QString &import, nodeInstanceServer()->imports()) {
|
|
||||||
importArray.append(import.toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray data(source.toUtf8());
|
QByteArray data(source.toUtf8());
|
||||||
|
|
||||||
data.prepend(importArray);
|
data.prepend(nodeInstanceServer()->importCode());
|
||||||
data.append("\n");
|
|
||||||
|
|
||||||
component()->setData(data, QUrl(nodeInstanceServer()->fileUrl().toString() +
|
component()->setData(data, QUrl(nodeInstanceServer()->fileUrl().toString() +
|
||||||
QLatin1Char('_')+ id()));
|
QLatin1Char('_')+ id()));
|
||||||
|
@@ -43,6 +43,7 @@
|
|||||||
#include <private/qabstractanimation_p.h>
|
#include <private/qabstractanimation_p.h>
|
||||||
#include <QMutableVectorIterator>
|
#include <QMutableVectorIterator>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
#include <QDeclarativeView>
|
||||||
|
|
||||||
#include "servernodeinstance.h"
|
#include "servernodeinstance.h"
|
||||||
#include "objectnodeinstance.h"
|
#include "objectnodeinstance.h"
|
||||||
@@ -77,6 +78,26 @@
|
|||||||
|
|
||||||
#include "dummycontextobject.h"
|
#include "dummycontextobject.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
bool testImportStatements(const QStringList &importStatementList, bool enableErrorOutput = false) {
|
||||||
|
static const QUrl localEmptyUrl(QUrl::fromLocalFile(""));
|
||||||
|
QDeclarativeView testView;
|
||||||
|
QDeclarativeComponent testImportComponent(testView.engine(), &testView);
|
||||||
|
|
||||||
|
QByteArray testComponentCode = QStringList(importStatementList).join("\n").toUtf8();
|
||||||
|
|
||||||
|
testImportComponent.setData(testComponentCode.append("\nItem {}\n"), localEmptyUrl);
|
||||||
|
testImportComponent.create();
|
||||||
|
|
||||||
|
if (testImportComponent.errors().isEmpty()) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if (enableErrorOutput)
|
||||||
|
qWarning() << "found not working imports: " << testImportComponent.errorString();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
|
|
||||||
@@ -224,7 +245,7 @@ void NodeInstanceServer::stopRenderTimer()
|
|||||||
|
|
||||||
void NodeInstanceServer::createScene(const CreateSceneCommand &command)
|
void NodeInstanceServer::createScene(const CreateSceneCommand &command)
|
||||||
{
|
{
|
||||||
initializeView(command.imports());
|
initializeView();
|
||||||
QUnifiedTimer::instance()->setSlowdownFactor(0.00001);
|
QUnifiedTimer::instance()->setSlowdownFactor(0.00001);
|
||||||
QUnifiedTimer::instance()->setSlowModeEnabled(true);
|
QUnifiedTimer::instance()->setSlowModeEnabled(true);
|
||||||
|
|
||||||
@@ -350,6 +371,7 @@ void NodeInstanceServer::removeSharedMemory(const RemoveSharedMemoryCommand &/*c
|
|||||||
|
|
||||||
void NodeInstanceServer::setupImports(const QVector<AddImportContainer> &containerVector)
|
void NodeInstanceServer::setupImports(const QVector<AddImportContainer> &containerVector)
|
||||||
{
|
{
|
||||||
|
QSet<QString> importStatementSet;
|
||||||
foreach (const AddImportContainer &container, containerVector) {
|
foreach (const AddImportContainer &container, containerVector) {
|
||||||
QString importStatement = QString("import ");
|
QString importStatement = QString("import ");
|
||||||
|
|
||||||
@@ -364,29 +386,55 @@ void NodeInstanceServer::setupImports(const QVector<AddImportContainer> &contain
|
|||||||
if (!container.alias().isEmpty())
|
if (!container.alias().isEmpty())
|
||||||
importStatement += " as " + container.alias();
|
importStatement += " as " + container.alias();
|
||||||
|
|
||||||
importStatement.append('\n');
|
importStatementSet.insert(importStatement);
|
||||||
|
|
||||||
if (!m_importList.contains(importStatement))
|
|
||||||
m_importList.append(importStatement);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete m_importComponent.data();
|
delete m_importComponent.data();
|
||||||
delete m_importComponentObject.data();
|
delete m_importComponentObject.data();
|
||||||
|
QStringList importStatementList(importStatementSet.toList());
|
||||||
|
QStringList workingImportStatementList;
|
||||||
|
|
||||||
|
// check possible import statements combinations
|
||||||
|
bool enableErrorOutput(true);
|
||||||
|
|
||||||
|
// maybe it just works
|
||||||
|
if (testImportStatements(importStatementList)) {
|
||||||
|
workingImportStatementList = importStatementList;
|
||||||
|
} else {
|
||||||
|
QString firstWorkingImportStatement; //usually this will be "import QtQuick x.x"
|
||||||
|
QStringList otherImportStatements;
|
||||||
|
foreach (const QString &importStatement, importStatementList) {
|
||||||
|
if (testImportStatements(QStringList(importStatement)))
|
||||||
|
firstWorkingImportStatement = importStatement;
|
||||||
|
else
|
||||||
|
otherImportStatements.append(importStatement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the bad imports from otherImportStatements
|
||||||
|
foreach (const QString &importStatement, otherImportStatements) {
|
||||||
|
if (testImportStatements(QStringList(firstWorkingImportStatement) << importStatement, enableErrorOutput))
|
||||||
|
workingImportStatementList.append(importStatement);
|
||||||
|
}
|
||||||
|
workingImportStatementList.prepend(firstWorkingImportStatement);
|
||||||
|
}
|
||||||
|
|
||||||
|
setupOnlyWorkingImports(workingImportStatementList);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NodeInstanceServer::setupOnlyWorkingImports(const QStringList &workingImportStatementList)
|
||||||
|
{
|
||||||
|
QByteArray componentCode = workingImportStatementList.join("\n").toUtf8();
|
||||||
|
m_importCode = componentCode;
|
||||||
|
|
||||||
m_importComponent = new QDeclarativeComponent(engine(), 0);
|
m_importComponent = new QDeclarativeComponent(engine(), 0);
|
||||||
QString componentString;
|
|
||||||
foreach (const QString &importStatement, m_importList)
|
|
||||||
componentString += QString("%1").arg(importStatement);
|
|
||||||
|
|
||||||
componentString += QString("Item {}\n");
|
m_importComponent->setData(componentCode.append("\nItem {}\n"), fileUrl());
|
||||||
|
|
||||||
m_importComponent->setData(componentString.toUtf8(), fileUrl());
|
|
||||||
m_importComponentObject = m_importComponent->create();
|
m_importComponentObject = m_importComponent->create();
|
||||||
|
Q_ASSERT(m_importComponent && m_importComponentObject);
|
||||||
if (!m_importComponent->errorString().isEmpty())
|
Q_ASSERT_X(m_importComponent->errors().isEmpty(), __FUNCTION__, m_importComponent->errorString().toLatin1());
|
||||||
qDebug() << "QmlDesigner.NodeInstances: import wrong: " << m_importComponent->errorString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void NodeInstanceServer::setupFileUrl(const QUrl &fileUrl)
|
void NodeInstanceServer::setupFileUrl(const QUrl &fileUrl)
|
||||||
{
|
{
|
||||||
if (!fileUrl.isEmpty()) {
|
if (!fileUrl.isEmpty()) {
|
||||||
@@ -1014,14 +1062,9 @@ ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVecto
|
|||||||
return ValuesChangedCommand(valueVector);
|
return ValuesChangedCommand(valueVector);
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList NodeInstanceServer::imports() const
|
QByteArray NodeInstanceServer::importCode() const
|
||||||
{
|
{
|
||||||
return m_importList;
|
return m_importCode;
|
||||||
}
|
|
||||||
|
|
||||||
void NodeInstanceServer::addImportString(const QString &import)
|
|
||||||
{
|
|
||||||
m_importList.append(import);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject *NodeInstanceServer::dummyContextObject() const
|
QObject *NodeInstanceServer::dummyContextObject() const
|
||||||
|
@@ -121,7 +121,7 @@ public:
|
|||||||
|
|
||||||
void notifyPropertyChange(qint32 instanceid, const PropertyName &propertyName);
|
void notifyPropertyChange(qint32 instanceid, const PropertyName &propertyName);
|
||||||
|
|
||||||
QStringList imports() const;
|
QByteArray importCode() const;
|
||||||
QObject *dummyContextObject() const;
|
QObject *dummyContextObject() const;
|
||||||
|
|
||||||
virtual QDeclarativeView *declarativeView() const = 0;
|
virtual QDeclarativeView *declarativeView() const = 0;
|
||||||
@@ -137,7 +137,6 @@ public slots:
|
|||||||
protected:
|
protected:
|
||||||
QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container);
|
QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container);
|
||||||
void reparentInstances(const QVector<ReparentContainer> &containerVector);
|
void reparentInstances(const QVector<ReparentContainer> &containerVector);
|
||||||
void addImportString(const QString &import);
|
|
||||||
|
|
||||||
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
||||||
void resetInstanceProperty(const PropertyAbstractContainer &propertyContainer);
|
void resetInstanceProperty(const PropertyAbstractContainer &propertyContainer);
|
||||||
@@ -171,7 +170,7 @@ protected:
|
|||||||
int renderTimerInterval() const;
|
int renderTimerInterval() const;
|
||||||
void setSlowRenderTimerInterval(int timerInterval);
|
void setSlowRenderTimerInterval(int timerInterval);
|
||||||
|
|
||||||
virtual void initializeView(const QVector<AddImportContainer> &importVector) = 0;
|
virtual void initializeView() = 0;
|
||||||
virtual QList<ServerNodeInstance> setupScene(const CreateSceneCommand &command) = 0;
|
virtual QList<ServerNodeInstance> setupScene(const CreateSceneCommand &command) = 0;
|
||||||
void loadDummyDataFiles(const QString& directory);
|
void loadDummyDataFiles(const QString& directory);
|
||||||
void loadDummyDataContext(const QString& directory);
|
void loadDummyDataContext(const QString& directory);
|
||||||
@@ -204,6 +203,7 @@ protected:
|
|||||||
virtual void resizeCanvasSizeToRootItemSize() = 0;
|
virtual void resizeCanvasSizeToRootItemSize() = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void setupOnlyWorkingImports(const QStringList &workingImportStatementList);
|
||||||
ServerNodeInstance m_rootNodeInstance;
|
ServerNodeInstance m_rootNodeInstance;
|
||||||
ServerNodeInstance m_activeStateInstance;
|
ServerNodeInstance m_activeStateInstance;
|
||||||
QHash<qint32, ServerNodeInstance> m_idInstanceHash;
|
QHash<qint32, ServerNodeInstance> m_idInstanceHash;
|
||||||
@@ -220,7 +220,7 @@ private:
|
|||||||
bool m_slowRenderTimer;
|
bool m_slowRenderTimer;
|
||||||
int m_slowRenderTimerInterval;
|
int m_slowRenderTimerInterval;
|
||||||
QVector<InstancePropertyPair> m_changedPropertyList;
|
QVector<InstancePropertyPair> m_changedPropertyList;
|
||||||
QStringList m_importList;
|
QByteArray m_importCode;
|
||||||
QWeakPointer<QObject> m_dummyContextObject;
|
QWeakPointer<QObject> m_dummyContextObject;
|
||||||
QWeakPointer<QDeclarativeComponent> m_importComponent;
|
QWeakPointer<QDeclarativeComponent> m_importComponent;
|
||||||
QWeakPointer<QObject> m_importComponentObject;
|
QWeakPointer<QObject> m_importComponentObject;
|
||||||
|
@@ -873,20 +873,12 @@ void tweakObjects(QObject *object)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, const QStringList &imports, QDeclarativeContext *context)
|
QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, const QByteArray &importCode, QDeclarativeContext *context)
|
||||||
{
|
{
|
||||||
QDeclarativeComponent *component = new QDeclarativeComponent(context->engine());
|
QDeclarativeComponent *component = new QDeclarativeComponent(context->engine());
|
||||||
|
|
||||||
QByteArray importArray;
|
|
||||||
|
|
||||||
foreach (const QString &import, imports) {
|
|
||||||
importArray.append(import.toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray data(nodeSource.toUtf8());
|
QByteArray data(nodeSource.toUtf8());
|
||||||
|
data.prepend(importCode);
|
||||||
data.prepend(importArray);
|
|
||||||
|
|
||||||
component->setData(data, context->baseUrl().resolved(QUrl("createComponent.qml")));
|
component->setData(data, context->baseUrl().resolved(QUrl("createComponent.qml")));
|
||||||
|
|
||||||
QObject *object = component;
|
QObject *object = component;
|
||||||
@@ -946,19 +938,12 @@ QObject *ObjectNodeInstance::createComponent(const QString &componentPath, QDecl
|
|||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject *ObjectNodeInstance::createCustomParserObject(const QString &nodeSource, const QStringList &imports, QDeclarativeContext *context)
|
QObject *ObjectNodeInstance::createCustomParserObject(const QString &nodeSource, const QByteArray &importCode, QDeclarativeContext *context)
|
||||||
{
|
{
|
||||||
QDeclarativeComponent component(context->engine());
|
QDeclarativeComponent component(context->engine());
|
||||||
|
|
||||||
QByteArray importArray;
|
|
||||||
foreach(const QString &import, imports) {
|
|
||||||
importArray.append(import.toUtf8());
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray data(nodeSource.toUtf8());
|
QByteArray data(nodeSource.toUtf8());
|
||||||
|
data.prepend(importCode);
|
||||||
data.prepend(importArray);
|
|
||||||
|
|
||||||
component.setData(data, context->baseUrl().resolved(QUrl("createCustomParserObject.qml")));
|
component.setData(data, context->baseUrl().resolved(QUrl("createCustomParserObject.qml")));
|
||||||
|
|
||||||
QObject *object = component.beginCreate(context);
|
QObject *object = component.beginCreate(context);
|
||||||
|
@@ -72,9 +72,9 @@ public:
|
|||||||
|
|
||||||
static Pointer create(QObject *objectToBeWrapped);
|
static Pointer create(QObject *objectToBeWrapped);
|
||||||
static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context);
|
static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context);
|
||||||
static QObject *createCustomParserObject(const QString &nodeSource, const QStringList &imports, QDeclarativeContext *context);
|
static QObject *createCustomParserObject(const QString &nodeSource, const QByteArray &importCode, QDeclarativeContext *context);
|
||||||
static QObject *createComponent(const QString &componentPath, QDeclarativeContext *context);
|
static QObject *createComponent(const QString &componentPath, QDeclarativeContext *context);
|
||||||
static QObject *createComponentWrap(const QString &nodeSource, const QStringList &imports, QDeclarativeContext *context);
|
static QObject *createComponentWrap(const QString &nodeSource, const QByteArray &importCode, QDeclarativeContext *context);
|
||||||
|
|
||||||
void setInstanceId(qint32 id);
|
void setInstanceId(qint32 id);
|
||||||
qint32 instanceId() const;
|
qint32 instanceId() const;
|
||||||
|
@@ -44,7 +44,6 @@ namespace QmlDesigner {
|
|||||||
Qt4NodeInstanceServer::Qt4NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient)
|
Qt4NodeInstanceServer::Qt4NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient)
|
||||||
: NodeInstanceServer(nodeInstanceClient)
|
: NodeInstanceServer(nodeInstanceClient)
|
||||||
{
|
{
|
||||||
addImportString("import QtQuick 1.0\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Qt4NodeInstanceServer::~Qt4NodeInstanceServer()
|
Qt4NodeInstanceServer::~Qt4NodeInstanceServer()
|
||||||
@@ -70,7 +69,7 @@ QDeclarativeEngine *Qt4NodeInstanceServer::engine() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Qt4NodeInstanceServer::initializeView(const QVector<AddImportContainer> &/*importVector*/)
|
void Qt4NodeInstanceServer::initializeView()
|
||||||
{
|
{
|
||||||
Q_ASSERT(!declarativeView());
|
Q_ASSERT(!declarativeView());
|
||||||
|
|
||||||
|
@@ -56,7 +56,7 @@ public:
|
|||||||
void removeProperties(const RemovePropertiesCommand &command);
|
void removeProperties(const RemovePropertiesCommand &command);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initializeView(const QVector<AddImportContainer> &importVector);
|
void initializeView();
|
||||||
void resizeCanvasSizeToRootItemSize();
|
void resizeCanvasSizeToRootItemSize();
|
||||||
void resetAllItems();
|
void resetAllItems();
|
||||||
bool nonInstanceChildIsDirty(QGraphicsObject *graphicsObject) const;
|
bool nonInstanceChildIsDirty(QGraphicsObject *graphicsObject) const;
|
||||||
|
@@ -48,7 +48,7 @@ Qt4PreviewNodeInstanceServer::Qt4PreviewNodeInstanceServer(NodeInstanceClientInt
|
|||||||
|
|
||||||
void Qt4PreviewNodeInstanceServer::createScene(const CreateSceneCommand &command)
|
void Qt4PreviewNodeInstanceServer::createScene(const CreateSceneCommand &command)
|
||||||
{
|
{
|
||||||
initializeView(command.imports());
|
initializeView();
|
||||||
setupScene(command);
|
setupScene(command);
|
||||||
|
|
||||||
startRenderTimer();
|
startRenderTimer();
|
||||||
|
@@ -201,9 +201,9 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe
|
|||||||
|
|
||||||
QObject *object = 0;
|
QObject *object = 0;
|
||||||
if (componentWrap == WrapAsComponent) {
|
if (componentWrap == WrapAsComponent) {
|
||||||
object = Internal::ObjectNodeInstance::createComponentWrap(instanceContainer.nodeSource(), nodeInstanceServer->imports(), nodeInstanceServer->context());
|
object = Internal::ObjectNodeInstance::createComponentWrap(instanceContainer.nodeSource(), nodeInstanceServer->importCode(), nodeInstanceServer->context());
|
||||||
} else if (!instanceContainer.nodeSource().isEmpty()) {
|
} else if (!instanceContainer.nodeSource().isEmpty()) {
|
||||||
object = Internal::ObjectNodeInstance::createCustomParserObject(instanceContainer.nodeSource(), nodeInstanceServer->imports(), nodeInstanceServer->context());
|
object = Internal::ObjectNodeInstance::createCustomParserObject(instanceContainer.nodeSource(), nodeInstanceServer->importCode(), nodeInstanceServer->context());
|
||||||
} else if (!instanceContainer.componentPath().isEmpty()) {
|
} else if (!instanceContainer.componentPath().isEmpty()) {
|
||||||
object = Internal::ObjectNodeInstance::createComponent(instanceContainer.componentPath(), nodeInstanceServer->context());
|
object = Internal::ObjectNodeInstance::createComponent(instanceContainer.componentPath(), nodeInstanceServer->context());
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user