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 &current)
{
	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);
}
Exemple #5
0
	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;
	}
Exemple #6
0
	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;
	}