]> git.sven.stormbind.net Git - sven/vym.git/blob - src/findresultmodel.cpp
Replace Pierre as the maintainer
[sven/vym.git] / src / findresultmodel.cpp
1 #include <QtGui>
2
3 #include "findresultitem.h"
4 #include "findresultmodel.h"
5 #include "settings.h"
6 #include "treeitem.h"
7
8 extern Settings settings;
9
10 FindResultModel::FindResultModel(QObject *parent) : QAbstractItemModel(parent)
11 {
12     QVector<QVariant> rootData;
13     rootData << "Heading";
14     rootItem = new FindResultItem(rootData);
15     showParentsLevel =
16         settings.value("/satellite/findResults/showParentsLevel", 1).toInt();
17 }
18
19 FindResultModel::~FindResultModel() { delete rootItem; }
20
21 void FindResultModel::clear()
22 {
23     if (rootItem->childCount() > 0)
24         removeRows(0, rowCount(QModelIndex()));
25 }
26
27 int FindResultModel::columnCount(const QModelIndex & /* parent */) const
28 {
29     return rootItem->columnCount();
30 }
31
32 QVariant FindResultModel::data(const QModelIndex &index, int role) const
33 {
34     if (!index.isValid())
35         return QVariant();
36
37     if (role != Qt::DisplayRole && role != Qt::EditRole)
38         return QVariant();
39
40     FindResultItem *item = getItem(index);
41
42     return item->data(index.column());
43 }
44
45 Qt::ItemFlags FindResultModel::flags(const QModelIndex &index) const
46 {
47     if (!index.isValid())
48         return Qt::NoItemFlags;
49
50     return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
51 }
52
53 QVariant FindResultModel::headerData(int section, Qt::Orientation orientation,
54                                      int role) const
55 {
56     if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
57         return rootItem->data(section);
58
59     return QVariant();
60 }
61
62 QModelIndex FindResultModel::index(FindResultItem *fri)
63 {
64     if (!fri->parent())
65         return QModelIndex();
66     else
67         return createIndex(fri->row(), 0, fri);
68 }
69
70 QModelIndex FindResultModel::index(int row, int column,
71                                    const QModelIndex &parent) const
72 {
73     if (parent.isValid() && parent.column() != 0)
74         return QModelIndex();
75
76     FindResultItem *parentItem = getItem(parent);
77
78     FindResultItem *childItem = parentItem->child(row);
79     if (childItem)
80         return createIndex(row, column, childItem);
81     else
82         return QModelIndex();
83 }
84
85 bool FindResultModel::insertColumns(int position, int columns,
86                                     const QModelIndex &parent)
87 {
88     bool success;
89
90     beginInsertColumns(parent, position, position + columns - 1);
91     success = rootItem->insertColumns(position, columns);
92     endInsertColumns();
93
94     return success;
95 }
96
97 bool FindResultModel::insertRows(int position, int rows,
98                                  const QModelIndex &parent)
99 {
100     FindResultItem *parentItem = getItem(parent);
101     bool success;
102
103     beginInsertRows(parent, position, position + rows - 1);
104     success =
105         parentItem->insertChildren(position, rows, rootItem->columnCount());
106     endInsertRows();
107
108     return success;
109 }
110
111 QModelIndex FindResultModel::parent(const QModelIndex &index) const
112 {
113     if (!index.isValid())
114         return QModelIndex();
115
116     FindResultItem *childItem = getItem(index);
117     FindResultItem *parentItem = childItem->parent();
118
119     if (parentItem == rootItem)
120         return QModelIndex();
121
122     return createIndex(parentItem->childNumber(), 0, parentItem);
123 }
124
125 bool FindResultModel::removeColumns(int position, int columns,
126                                     const QModelIndex &parent)
127 {
128     bool success;
129
130     beginRemoveColumns(parent, position, position + columns - 1);
131     success = rootItem->removeColumns(position, columns);
132     endRemoveColumns();
133
134     if (rootItem->columnCount() == 0)
135         removeRows(0, rowCount());
136
137     return success;
138 }
139
140 bool FindResultModel::removeRows(int position, int rows,
141                                  const QModelIndex &parent)
142 {
143     FindResultItem *parentItem = getItem(parent);
144     bool success = true;
145
146     beginRemoveRows(parent, position, position + rows - 1);
147     success = parentItem->removeChildren(position, rows);
148     endRemoveRows();
149
150     return success;
151 }
152
153 int FindResultModel::rowCount(const QModelIndex &parent) const
154 {
155     FindResultItem *parentItem = getItem(parent);
156
157     return parentItem->childCount();
158 }
159
160 bool FindResultModel::setData(const QModelIndex &index, const QVariant &value,
161                               int role)
162 {
163     if (role != Qt::EditRole)
164         return false;
165
166     FindResultItem *item = getItem(index);
167     bool result = item->setData(index.column(), value);
168
169     if (result)
170         emit dataChanged(index, index);
171
172     return result;
173 }
174
175 bool FindResultModel::setHeaderData(int section, Qt::Orientation orientation,
176                                     const QVariant &value, int role)
177 {
178     if (role != Qt::EditRole || orientation != Qt::Horizontal)
179         return false;
180
181     bool result = rootItem->setData(section, value);
182
183     if (result)
184         emit headerDataChanged(orientation, section, section);
185
186     return result;
187 }
188
189 FindResultItem *FindResultModel::getItem(const QModelIndex &index) const
190 {
191     if (index.isValid()) {
192         FindResultItem *item =
193             static_cast<FindResultItem *>(index.internalPointer());
194         if (item)
195             return item;
196     }
197     return rootItem;
198 }
199
200 FindResultItem *FindResultModel::addItem(TreeItem *ti)
201 {
202     FindResultItem *ni = NULL;
203     if (ti) {
204         QModelIndex parix(index(rootItem));
205
206         emit(layoutAboutToBeChanged());
207
208         int n = rowCount(parix);
209         beginInsertRows(parix, n, n);
210         if (rootItem->insertChildren(n, 1, 0)) {
211             QString h = ti->getHeadingPlainWithParents(showParentsLevel);
212             QModelIndex ix = index(n, 0, QModelIndex());
213             setData(ix, QVariant(h), Qt::EditRole);
214             ni = getItem(ix);
215             ni->setOriginal(ti);
216         }
217         endInsertRows();
218
219         emit(layoutChanged());
220     }
221     return ni;
222 }
223
224 FindResultItem *FindResultModel::addSubItem(FindResultItem *parent,
225                                             const QString &s, TreeItem *pi,
226                                             int i)
227 {
228     FindResultItem *ni = NULL;
229     if (pi && parent) {
230         QModelIndex parix(index(parent));
231
232         emit(layoutAboutToBeChanged());
233
234         int n = rowCount(parix);
235         beginInsertRows(parix, n, n);
236
237         QModelIndex ix;
238         if (parent->insertChildren(n, 1, 0)) {
239             ix = index(n, 0, parix);
240             setData(ix, QVariant(s), Qt::EditRole);
241             ni = getItem(ix);
242             ni->setOriginal(pi);
243             ni->setOriginalIndex(i);
244         }
245         endInsertRows();
246         emit(layoutChanged());
247     }
248     return ni;
249 }
250
251 void FindResultModel::setSearchString(const QString &s) { searchString = s; }
252
253 QString FindResultModel::getSearchString() { return searchString; }
254
255 void FindResultModel::setSearchFlags(QTextDocument::FindFlags f)
256 {
257     searchFlags = f;
258 }
259
260 QTextDocument::FindFlags FindResultModel::getSearchFlags()
261 {
262     return searchFlags;
263 }
264
265 void FindResultModel::setShowParentsLevel(uint i)
266 {
267     showParentsLevel = i;
268     settings.setValue("/findResults/showParentsLevel", showParentsLevel);
269 }
270
271 uint FindResultModel::getShowParentsLevel() { return showParentsLevel; }