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);
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.sort();
m_listChanged = true;

View File

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

View File

@@ -165,7 +165,9 @@ void IdItemDelegate::paint(QPainter *painter,
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 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 (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
int pixmapSide = 16;

View File

@@ -38,16 +38,12 @@ namespace QmlDesigner {
namespace Internal {
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);
}
@@ -104,17 +100,10 @@ QStringList DummyNodeInstance::localProperties()
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 QmlDesigner

View File

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

View File

@@ -132,7 +132,13 @@ Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMet
{
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);
else if (metaInfo.isSubclassOf("Qt/QDeclarativeView", 4, 6))
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);
else if (metaInfo.isSubclassOf("Qt/Item", 4, 6))
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))
instance = Internal::GraphicsSceneNodeInstance::create(metaInfo, context, objectToBeWrapped);
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);
else if (metaInfo.isSubclassOf("Qt/QtObject", 4, 6))
instance = Internal::ObjectNodeInstance::create(metaInfo, context, objectToBeWrapped);
else
instance = Internal::DummyNodeInstance::create();
if (instance.isNull()) {
instance = Internal::DummyNodeInstance::create(metaInfo, context);
}
return instance;
}

View File

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

View File

@@ -95,7 +95,7 @@ public:
NodeInstanceView *nodeInstanceView() const;
void setNodeInstanceView(NodeInstanceView *view);
void initializePropertyWatcher(const Pointer &objectNodeInstance);
virtual void initializePropertyWatcher(const Pointer &objectNodeInstance);
virtual void paint(QPainter *painter) 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
{
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
{
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

View File

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