void QuickItemDelegate::setTextColor(const QVariant &textColor, const QPersistentModelIndex &index) { if (!index.isValid()) return; m_colors[index] = textColor.value<QColor>(); for (int i = 0; i < m_view->model()->columnCount(); i++) m_view->update(index.sibling(index.row(), i)); }
void QuickItemDelegate::setTextColor(const QVariant &textColor) { const QPersistentModelIndex index = sender()->property("index").value<QPersistentModelIndex>(); if (!index.isValid()) { return; } m_colors[index] = textColor.value<QColor>(); for (int i = 0; i < m_view->model()->columnCount(); i++) { m_view->update(index.sibling(index.row(), i)); } }
void EditorViewMViface::handleAddingSequenceForRowsInserted(const QModelIndex &parent , Element *elem, const QPersistentModelIndex ¤t) { if (item(parent)) { elem->setParentItem(item(parent)); QModelIndex next = current.sibling(current.row() + 1, 0); if(next.isValid() && item(next) != nullptr) { elem->stackBefore(item(next)); } } else { mScene->addItem(elem); } }
void EditorViewMViface::rowsInserted(QModelIndex const &parent, int start, int end) { for (int row = start; row <= end; ++row) { mScene->setEnabled(true); QPersistentModelIndex current = model()->index(row, 0, parent); if (!isDescendentOf(current, rootIndex())) continue; Id currentId = current.data(roles::idRole).value<Id>(); if (currentId == Id::rootId()) continue; Id parentUuid; if (parent != rootIndex()) parentUuid = parent.data(roles::idRole).value<Id>(); if (!parent.isValid()) { setRootIndex(current); continue; } Element* elem = mScene->mainWindow()->manager()->graphicalObject(currentId); if (elem) { elem->setAssistApi(mGraphicalAssistApi, mLogicalAssistApi); } QPointF ePos = model()->data(current, roles::positionRole).toPointF(); bool needToProcessChildren = true; if (elem) { elem->setPos(ePos); //задаем позицию до определения родителя для того, чтобы правильно отработал itemChange elem->setId(currentId); /*commented out because of real sizes of elements are incorrectly changing here into initial sizes*/ // NodeElement* nodeElement = dynamic_cast<NodeElement*>(elem); // if (nodeElement) // nodeElement->storeGeometry(); if (item(parent) != NULL) { elem->setParentItem(item(parent)); QModelIndex next = current.sibling(current.row() + 1, 0); if(next.isValid() && item(next) != NULL) { elem->stackBefore(item(next)); } } else { mScene->addItem(elem); } setItem(current, elem); elem->updateData(); elem->connectToPort(); elem->checkConnectionsToPort(); elem->initPossibleEdges(); elem->initTitles(); // elem->initEmbeddedControls(); //todo: нужно привести в порядок всякие init~() bool isEdgeFromEmbeddedLinker = false; QList<QGraphicsItem*> selectedItems = mScene->selectedItems(); if (selectedItems.size() == 1) { NodeElement* master = dynamic_cast<NodeElement*>(selectedItems.at(0)); if (master && master->connectionInProgress()) { isEdgeFromEmbeddedLinker = true; } } if (!isEdgeFromEmbeddedLinker) { mScene->clearSelection(); elem->setSelected(true); } NodeElement* nodeElem = dynamic_cast<NodeElement*>(elem); if (nodeElem && currentId.element() == "Class" && mGraphicalAssistApi->children(currentId).empty()) { needToProcessChildren = false; for (int i = 0; i < 2; i++) { QString curChildElementType; if (i == 0) curChildElementType = "MethodsContainer"; else curChildElementType = "FieldsContainer"; Id newUuid = Id("Kernel_metamodel", "Kernel", curChildElementType, QUuid::createUuid().toString()); mGraphicalAssistApi->createElement(currentId, newUuid, false, "(anonymous something)", QPointF(0, 0)); } } } if (needToProcessChildren && model()->hasChildren(current)) rowsInserted(current, 0, model()->rowCount(current) - 1); NodeElement * nodeElement = dynamic_cast<NodeElement*>(elem); if (nodeElement) nodeElement->alignToGrid(); } QAbstractItemView::rowsInserted(parent, start, end); }
QModelIndex cast( NifModel * nif, const QModelIndex & index ) override final { QPersistentModelIndex idx = index; QPersistentModelIndex iData = nif->getBlock( nif->getLink( idx, "Data" ), "NiTriShapeData" ); if ( !iData.isValid() ) return idx; QVector<Triangle> triangles; QModelIndex iTriangles = nif->getIndex( iData, "Triangles" ); if ( !iTriangles.isValid() ) return idx; int skip = 0; for ( int t = 0; t < nif->rowCount( iTriangles ); t++ ) { Triangle tri = nif->get<Triangle>( iTriangles.child( t, 0 ) ); if ( tri[0] != tri[1] && tri[1] != tri[2] && tri[2] != tri[0] ) triangles.append( tri ); else skip++; } //qDebug() << "num triangles" << triangles.count() << "skipped" << skip; QList<QVector<quint16> > strips = stripify( triangles ); if ( strips.count() <= 0 ) return idx; nif->insertNiBlock( "NiTriStripsData", nif->getBlockNumber( idx ) + 1 ); QModelIndex iStripData = nif->getBlock( nif->getBlockNumber( idx ) + 1, "NiTriStripsData" ); if ( iStripData.isValid() ) { copyValue<int>( nif, iStripData, iData, "Num Vertices" ); nif->set<int>( iStripData, "Has Vertices", 1 ); copyArray<Vector3>( nif, iStripData, iData, "Vertices" ); copyValue<int>( nif, iStripData, iData, "Has Normals" ); copyArray<Vector3>( nif, iStripData, iData, "Normals" ); copyValue<int>( nif, iStripData, iData, "TSpace Flag" ); copyArray<Vector3>( nif, iStripData, iData, "Bitangents" ); copyArray<Vector3>( nif, iStripData, iData, "Tangents" ); copyValue<int>( nif, iStripData, iData, "Has Vertex Colors" ); copyArray<Color4>( nif, iStripData, iData, "Vertex Colors" ); copyValue<int>( nif, iStripData, iData, "Has UV" ); copyValue<int>( nif, iStripData, iData, "Num UV Sets" ); copyValue<int>( nif, iStripData, iData, "BS Num UV Sets" ); copyValue<int>( nif, iStripData, iData, "Num UV Sets 2" ); QModelIndex iDstUV = nif->getIndex( iStripData, "UV Sets" ); QModelIndex iSrcUV = nif->getIndex( iData, "UV Sets" ); if ( iDstUV.isValid() && iSrcUV.isValid() ) { nif->updateArray( iDstUV ); for ( int r = 0; r < nif->rowCount( iDstUV ); r++ ) { copyArray<Vector2>( nif, iDstUV.child( r, 0 ), iSrcUV.child( r, 0 ) ); } } iDstUV = nif->getIndex( iStripData, "UV Sets 2" ); iSrcUV = nif->getIndex( iData, "UV Sets 2" ); if ( iDstUV.isValid() && iSrcUV.isValid() ) { nif->updateArray( iDstUV ); for ( int r = 0; r < nif->rowCount( iDstUV ); r++ ) { copyArray<Vector2>( nif, iDstUV.child( r, 0 ), iSrcUV.child( r, 0 ) ); } } copyValue<Vector3>( nif, iStripData, iData, "Center" ); copyValue<float>( nif, iStripData, iData, "Radius" ); nif->set<int>( iStripData, "Num Strips", strips.count() ); nif->set<int>( iStripData, "Has Points", 1 ); QModelIndex iLengths = nif->getIndex( iStripData, "Strip Lengths" ); QModelIndex iPoints = nif->getIndex( iStripData, "Points" ); if ( iLengths.isValid() && iPoints.isValid() ) { nif->updateArray( iLengths ); nif->updateArray( iPoints ); int x = 0; int z = 0; for ( const QVector<quint16>& strip : strips ) { nif->set<int>( iLengths.child( x, 0 ), strip.count() ); QModelIndex iStrip = iPoints.child( x, 0 ); nif->updateArray( iStrip ); nif->setArray<quint16>( iStrip, strip ); x++; z += strip.count() - 2; } nif->set<int>( iStripData, "Num Triangles", z ); nif->setData( idx.sibling( idx.row(), NifModel::NameCol ), "NiTriStrips" ); int lnk = nif->getLink( idx, "Data" ); nif->setLink( idx, "Data", nif->getBlockNumber( iStripData ) ); nif->removeNiBlock( lnk ); } } return idx; }
QModelIndex cast( NifModel * nif, const QModelIndex & index ) override final { QPersistentModelIndex idx = index; QPersistentModelIndex iStripData = nif->getBlock( nif->getLink( idx, "Data" ), "NiTriStripsData" ); if ( !iStripData.isValid() ) return idx; QList<QVector<quint16> > strips; QModelIndex iPoints = nif->getIndex( iStripData, "Points" ); if ( !iPoints.isValid() ) return idx; for ( int s = 0; s < nif->rowCount( iPoints ); s++ ) { QVector<quint16> strip; QModelIndex iStrip = iPoints.child( s, 0 ); for ( int p = 0; p < nif->rowCount( iStrip ); p++ ) strip.append( nif->get<int>( iStrip.child( p, 0 ) ) ); strips.append( strip ); } QVector<Triangle> triangles = triangulate( strips ); nif->insertNiBlock( "NiTriShapeData", nif->getBlockNumber( idx ) + 1 ); QModelIndex iTriData = nif->getBlock( nif->getBlockNumber( idx ) + 1, "NiTriShapeData" ); if ( iTriData.isValid() ) { copyValue<int>( nif, iTriData, iStripData, "Num Vertices" ); nif->set<int>( iTriData, "Has Vertices", 1 ); copyArray<Vector3>( nif, iTriData, iStripData, "Vertices" ); copyValue<int>( nif, iTriData, iStripData, "Has Normals" ); copyArray<Vector3>( nif, iTriData, iStripData, "Normals" ); copyValue<int>( nif, iTriData, iStripData, "TSpace Flag" ); copyArray<Vector3>( nif, iTriData, iStripData, "Bitangents" ); copyArray<Vector3>( nif, iTriData, iStripData, "Tangents" ); copyValue<int>( nif, iTriData, iStripData, "Has Vertex Colors" ); copyArray<Color4>( nif, iTriData, iStripData, "Vertex Colors" ); copyValue<int>( nif, iTriData, iStripData, "Has UV" ); copyValue<int>( nif, iTriData, iStripData, "Num UV Sets" ); copyValue<int>( nif, iTriData, iStripData, "BS Num UV Sets" ); copyValue<int>( nif, iTriData, iStripData, "Num UV Sets 2" ); QModelIndex iDstUV = nif->getIndex( iTriData, "UV Sets" ); QModelIndex iSrcUV = nif->getIndex( iStripData, "UV Sets" ); if ( iDstUV.isValid() && iSrcUV.isValid() ) { nif->updateArray( iDstUV ); for ( int r = 0; r < nif->rowCount( iDstUV ); r++ ) { copyArray<Vector2>( nif, iDstUV.child( r, 0 ), iSrcUV.child( r, 0 ) ); } } iDstUV = nif->getIndex( iTriData, "UV Sets 2" ); iSrcUV = nif->getIndex( iStripData, "UV Sets 2" ); if ( iDstUV.isValid() && iSrcUV.isValid() ) { nif->updateArray( iDstUV ); for ( int r = 0; r < nif->rowCount( iDstUV ); r++ ) { copyArray<Vector2>( nif, iDstUV.child( r, 0 ), iSrcUV.child( r, 0 ) ); } } copyValue<Vector3>( nif, iTriData, iStripData, "Center" ); copyValue<float>( nif, iTriData, iStripData, "Radius" ); nif->set<int>( iTriData, "Num Triangles", triangles.count() ); nif->set<int>( iTriData, "Num Triangle Points", triangles.count() * 3 ); nif->set<int>( iTriData, "Has Triangles", 1 ); QModelIndex iTriangles = nif->getIndex( iTriData, "Triangles" ); if ( iTriangles.isValid() ) { nif->updateArray( iTriangles ); nif->setArray<Triangle>( iTriangles, triangles ); } nif->setData( idx.sibling( idx.row(), NifModel::NameCol ), "NiTriShape" ); int lnk = nif->getLink( idx, "Data" ); nif->setLink( idx, "Data", nif->getBlockNumber( iTriData ) ); nif->removeNiBlock( lnk ); } return idx; }