QmlDesigner: import only working imports

Change-Id: Ic7d74237eeb86e34925f1b048befa5da9420c278
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
This commit is contained in:
Tim Jenssen
2014-09-25 12:57:57 +02:00
parent a56432b3b1
commit 2bd550f3fd
18 changed files with 162 additions and 122 deletions

View File

@@ -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()));

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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());

View File

@@ -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;

View File

@@ -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();

View File

@@ -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()) {

View File

@@ -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()));

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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());

View File

@@ -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;

View File

@@ -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();

View File

@@ -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 {