source: subversion/applications/editors/merkaartor/TagModel.cpp @ 13736

Last change on this file since 13736 was 13218, checked in by richardbrinkman, 11 years ago

FIX : Sort tags list when selecting an object (fixes #1462)

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
1#include <algorithm>
2#include "TagModel.h"
3#include "MainWindow.h"
4#include "Command/DocumentCommands.h"
5#include "Command/FeatureCommands.h"
6#include "Map/MapDocument.h"
7#include "Map/MapFeature.h"
8#include "Map/MapLayer.h"
9
10TagModel::TagModel(MainWindow* aMain)
11: Main(aMain)
12{
13}
14
15TagModel::~TagModel(void)
16{
17}
18
19void TagModel::setFeature(const std::vector<MapFeature*> Features)
20{
21        if (theFeatures.size())
22        {
23                beginRemoveRows(QModelIndex(),0,Tags.size());
24                Tags.clear();
25                endRemoveRows();
26        }
27        theFeatures = Features;
28        if (theFeatures.size())
29        {
30                MapFeature* F = theFeatures[0];
31                for (unsigned int i=0; i<F->tagSize(); ++i)
32                {
33                        unsigned int j=0;
34                        for (j=1; j<theFeatures.size(); ++j)
35                                if (F->tagValue(i) != theFeatures[j]->tagValue(F->tagKey(i),""))
36                                        break;
37                        if (j == theFeatures.size())
38                                if (!F->tagKey(i).startsWith("%kml:"))
39                                        Tags.push_back(std::make_pair(F->tagKey(i),F->tagValue(i)));
40                }
41                std::sort(Tags.begin(), Tags.end());
42                beginInsertRows(QModelIndex(),0,Tags.size());
43                endInsertRows();
44        }
45}
46
47int TagModel::rowCount(const QModelIndex &) const
48{
49        if (!theFeatures.size()) return 0;
50        return Tags.size()+1;
51}
52
53int TagModel::columnCount(const QModelIndex &) const
54{
55        return 2;
56}
57
58QVariant TagModel::data(const QModelIndex &index, int role) const
59{
60        if (!theFeatures.size())
61                return QVariant();
62        if (!index.isValid())
63                return QVariant();
64        if ((unsigned int)index.row() > Tags.size())
65                return QVariant();
66        if (role == Qt::DisplayRole)
67        {
68                if ((unsigned int)index.row() >= Tags.size())
69                {
70                        if (index.column() == 0)
71                                return newKeyText();
72                        else
73                                return "";
74                }
75                else
76                {
77                        if (index.column() == 0)
78                                return Tags[index.row()].first;
79                        else
80                                return Tags[index.row()].second;
81                }
82        }
83        else if (role == Qt::EditRole)
84        {
85                if ((unsigned int)index.row() >= Tags.size())
86                        return "";
87                else
88                {
89                        if (index.column() == 0)
90                                return Tags[index.row()].first;
91                        else
92                                return Tags[index.row()].second;
93                }
94        }
95        return QVariant();
96}
97
98QVariant TagModel::headerData(int section, Qt::Orientation orientation, int role) const
99{
100        if (role != Qt::DisplayRole)
101                return QVariant();
102        if (orientation == Qt::Horizontal)
103        {
104                if (section == 0)
105                        return tr("Key");
106                else
107                        return tr("Value");
108        }
109        return QVariant();
110}
111
112Qt::ItemFlags TagModel::flags(const QModelIndex &index) const
113{
114        if (!index.isValid())
115                return Qt::ItemIsEnabled;
116        return QAbstractTableModel::flags(index) | Qt::ItemIsEditable  | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
117}
118
119bool TagModel::setData(const QModelIndex &index, const QVariant &value, int role)
120{
121        if (!theFeatures.size()) return false;
122        if (index.isValid() && role == Qt::EditRole)
123        {
124                if ((unsigned int)index.row() == Tags.size())
125                {
126                        if (index.column() == 0)
127                        {
128                                beginInsertRows(QModelIndex(), Tags.size()+1, Tags.size()+1);
129                                CommandList* L = new CommandList(MainWindow::tr("Set Tags on %1").arg(theFeatures[0]->id()), theFeatures[0]);
130                                for (unsigned int i=0; i<theFeatures.size(); ++i)
131                                {
132                                        if (!theFeatures[i]->isDirty() && !theFeatures[i]->hasOSMId() && theFeatures[i]->isUploadable()) {
133                                                bool userAdded = !theFeatures[i]->id().startsWith("conflict_");
134                                                L->add(new AddFeatureCommand(Main->document()->getDirtyLayer(),theFeatures[i],userAdded));
135                                        }
136                                        L->add(new SetTagCommand(theFeatures[i],value.toString(),"", Main->document()->getDirtyOrOriginLayer(theFeatures[i]->layer())));
137                                        theFeatures[i]->setLastUpdated(MapFeature::User);
138                                }
139                                Tags.push_back(std::make_pair(value.toString(),""));
140                                Main->document()->addHistory(L);
141                                endInsertRows();
142                        }
143                        else
144                                return false;
145                }
146                else
147                {
148                        QString Original(Tags[index.row()].first);
149                        if (index.column() == 0)
150                                Tags[index.row()].first = value.toString();
151                        else
152                                Tags[index.row()].second = value.toString();
153                        CommandList* L = new CommandList(MainWindow::tr("Set Tags on %1").arg(theFeatures[0]->id()), theFeatures[0]);
154                        for (unsigned int i=0; i<theFeatures.size(); ++i)
155                        {
156                                unsigned int j = theFeatures[i]->findKey(Original);
157                                if (j<theFeatures[i]->tagSize()) {
158                                        if (!theFeatures[i]->isDirty() && !theFeatures[i]->hasOSMId() && theFeatures[i]->isUploadable()) {
159                                                bool userAdded = !theFeatures[i]->id().startsWith("conflict_");
160                                                L->add(new AddFeatureCommand(Main->document()->getDirtyLayer(),theFeatures[i],userAdded));
161                                        }
162                                        L->add(new SetTagCommand(theFeatures[i],j , Tags[index.row()].first, Tags[index.row()].second, Main->document()->getDirtyOrOriginLayer(theFeatures[i]->layer())));
163                                }
164                                theFeatures[i]->setLastUpdated(MapFeature::User);
165                        }
166                        Main->document()->addHistory(L);
167                        Main->invalidateView(false);
168                }
169                emit dataChanged(index, index);
170                return true;
171        }
172        return false;
173}
Note: See TracBrowser for help on using the repository browser.