Let the designer start nodes which have invalid meta info

This is only a workaround!
This commit is contained in:
Marco Bubke
2010-04-07 21:03:53 +02:00
committed by Kai Koehne
parent bbaf3b18e7
commit 299f2be2f4
11 changed files with 40 additions and 44 deletions

View File

@@ -116,7 +116,7 @@ void ComponentView::searchForComponentAndAddToList(const ModelNode &node)
item->setEditable(false); item->setEditable(false);
m_standardItemModel->appendRow(item); m_standardItemModel->appendRow(item);
} }
} else if (node.metaInfo().isComponent() && !m_componentList.contains(node.type())) { } else if (node.metaInfo().isValid() && node.metaInfo().isComponent() && !m_componentList.contains(node.type())) {
m_componentList.append(node.type()); m_componentList.append(node.type());
m_componentList.sort(); m_componentList.sort();
m_listChanged = true; m_listChanged = true;

View File

@@ -190,7 +190,7 @@ NavigatorTreeModel::ItemRow NavigatorTreeModel::createItemRow(const ModelNode &n
QStandardItem *idItem = new QStandardItem; QStandardItem *idItem = new QStandardItem;
idItem->setDragEnabled(true); idItem->setDragEnabled(true);
idItem->setDropEnabled(node.metaInfo().isContainer()); idItem->setDropEnabled(node.metaInfo().isValid() && node.metaInfo().isContainer());
idItem->setEditable(true); idItem->setEditable(true);
idItem->setData(hash, Qt::UserRole); idItem->setData(hash, Qt::UserRole);
@@ -204,7 +204,7 @@ NavigatorTreeModel::ItemRow NavigatorTreeModel::createItemRow(const ModelNode &n
#endif #endif
QStandardItem *visibilityItem = new QStandardItem; QStandardItem *visibilityItem = new QStandardItem;
visibilityItem->setDropEnabled(node.metaInfo().isContainer()); visibilityItem->setDropEnabled(node.metaInfo().isValid() && node.metaInfo().isContainer());
visibilityItem->setCheckable(true); visibilityItem->setCheckable(true);
visibilityItem->setEditable(false); visibilityItem->setEditable(false);
visibilityItem->setData(hash, Qt::UserRole); visibilityItem->setData(hash, Qt::UserRole);

View File

@@ -165,7 +165,9 @@ void IdItemDelegate::paint(QPainter *painter,
ModelNode node = m_TreeModel->nodeForIndex(index); ModelNode node = m_TreeModel->nodeForIndex(index);
QIcon icon=node.metaInfo().icon(); QIcon icon;
if (node.metaInfo().isValid()) {
icon=node.metaInfo().icon();
if (icon.isNull()) if (icon.isNull())
{ {
// if node has no own icon, search for it in the itemlibrary // if node has no own icon, search for it in the itemlibrary
@@ -179,8 +181,12 @@ void IdItemDelegate::paint(QPainter *painter,
} }
// if the library was also empty, use the default icon // if the library was also empty, use the default icon
if (icon.isNull()) icon = QIcon(":/ItemLibrary/images/item-default-icon.png");
} }
}
if (icon.isNull())
icon = QIcon(":/ItemLibrary/images/item-default-icon.png");
// If no icon is present, leave an empty space of 24 pixels anyway // If no icon is present, leave an empty space of 24 pixels anyway
int pixmapSide = 16; int pixmapSide = 16;

View File

@@ -38,16 +38,12 @@ namespace QmlDesigner {
namespace Internal { namespace Internal {
DummyNodeInstance::DummyNodeInstance() DummyNodeInstance::DummyNodeInstance()
: ObjectNodeInstance(0) : ObjectNodeInstance(new QObject)
{ {
} }
DummyNodeInstance::Pointer DummyNodeInstance::create(const NodeMetaInfo & metaInfo, QDeclarativeContext *context) DummyNodeInstance::Pointer DummyNodeInstance::create()
{ {
Q_UNUSED(context);
qWarning() << "DummyNodeInstance created" << metaInfo.typeName();
foreach(const NodeMetaInfo &metaInfo, metaInfo.superClasses())
qWarning() << "\t" << metaInfo.typeName();
return Pointer(new DummyNodeInstance); return Pointer(new DummyNodeInstance);
} }
@@ -104,17 +100,10 @@ QStringList DummyNodeInstance::localProperties()
return QStringList(); return QStringList();
} }
bool DummyNodeInstance::isVisible() const void DummyNodeInstance::initializePropertyWatcher(const ObjectNodeInstance::Pointer &/*objectNodeInstance*/)
{ {
return false;
}
void DummyNodeInstance::setVisible(bool /*isVisible*/)
{
Q_ASSERT_X(0, Q_FUNC_INFO, "Cannot set a dummy node instance to visible/non-visible");
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
} }
} // namespace Internal } // namespace Internal
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -43,7 +43,7 @@ public:
typedef QSharedPointer<DummyNodeInstance> Pointer; typedef QSharedPointer<DummyNodeInstance> Pointer;
typedef QWeakPointer<DummyNodeInstance> WeakPointer; typedef QWeakPointer<DummyNodeInstance> WeakPointer;
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context); static Pointer create();
void paint(QPainter *painter) const; void paint(QPainter *painter) const;
@@ -56,12 +56,12 @@ public:
double opacity() const; double opacity() const;
void setPropertyVariant(const QString &name, const QVariant &value); void setPropertyVariant(const QString &name, const QVariant &value);
void setBindingProperty(const QString &name, const QString &expression);
QVariant property(const QString &name) const; QVariant property(const QString &name) const;
QStringList properties(); QStringList properties();
QStringList localProperties(); QStringList localProperties();
bool isVisible() const; void initializePropertyWatcher(const ObjectNodeInstance::Pointer &objectNodeInstance);
void setVisible(bool isVisible);
protected: protected:
DummyNodeInstance(); DummyNodeInstance();

View File

@@ -132,7 +132,13 @@ Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMet
{ {
Internal::ObjectNodeInstance::Pointer instance; Internal::ObjectNodeInstance::Pointer instance;
if (metaInfo.isSubclassOf("Qt/QGraphicsView", 4, 6)) if (!metaInfo.isValid())
instance = Internal::DummyNodeInstance::create();
else if (metaInfo.isSubclassOf("org.webkit/WebView", 1, 0))
instance = Internal::DummyNodeInstance::create();
else if (metaInfo.isSubclassOf("Qt/QWidget", 4, 6))
instance = Internal::DummyNodeInstance::create();
else if (metaInfo.isSubclassOf("Qt/QGraphicsView", 4, 6))
instance = Internal::GraphicsViewNodeInstance::create(metaInfo, context, objectToBeWrapped); instance = Internal::GraphicsViewNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/QDeclarativeView", 4, 6)) else if (metaInfo.isSubclassOf("Qt/QDeclarativeView", 4, 6))
instance = Internal::QDeclarativeViewNodeInstance::create(metaInfo, context, objectToBeWrapped); instance = Internal::QDeclarativeViewNodeInstance::create(metaInfo, context, objectToBeWrapped);
@@ -140,8 +146,6 @@ Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMet
instance = Internal::GraphicsWidgetNodeInstance::create(metaInfo, context, objectToBeWrapped); instance = Internal::GraphicsWidgetNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/Item", 4, 6)) else if (metaInfo.isSubclassOf("Qt/Item", 4, 6))
instance = Internal::QmlGraphicsItemNodeInstance::create(metaInfo, context, objectToBeWrapped); instance = Internal::QmlGraphicsItemNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/QWidget", 4, 6))
instance = Internal::WidgetNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/QGraphicsScene", 4, 6)) else if (metaInfo.isSubclassOf("Qt/QGraphicsScene", 4, 6))
instance = Internal::GraphicsSceneNodeInstance::create(metaInfo, context, objectToBeWrapped); instance = Internal::GraphicsSceneNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/Component", 4, 6)) else if (metaInfo.isSubclassOf("Qt/Component", 4, 6))
@@ -156,10 +160,9 @@ Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMet
instance = Internal::BehaviorNodeInstance::create(metaInfo, context, objectToBeWrapped); instance = Internal::BehaviorNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/QtObject", 4, 6)) else if (metaInfo.isSubclassOf("Qt/QtObject", 4, 6))
instance = Internal::ObjectNodeInstance::create(metaInfo, context, objectToBeWrapped); instance = Internal::ObjectNodeInstance::create(metaInfo, context, objectToBeWrapped);
else
instance = Internal::DummyNodeInstance::create();
if (instance.isNull()) {
instance = Internal::DummyNodeInstance::create(metaInfo, context);
}
return instance; return instance;
} }

View File

@@ -401,8 +401,6 @@ void NodeInstanceView::loadNodes(const QList<ModelNode> &nodeList)
// TODO: Set base state as current model state // TODO: Set base state as current model state
void NodeInstanceView::loadModel(Model *model) void NodeInstanceView::loadModel(Model *model)
{ {
Q_ASSERT(rootModelNode().isValid());
removeAllInstanceNodeRelationships(); removeAllInstanceNodeRelationships();
engine()->rootContext()->setBaseUrl(model->fileUrl()); engine()->rootContext()->setBaseUrl(model->fileUrl());
@@ -602,7 +600,6 @@ void NodeInstanceView::emitParentChanged(QObject *child)
NodeInstance NodeInstanceView::loadNode(const ModelNode &node, QObject *objectToBeWrapped) NodeInstance NodeInstanceView::loadNode(const ModelNode &node, QObject *objectToBeWrapped)
{ {
Q_ASSERT(node.isValid());
NodeInstance instance(NodeInstance::create(this, node, objectToBeWrapped)); NodeInstance instance(NodeInstance::create(this, node, objectToBeWrapped));
insertInstanceNodeRelationship(node, instance); insertInstanceNodeRelationship(node, instance);

View File

@@ -95,7 +95,7 @@ public:
NodeInstanceView *nodeInstanceView() const; NodeInstanceView *nodeInstanceView() const;
void setNodeInstanceView(NodeInstanceView *view); void setNodeInstanceView(NodeInstanceView *view);
void initializePropertyWatcher(const Pointer &objectNodeInstance); virtual void initializePropertyWatcher(const Pointer &objectNodeInstance);
virtual void paint(QPainter *painter) const; virtual void paint(QPainter *painter) const;
virtual bool isTopLevel() const; virtual bool isTopLevel() const;

View File

@@ -250,7 +250,7 @@ A node might become invalid if e.g. it or one of its ancestors is deleted.
*/ */
bool ModelNode::isValid() const bool ModelNode::isValid() const
{ {
return !m_model.isNull() && !m_view.isNull() && m_internalNode &&m_internalNode->isValid(); return !m_model.isNull() && !m_view.isNull() && m_internalNode &&m_internalNode->isValid() /*&& model()->metaInfo().hasNodeMetaInfo(m_internalNode->type(), m_internalNode->majorVersion(), m_internalNode->minorVersion())*/;
} }
/*! /*!

View File

@@ -45,7 +45,7 @@ namespace QmlDesigner {
bool QmlItemNode::isValid() const bool QmlItemNode::isValid() const
{ {
return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isSubclassOf("Qt/Item", 4, 6); return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().isSubclassOf("Qt/Item", 4, 6);
} }
bool QmlItemNode::isRootNode() const bool QmlItemNode::isRootNode() const

View File

@@ -228,6 +228,7 @@ void QmlModelState::setName(const QString &name)
bool QmlModelState::isValid() const bool QmlModelState::isValid() const
{ {
return QmlModelNodeFacade::isValid() && return QmlModelNodeFacade::isValid() &&
modelNode().metaInfo().isValid() &&
(modelNode().metaInfo().isSubclassOf("Qt/State", 4, 6) || isBaseState()); (modelNode().metaInfo().isSubclassOf("Qt/State", 4, 6) || isBaseState());
} }