void MoveNodeInteraction::recurseAddNodes(Feature* F) { if (Node* Pt = CAST_NODE(F)) { Moving.push_back(Pt); } else if (Way* R = CAST_WAY(F)) { if (!g_Merk_Segment_Mode) { for (int j=0; j<R->size(); ++j) if (std::find(Moving.begin(),Moving.end(),R->get(j)) == Moving.end()) { Moving.push_back(R->getNode(j)); } } else { for (int j=R->bestSegment(); j<=R->bestSegment()+1; ++j) if (std::find(Moving.begin(),Moving.end(),R->get(j)) == Moving.end()) { Moving.push_back(R->getNode(j)); } } addToNoSnap(R); } else if (Relation* L = CAST_RELATION(F)) { for (int j=0; j<L->size(); ++j) recurseAddNodes(L->get(j)); addToNoSnap(L); } }
static bool isChildOfRelation(Feature *mapFeature) { for (int i=0; i<mapFeature->sizeParents(); i++) { Relation * rel = CAST_RELATION(mapFeature->getParent(i)); if (rel && !rel->isDeleted()) return true; } return false; }
void PropertiesDock::switchUi() { if (CurrentTagView) M_PREFS->setTagListFirstColumnWidth(qMax(CurrentTagView->columnWidth(0), 20)); if (FullSelection.size() == 0) switchToNoUi(); else if (FullSelection.size() == 1) { if (FullSelection[0]->isVirtual()) switchToNoUi(); else if (CAST_NODE(FullSelection[0])) switchToNodeUi(); else if (CAST_WAY(FullSelection[0])) switchToWayUi(); else if (CAST_RELATION(FullSelection[0])) switchToRelationUi(); else switchToNoUi(); } else switchToMultiUi(); resetValues(); }
void PropertiesDock::checkMenuStatus() { bool IsPoint = false; bool IsRoad = false; bool IsRelation = false; bool IsParentRoad = false; bool IsParentRoadInner = false; bool IsParentRelation = false; bool IsParentArea = false; bool IsOpenStreetBug = false; int NumRoads = 0; int NumCommitableFeature = 0; int NumPoints = 0; int NumRelation = 0; int NumRelationChild = 0; int NumAreas = 0; int NumParents = 0; int NumChildren = 0; int NumIncomplete = 0; if (Selection.size() == 1) { IsPoint = CAST_NODE(Selection[0]) != 0; IsRoad = CAST_WAY(Selection[0]) != 0; IsRelation = CAST_RELATION(Selection[0]) != 0; IsParentRoad = IsPoint && isChildOfSingleRoad(Selection[0]); IsParentRoadInner = IsPoint && isChildOfSingleRoadInner(Selection[0]); IsParentRelation = isChildOfSingleRelation(Selection[0]); IsParentArea = isChildOfArea(Selection[0]); IsOpenStreetBug = isChildOfArea(Selection[0]); IsOpenStreetBug = IsPoint && (Selection[0]->id().type & IFeature::Special); } for (int i=0; i<Selection.size(); ++i) { if (Selection[i]->sizeParents()) ++NumParents; if (Selection[i]->size()) ++NumChildren; if (Selection[i]->notEverythingDownloaded()) ++NumIncomplete; if (CAST_NODE(Selection[i])) ++NumPoints; if (Way* R = dynamic_cast<Way*>(Selection[i])) { if (R->area() > 0.0) { ++NumAreas; } else { ++NumRoads; } } if (CAST_RELATION(Selection[i])) ++NumRelation; if (isChildOfRelation(Selection[i])) ++NumRelationChild; if (!Selection[i]->isUploadable() && !Selection[i]->isSpecial()) ++NumCommitableFeature; } #ifndef _MOBILE Main->ui->createRelationAction->setEnabled(Selection.size()); Main->ui->editRemoveAction->setEnabled(Selection.size()); Main->ui->editMoveAction->setEnabled(true); Main->ui->editReverseAction->setEnabled(IsRoad || NumAreas + NumRoads > 0); Main->ui->roadAddStreetNumbersAction->setEnabled(NumRoads >= 1); Main->ui->roadJoinAction->setEnabled(NumRoads >= 1 && canJoinRoads(this)); Main->ui->roadCreateJunctionAction->setEnabled(NumRoads > 1 && canCreateJunction(this)); Main->ui->roadSplitAction->setEnabled((IsParentRoadInner && !IsParentArea) || (NumRoads && NumPoints) || (NumAreas && NumPoints > 1)); Main->ui->roadBreakAction->setEnabled(IsParentRoadInner || ((NumRoads == 1 || NumAreas == 1) && NumPoints) || (NumRoads > 1 && canBreakRoads(this))); Main->ui->roadSimplifyAction->setEnabled(IsRoad || NumRoads > 0 || NumAreas > 0); Main->ui->roadSubdivideAction->setEnabled((NumRoads + NumAreas) == 1 && (!NumPoints || NumPoints == 2) && canSubdivideRoad(this)); Main->ui->roadAxisAlignAction->setEnabled((NumRoads + NumAreas) > 0 || (NumRelation > 0 && canAxisAlignRoads(this))); Main->ui->areaJoinAction->setEnabled(NumAreas > 1); Main->ui->areaSplitAction->setEnabled(NumAreas == 1 && NumPoints == 2 && canSplitArea(this)); Main->ui->areaTerraceAction->setEnabled(NumAreas == 1 && NumRoads == 0 && canTerraceArea(this)); Main->ui->featureSelectChildrenAction->setEnabled(NumChildren); Main->ui->featureSelectParentsAction->setEnabled(NumParents); Main->ui->featureDownloadMissingChildrenAction->setEnabled(NumIncomplete); Main->ui->featureDeleteAction->setEnabled((IsPoint || IsRoad || IsRelation) && !Selection[0]->isDirty()); Main->ui->featureCommitAction->setEnabled(NumCommitableFeature); Main->ui->nodeMergeAction->setEnabled(NumPoints > 1); Main->ui->nodeAlignAction->setEnabled(NumPoints > 2); Main->ui->nodeSpreadAction->setEnabled(NumPoints > 2); Main->ui->nodeDetachAction->setEnabled(NumPoints && canDetachNodes(this)); Main->ui->relationAddMemberAction->setEnabled(NumRelation && Selection.size() > 1); Main->ui->relationRemoveMemberAction->setEnabled((NumRelation && Selection.size() > 1 && NumRelationChild) || IsParentRelation); Main->ui->relationAddToMultipolygonAction->setEnabled((NumAreas > 1) || (NumAreas >0 && NumRelation == 1)); Main->ui->editCopyAction->setEnabled(Selection.size()); Main->clipboardChanged(); #endif }
void MapRenderer::render( QPainter* P, QMap<RenderPriority, QSet <Feature*> > theFeatures, const RendererOptions& options, MapView* aView ) { #ifndef NDEBUG QTime Start(QTime::currentTime()); #endif theView = aView; theOptions = options; QMap<RenderPriority, QSet<Feature*> >::const_iterator itm; QSet<Feature*>::const_iterator it; bool bgLayerVisible = TEST_RFLAGS(RendererOptions::BackgroundVisible); bool fgLayerVisible = TEST_RFLAGS(RendererOptions::ForegroundVisible); bool tchpLayerVisible = TEST_RFLAGS(RendererOptions::TouchupVisible); bool lblLayerVisible = TEST_RFLAGS(RendererOptions::NamesVisible); Way * R = NULL; Node * Pt = NULL; Relation * RR = NULL; QPixmap pix(theView->size()); thePainter = new QPainter(); itm = theFeatures.constBegin(); while (itm != theFeatures.constEnd()) { pix.fill(Qt::transparent); thePainter->begin(&pix); if (M_PREFS->getUseAntiAlias()) thePainter->setRenderHint(QPainter::Antialiasing); int curLayer = (itm.key()).layer(); while (itm != theFeatures.constEnd() && (itm.key()).layer() == curLayer) { for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { qreal alpha = (*it)->getAlpha(); thePainter->setOpacity(alpha); R = NULL; Pt = NULL; RR = NULL; if (!(R = CAST_WAY(*it))) if (!(Pt = CAST_NODE(*it))) RR = CAST_RELATION(*it); if (R) { // If there is painter at the relation level, don't paint at the way level bool draw = true; for (int i=0; i<R->sizeParents(); ++i) { if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(PixelPerM)) draw = false; } if (!draw) continue; } if (!Pt) { if (bgLayerVisible) { thePainter->save(); if (R && R->area() == 0) thePainter->setCompositionMode(QPainter::CompositionMode_DestinationOver); if (R) bglayer.draw(R); else if (Pt) bglayer.draw(Pt); else if (RR) bglayer.draw(RR); thePainter->restore(); } if (fgLayerVisible) { thePainter->save(); if (R) fglayer.draw(R); else if (Pt) fglayer.draw(Pt); else if (RR) fglayer.draw(RR); thePainter->restore(); } } if (tchpLayerVisible) { thePainter->save(); if (R) tchuplayer.draw(R); else if (Pt) tchuplayer.draw(Pt); else if (RR) tchuplayer.draw(RR); thePainter->restore(); } if (lblLayerVisible) { thePainter->save(); if (R) lbllayer.draw(R); else if (Pt) lbllayer.draw(Pt); else if (RR) lbllayer.draw(RR); thePainter->restore(); } (*it)->draw(*thePainter, aView); } ++itm; } thePainter->end(); P->drawPixmap(0, 0, pix); #ifndef NDEBUG QTime Stop(QTime::currentTime()); qDebug() << Start.msecsTo(Stop) << "ms"; #endif } }