void CircuitICNDocument::slotAssignNodeGroups() { ICNDocument::slotAssignNodeGroups(); const ECNodeMap::iterator end = m_ecNodeList.end(); for ( ECNodeMap::iterator it = m_ecNodeList.begin(); it != end; ++it ) { NodeGroup *ng = createNodeGroup ( *it ); if ( ng ) ng->init(); } // We've destroyed the old node groups, so any collapsed flowcontainers // containing new node groups need to update them to make them invisible. const ItemMap::const_iterator itemListEnd = m_itemList.end(); for ( ItemMap::const_iterator it = m_itemList.begin(); it != itemListEnd; ++it ) { if ( FlowContainer * fc = dynamic_cast<FlowContainer*> ( *it ) ) fc->updateContainedVisibility(); } }
Connector *CircuitICNDocument::createConnector(Connector *con1, Connector *con2, const QPoint &pos1, const QPoint &pos2, QPointList *pointList ) { if ( !canConnect( con1, con2 ) ) return 0; const bool con1UsedManual = con1->usesManualPoints(); const bool con2UsedManual = con2->usesManualPoints(); QList<QPointList> oldCon1Points = con1->splitConnectorPoints(pos1); QList<QPointList> oldCon2Points = con2->splitConnectorPoints(pos2); ECNode *node1a = dynamic_cast<ECNode*> ( con1->startNode() ); ECNode *node1b = dynamic_cast<ECNode*> ( con1->endNode( ) ); ECNode *node2a = dynamic_cast<ECNode*> ( con2->startNode() ); ECNode *node2b = dynamic_cast<ECNode*> ( con2->endNode( ) ); if ( !node1a || !node1b || !node2a || !node2b ) return 0; con1->hide(); con2->hide(); // from this point forward, we are dealing with a circuit document -> all nodes are electronic ECNode *newNode1 = new JunctionNode( this, 0, pos1 ); ECNode *newNode2 = new JunctionNode( this, 0, pos2 ); Connector *con1a = newNode1->createConnector(node1a); node1a->addConnector(con1a); Connector *con1b = newNode1->createConnector(node1b); node1b->addConnector(con1b); Connector *newCon = newNode1->createConnector(newNode2); newNode2->addConnector(newCon); Connector *con2a = node2a->createConnector(newNode2); newNode2->addConnector(con2a); Connector *con2b = node2b->createConnector(newNode2); newNode2->addConnector(con2b); if(!con1a || !con1b || !con2a || !con2b ) { // This should never happen, as the canConnect function should strictly // determine whether the connectors could be created before hand. kWarning() << k_funcinfo << "Not all the connectors were created, this should never happen" << endl; if(con1a) con1a->removeConnector(); if(con1b) con1b->removeConnector(); if(con2a) con2a->removeConnector(); if(con2b) con2b->removeConnector(); newNode1->removeNode(); newNode2->removeNode(); flushDeleteList(); return 0; } con1a->setRoutePoints(oldCon1Points.at(0), con1UsedManual ); con1b->setRoutePoints(oldCon1Points.at(1), con1UsedManual ); con2a->setRoutePoints(oldCon2Points.at(0), con2UsedManual ); con2b->setRoutePoints(oldCon2Points.at(1), con2UsedManual ); QPointList autoPoints; if (!pointList) { addAllItemConnectorPoints(); ConRouter cr(this); cr.mapRoute( pos1.x(), pos1.y(), pos2.x(), pos2.y() ); autoPoints = cr.pointList(false); pointList = &autoPoints; } newCon->setRoutePoints(*pointList,true); // Avoid flicker: tell them to update their draw lists now con1->updateConnectorPoints(false); con2->updateConnectorPoints(false); newCon->updateDrawList(); con1a->updateDrawList(); con1b->updateDrawList(); con2a->updateDrawList(); con2b->updateDrawList(); // Now it's safe to remove the connectors con1->removeConnector(); con2->removeConnector(); flushDeleteList(); deleteNodeGroup(node1a); deleteNodeGroup(node1b); deleteNodeGroup(node2a); deleteNodeGroup(node2b); NodeGroup *ng = createNodeGroup(newNode1); ng->addNode( newNode2, true ); ng->init(); return newCon; }