void ComponentView::searchForComponentAndAddToList(const ModelNode &node) { QList<ModelNode> nodeList; nodeList.append(node); nodeList.append(node.allSubModelNodes()); foreach (const ModelNode &node, nodeList) { if (node.nodeSourceType() == ModelNode::ComponentSource) { if (!node.id().isEmpty()) { QStandardItem *item = new QStandardItem(node.id()); item->setData(QVariant::fromValue(node), ModelNodeRole); item->setEditable(false); removeSingleNodeFromList(node); //remove node if already present m_standardItemModel->appendRow(item); } else { QString description; ModelNode parentNode = node.parentProperty().parentModelNode(); if (parentNode.isValid()) if (!parentNode.id().isEmpty()) description = node.parentProperty().parentModelNode().id() + QLatin1Char(' '); else description = node.parentProperty().parentModelNode().simplifiedTypeName() + QLatin1Char(' '); description += node.parentProperty().name(); QStandardItem *item = new QStandardItem(description); item->setData(QVariant::fromValue(node), ModelNodeRole); item->setEditable(false); removeSingleNodeFromList(node); //remove node if already present m_standardItemModel->appendRow(item); } } } }
void TestPropertyEditor::createSubNode() { std::auto_ptr<QWidget> widget(new QWidget()); QScopedPointer<Model> model(Model::create("import Qt 4.6\n Item {}")); QVERIFY(model.data()); QScopedPointer<TestView> view(new TestView); QVERIFY(view.data()); model->attachView(view.data()); setupPropertyEditor(widget.get(), model.data()); QVERIFY(view->rootModelNode().isValid()); selectThrough(view->rootModelNode()); ModelNode childNode = view->createModelNode("Qt/Rectangle", 4, 6); view->rootModelNode().nodeListProperty("data").reparentHere(childNode); QVERIFY(childNode.isValid()); QVERIFY(view->rootModelNode().allDirectSubModelNodes().contains(childNode)); QVERIFY(childNode.parentProperty().parentModelNode() == view->rootModelNode()); QCOMPARE(childNode.type(), QString("Qt/Rectangle")); selectThrough(childNode); QVERIFY(childNode.id().isEmpty()); childNode.setId("Blah"); QCOMPARE(childNode.id(), QString("Blah")); QCOMPARE(childNode.id(), QString("Blah")); }
QWidget *ConnectionDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QWidget *widget = QStyledItemDelegate::createEditor(parent, option, index); const ConnectionModel *connectionModel = qobject_cast<const ConnectionModel*>(index.model()); ConnectionComboBox *connectionComboBox = qobject_cast<ConnectionComboBox*>(widget); if (!connectionModel) { qWarning() << "ConnectionDelegate::createEditor no model"; return widget; } if (!connectionModel->connectionView()) { qWarning() << "ConnectionDelegate::createEditor no connection view"; return widget; } if (!connectionComboBox) { qWarning() << "ConnectionDelegate::createEditor no bindingComboBox"; return widget; } switch (index.column()) { case ConnectionModel::TargetModelNodeRow: { foreach (const ModelNode &modelNode, connectionModel->connectionView()->allModelNodes()) { if (!modelNode.id().isEmpty()) { connectionComboBox->addItem(modelNode.id()); } } } break; case ConnectionModel::TargetPropertyNameRow: { connectionComboBox->addItems(prependOnForSignalHandler(connectionModel->getSignalsForRow(index.row()))); } break; case ConnectionModel::SourceRow: { ModelNode rootModelNode = connectionModel->connectionView()->rootModelNode(); if (QmlItemNode::isValidQmlItemNode(rootModelNode) && !rootModelNode.id().isEmpty()) { QString itemText = tr("Change to default state"); QString source = QString::fromLatin1("{ %1.state = \"\" }").arg(rootModelNode.id()); connectionComboBox->addItem(itemText, source); connectionComboBox->disableValidator(); foreach (const QmlModelState &state, QmlItemNode(rootModelNode).states().allStates()) { QString itemText = tr("Change state to %1").arg(state.name()); QString source = QString::fromLatin1("{ %1.state = \"%2\" }").arg(rootModelNode.id()).arg(state.name()); connectionComboBox->addItem(itemText, source); } } connectionComboBox->disableValidator(); } break; default: qWarning() << "ConnectionDelegate::createEditor column" << index.column(); }
void TestPropertyEditor::createRect() { try { std::auto_ptr<QWidget> widget(new QWidget()); QScopedPointer<Model> model(Model::create("import Qt 4.6\n Item {}")); QVERIFY(model.data()); QScopedPointer<TestView> view(new TestView); QVERIFY(view.data()); model->attachView(view.data()); setupPropertyEditor(widget.get(), model.data()); QVERIFY(view->rootModelNode().isValid()); //selectThrough(view->rootModelNode()); ModelNode childNode = view->createModelNode("Qt/Rectangle", 4, 6); view->rootModelNode().nodeListProperty("data").reparentHere(childNode); QVERIFY(childNode.isValid()); QVERIFY(view->rootModelNode().allDirectSubModelNodes().contains(childNode)); QVERIFY(childNode.parentProperty().parentModelNode() == view->rootModelNode()); QCOMPARE(childNode.type(), QString("Qt/Rectangle")); QVERIFY(childNode.id().isEmpty()); childNode.setId("Rect01"); QCOMPARE(childNode.id(), QString("Rect01")); childNode.variantProperty("x") = 100; QCOMPARE(QmlObjectNode(childNode).instanceValue("x").toInt(), 100); childNode.variantProperty("y") = 100; QCOMPARE(QmlObjectNode(childNode).instanceValue("y").toInt(), 100); childNode.variantProperty("width") = 100; QCOMPARE(QmlObjectNode(childNode).instanceValue("width").toInt(), 100); childNode.variantProperty("height") = 100; QCOMPARE(QmlObjectNode(childNode).instanceValue("height").toInt(), 100); selectThrough(childNode); QCOMPARE(childNode.propertyNames().count(), 4); QCOMPARE(childNode.variantProperty("scale").value(), QVariant()); } catch (Exception &) { QFAIL("Exception thrown"); } }
static inline QString componentIdForModelNode(const ModelNode &modelNode) { if (modelNode.id().isEmpty()) { if (modelNode.hasParentProperty() && modelNode.parentProperty().name() != "data" && modelNode.parentProperty().name() != "children") { return modelNode.parentProperty().name(); } else { return modelNode.simplifiedTypeName(); } } else { return modelNode.id(); } }
static QString getDisplayString(const QModelIndex &modelIndex, NavigatorTreeModel *navigatorTreeModel) { ModelNode modelNode = navigatorTreeModel->nodeForIndex(modelIndex); if (modelNode.hasId()) return modelNode.id(); return modelNode.simplifiedTypeName(); }
void NameItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { ModelNode node = m_navigatorTreeModel->nodeForIndex(index); QString value = node.id(); QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); lineEdit->setText(value); }
void DesignDocument::changeToSubComponentAndPushOnCrumblePath(const ModelNode &componentNode) { if (QmlDesignerPlugin::instance()->currentDesignDocument() != this) return; changeToSubComponent(componentNode); QmlDesignerPlugin::instance()->viewManager().pushInFileComponentOnCrambleBar(componentNode.id()); }
void NavigatorTreeModel::updateItemRow(const ModelNode &node, ItemRow items) { bool blockSignal = blockItemChangedSignal(true); items.idItem->setText(node.id()); items.visibilityItem->setCheckState(node.auxiliaryData("invisible").toBool() ? Qt::Unchecked : Qt::Checked); blockItemChangedSignal(blockSignal); }
void NameItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (option.state & QStyle::State_Selected) drawSelectionBackground(painter, option); QString displayString; QPoint displayStringOffset; painter->save(); QFontMetrics fm(option.font); int width = 0; if (index.data(Qt::UserRole).isValid()) { int pixmapSide = 16; if (m_TreeModel->isNodeInvisible( index )) painter->setOpacity(0.5); ModelNode node = m_TreeModel->nodeForIndex(index); QIcon icon; if (node.isValid()) { // if node has no own icon, search for it in the itemlibrary const ItemLibraryInfo *libraryInfo = node.model()->metaInfo().itemLibraryInfo(); QList <ItemLibraryEntry> infoList = libraryInfo->entriesForType(node.type(), node.majorVersion(), node.minorVersion()); foreach (const ItemLibraryEntry &entry, infoList) { if (icon.isNull()) { icon = entry.icon(); break; } } } // if the library was also empty, use the default icon if (icon.isNull()) icon = QIcon(QLatin1String(":/ItemLibrary/images/item-default-icon.png")); if (!node.metaInfo().isValid()) icon = QIcon(QLatin1String(":/ItemLibrary/images/item-invalid-icon.png")); // If no icon is present, leave an empty space of 24 pixels anyway QPixmap pixmap = icon.pixmap(pixmapSide, pixmapSide); painter->drawPixmap(option.rect.x()+1,option.rect.y()+2,pixmap); displayString = node.id(); if (displayString.isEmpty()) displayString = node.simplifiedTypeName(); // Check text length does not exceed available space int extraSpace=12+pixmapSide; displayString = fm.elidedText(displayString,Qt::ElideMiddle,option.rect.width()-extraSpace); displayStringOffset = QPoint(5+pixmapSide,-5); width = fm.width(displayString); }
QString ComponentView::descriptionForNode(const ModelNode &node) const { QString description; if (!node.id().isEmpty()) { description = node.id(); } else if (node.hasParentProperty()) { ModelNode parentNode = node.parentProperty().parentModelNode(); if (parentNode.id().isEmpty()) description = parentNode.simplifiedTypeName() + QLatin1Char(' '); else description = parentNode.id() + QLatin1Char(' '); description += node.parentProperty().name(); } return description; }
QString QmlTextGenerator::propertiesToQml(const ModelNode &node, int indentDepth) const { QString topPart; QString bottomPart; QStringList nodePropertyNames = node.propertyNames(); bool addToTop = true; foreach (const QString &propertyName, m_propertyOrder) { if (QLatin1String("id") == propertyName) { // the model handles the id property special, so: if (!node.id().isEmpty()) { QString idLine(indentDepth, QLatin1Char(' ')); idLine += QLatin1String("id: "); idLine += node.id(); idLine += QLatin1Char('\n'); if (addToTop) topPart.append(idLine); else bottomPart.append(idLine); } } else if (propertyName.isEmpty()) { addToTop = false; } else if (nodePropertyNames.removeAll(propertyName)) { const QString newContent = propertyToQml(node.property(propertyName), indentDepth); if (addToTop) topPart.append(newContent); else bottomPart.append(newContent); } } foreach (const QString &propertyName, nodePropertyNames) { bottomPart.prepend(propertyToQml(node.property(propertyName), indentDepth)); }
static void inspectPropertyEditor(ModelNode node, QWidget* propWidget) { if (!propWidget) return; QStackedWidget * stackedWidget = qobject_cast<QStackedWidget *> (propWidget); QVERIFY(stackedWidget); QDeclarativeView *view = qobject_cast<QDeclarativeView*>(stackedWidget->currentWidget()); QVERIFY(view); QLineEdit * idLineEdit = view->findChild<QLineEdit* >("IdLineEdit"); if (!idLineEdit) return ; QCOMPARE(idLineEdit->text(), node.id()); if (node.hasProperty("width")) { QSpinBox * widthSpinBox = view->findChild<QSpinBox* >("WidthSpinBox"); QVERIFY(widthSpinBox); QCOMPARE(widthSpinBox->value(), node.variantProperty("width").value().toInt()); } if (node.hasProperty("height")) { QSpinBox * heightSpinBox = view->findChild<QSpinBox* >("HeightSpinBox"); QVERIFY(heightSpinBox); QCOMPARE(heightSpinBox->value(), node.variantProperty("height").value().toInt());// this can be dangerous } if (node.hasProperty("x")) { QSpinBox * xSpinBox = view->findChild<QSpinBox* >("XSpinBox"); QVERIFY(xSpinBox); QCOMPARE(xSpinBox->value(), node.variantProperty("x").value().toInt()); // this can be dangerous } if (node.hasProperty("y")) { QSpinBox * ySpinBox = view->findChild<QSpinBox* >("YSpinBox"); QVERIFY(ySpinBox); QCOMPARE(ySpinBox->value(), node.variantProperty("y").value().toInt()); } }
void PropertyEditorContextObject::toogleExportAlias() { if (!m_model || !m_model->rewriterView()) return; /* Ideally we should not missuse the rewriterView * If we add more code here we have to forward the property editor view */ RewriterView *rewriterView = m_model->rewriterView(); if (rewriterView->selectedModelNodes().isEmpty()) return; const ModelNode selectedNode = rewriterView->selectedModelNodes().constFirst(); if (QmlObjectNode::isValidQmlObjectNode(selectedNode)) { QmlObjectNode objectNode(selectedNode); PropertyName modelNodeId = selectedNode.id().toUtf8(); ModelNode rootModelNode = rewriterView->rootModelNode(); try { RewriterTransaction transaction = rewriterView->beginRewriterTransaction(QByteArrayLiteral("PropertyEditorContextObject:toogleExportAlias")); if (!objectNode.isAliasExported()) objectNode.ensureAliasExport(); else if (rootModelNode.hasProperty(modelNodeId)) rootModelNode.removeProperty(modelNodeId); transaction.commit(); } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail exception.showException(); } } }
static void selectThrough(ModelNode node, QWidget* propWidget = 0) { QVERIFY(node.isValid()); int numberOfProperties = node.propertyNames().count(); QList<AbstractProperty> properties = node.properties(); node.view()->clearSelectedModelNodes(); node.view()->selectModelNode(node); QString name = node.id(); qApp->processEvents(); QTest::qSleep(100); qApp->processEvents(); QTest::qSleep(100); qApp->processEvents(); inspectPropertyEditor(node, propWidget); //selecting should not effect any properties at all! QCOMPARE(node.propertyNames().count(), numberOfProperties); foreach (const AbstractProperty &property, properties) if (property.isVariantProperty()) { QCOMPARE(property.toVariantProperty().value(), node.variantProperty(property.name()).value()); } QList<ModelNode> childNodes = node.allDirectSubModelNodes(); foreach (const ModelNode &childNode, childNodes) selectThrough(childNode, propWidget); }
void NavigatorTreeModel::handleChangedItem(QStandardItem *item) { if (m_blockItemChangedSignal) return; uint nodeHash = item->data(Qt::UserRole).toUInt(); Q_ASSERT(nodeHash && containsNodeHash(nodeHash)); ModelNode node = nodeForHash(nodeHash); ItemRow itemRow = itemRowForNode(node); if (item == itemRow.idItem) { try { node.setId(item->text()); } catch (InvalidIdException &e) { QMessageBox::warning(0, tr("Invalid Id"), e.description()); item->setText(node.id()); } } else if (item == itemRow.visibilityItem) { bool invisible = (item->checkState() == Qt::Unchecked); node.setAuxiliaryData("invisible", invisible); propagateInvisible(node,isNodeInvisible(node)); } }
void QmlModelStateOperation::setTarget(const ModelNode &target) { modelNode().bindingProperty("target").setExpression(target.id()); }
static void syncId(ModelNode &outputNode, const ModelNode &inputNode, const QHash<QString, QString> &idRenamingHash) { if (!inputNode.id().isEmpty()) { outputNode.setId(idRenamingHash.value(inputNode.id())); } }