void GNEConnectorFrame::handleLaneClick(GNELane* lane, bool mayDefinitelyPass, bool allowConflict, bool toggle) { if (myCurrentLane == 0) { myCurrentLane = lane; myCurrentLane->setSpecialColor(&sourceColor); initTargets(); buildIinternalLanes(lane->getParentEdge().getNBEdge()->getToNode()); myNumChanges = 0; myViewNet->getUndoList()->p_begin("modify connections"); } else if (myPotentialTargets.count(lane) || allowConflict) { const unsigned int fromIndex = myCurrentLane->getIndex(); GNEEdge& srcEdge = myCurrentLane->getParentEdge(); GNEEdge& destEdge = lane->getParentEdge(); const std::string& destEdgeID = destEdge.getMicrosimID(); std::vector<NBEdge::Connection> connections = srcEdge.getNBEdge()->getConnectionsFromLane(fromIndex); bool changed = false; NBConnection deletedConnection = NBConnection::InvalidConnection; LaneStatus status = getLaneStatus(connections, lane); if (status == CONFLICTED && allowConflict) { status = UNCONNECTED; } switch (status) { case UNCONNECTED: if (toggle) { myViewNet->getUndoList()->add(new GNEChange_Connection(&srcEdge, fromIndex, destEdgeID, lane->getIndex(), mayDefinitelyPass, true), true); lane->setSpecialColor(mayDefinitelyPass ? &targetPassColor : &targetColor); changed = true; } break; case CONNECTED: case CONNECTED_PASS: myViewNet->getUndoList()->add(new GNEChange_Connection(&srcEdge, fromIndex, destEdgeID, lane->getIndex(), status == CONNECTED_PASS, false), true); lane->setSpecialColor(&potentialTargetColor); changed = true; deletedConnection = NBConnection(srcEdge.getNBEdge(), fromIndex, destEdge.getNBEdge(), lane->getIndex(), (int)getTLLLinkNumber(connections, lane)); break; case CONFLICTED: myViewNet->setStatusBarText("Another lane from the same edge already connects to that lane"); break; } if (changed) { myNumChanges += 1; GNEJunction* affected = myViewNet->getNet()->retrieveJunction(srcEdge.getDest()->getMicrosimID()); affected->invalidateTLS(myViewNet->getUndoList(), deletedConnection); buildIinternalLanes(myCurrentLane->getParentEdge().getNBEdge()->getToNode()); } } else { myViewNet->setStatusBarText("Invalid target for connection"); } updateDescription(); }
long GNETLSEditorFrame::onCmdDefSwitch(FXObject*, FXSelector, void*) { assert(myCurrentJunction != 0); assert((int)myDefinitions.size() == myProgramComboBox->getNumItems()); NBTrafficLightDefinition* tlDef = myDefinitions[myProgramComboBox->getCurrentItem()]; // logic may not have been recomputed yet. recompute to be sure NBTrafficLightLogicCont& tllCont = myViewNet->getNet()->getTLLogicCont(); myViewNet->getNet()->computeJunction(myCurrentJunction); NBTrafficLightLogic* tllogic = tllCont.getLogic(tlDef->getID(), tlDef->getProgramID()); if (tllogic != 0) { // now we can be sure that the tlDef is up to date (i.e. re-guessed) buildIinternalLanes(tlDef); // create working copy from original def delete myEditedDef; myEditedDef = new NBLoadedSUMOTLDef(tlDef, tllogic); myOffset->setText(toString(STEPS2TIME(myEditedDef->getLogic()->getOffset())).c_str()); initPhaseTable(); updateCycleDuration(); } else { // tlDef has no valid logic (probably because id does not control any links onCmdCancel(0, 0, 0); myViewNet->setStatusBarText("Traffic light does not control any links"); } return 1; }
void GNEConnectorFrame::cleanup() { // clean up for (std::set<GNELane*>::iterator it = myPotentialTargets.begin(); it != myPotentialTargets.end(); it++) { (*it)->setSpecialColor(0); } myPotentialTargets.clear(); myNumChanges = 0; myCurrentLane->setSpecialColor(0); myCurrentLane = 0; buildIinternalLanes(0); // only clears updateDescription(); }
void GNETLSEditorFrame::cleanup() { if (myCurrentJunction) { myCurrentJunction->selectTLS(false); } // clean data structures myCurrentJunction = 0; myHaveModifications = false; delete myEditedDef; myEditedDef = 0; buildIinternalLanes(0); // only clears // clean up controls myOffset->setText(""); myDefinitions.clear(); myDefBox->hide(); initPhaseTable(); // only clears when there are no definitions myCycleDuration->hide(); updateDescription(); }