Ticket #1313: MoveTrackPointInteraction.cpp.diff

File MoveTrackPointInteraction.cpp.diff, 2.7 KB (added by LonelyPixel, 11 years ago)

Patch of my proposed implementation

  • merkaartor\Interaction\MoveTrackPointInteraction.cpp

    old new  
    1313#include <QtGui/QCursor>
    1414#include <QtGui/QMouseEvent>
    1515#include <QtGui/QPixmap>
     16#include <QMessageBox>
    1617
    1718#include <vector>
    1819
     
    7576                        else
    7677                                theList->add(new MoveTrackPointCommand(Moving[i],OriginalPosition[i]+Diff, document()->getDirtyOrOriginLayer(Moving[i]->layer())));
    7778                }
     79               
    7880                document()->addHistory(theList);
     81
     82                // If moving a single node (not a track node), see if it got dropped onto another node
     83                if (Moving.size() == 1 && !Moving[0]->layer()->isTrack())
     84                {
     85                        Coord newPos = OriginalPosition[0] + Diff;
     86                        std::vector<TrackPoint*> samePosPts;
     87                        for (VisibleFeatureIterator it(document()); !it.isEnd(); ++it)
     88                        {
     89                                TrackPoint* visPt = dynamic_cast<TrackPoint*>(it.get());
     90                                if (visPt)
     91                                {
     92                                        if (visPt == Moving[0])
     93                                                continue;
     94
     95                                        if (visPt->position() == newPos)
     96                                        {
     97                                                samePosPts.push_back(visPt);
     98                                        }
     99                                }
     100                        }
     101                        // Ensure the node being moved is at the end of the list.
     102                        // (This is not the node that all nodes will be merged into,
     103                        // they are always merged into a node that already was at that position.)
     104                        samePosPts.push_back(Moving[0]);
     105
     106                        if (samePosPts.size() > 1)   // Ignore the node we're moving, see if there are more
     107                        {
     108                                int ret = QMessageBox::question(view(),
     109                                        MainWindow::tr("Nodes at the same position found."),
     110                                        MainWindow::tr("Do you want to merge all nodes at the drop position?"),
     111                                        QMessageBox::Yes | QMessageBox::No);
     112                                if (ret == QMessageBox::Yes)
     113                                {
     114                                        // Merge all nodes from the same position
     115
     116                                        // from MainWindow::on_nodeMergeAction_triggered()
     117                                        // Merge all nodes into the first node that has been found (not the node being moved)
     118                                        MapFeature* F = samePosPts[0];
     119                                        // Make a separate undo command list for this action
     120                                        CommandList* theList2 = new CommandList(MainWindow::tr("Merge Nodes into %1").arg(F->id()), F);
     121                                       
     122                                        // from mergeNodes(theDocument, theList, theProperties);
     123                                        std::vector<MapFeature*> alt;
     124                                        TrackPoint* merged = samePosPts[0];
     125                                        alt.push_back(merged);
     126                                        for (unsigned int i = 1; i < samePosPts.size(); ++i) {
     127                                                MapFeature::mergeTags(document(), theList2, merged, samePosPts[i]);
     128                                                theList2->add(new RemoveFeatureCommand(document(), samePosPts[i], alt));
     129                                        }
     130                                       
     131                                        document()->addHistory(theList2);
     132                                        view()->properties()->setSelection(F);
     133                                }
     134                        }
     135                }
     136               
    79137                view()->invalidate(true, false);
    80138        }
    81139        Moving.clear();