]> git.sven.stormbind.net Git - sven/vym.git/blob - slidemodel.cpp
012ab4be1850290306f7578e9541ced2cf42e32e
[sven/vym.git] / slidemodel.cpp
1 #include "slidemodel.h"
2
3 #include "slideitem.h"
4 #include "vymmodel.h"
5
6 #include <QDebug>
7 #include <QItemSelectionModel>
8
9
10 SlideModel::SlideModel( VymModel *vm)
11     : QAbstractItemModel(NULL)
12 {
13     QVector<QVariant> rootData;
14     rootData << "Slide";
15     rootItem = new SlideItem(rootData, NULL,this);
16     vymModel=vm;
17 }
18
19 SlideModel::~SlideModel()
20 {
21     delete rootItem;
22 }
23
24 void SlideModel::clear()
25 {
26     if (rootItem->childCount()>0)
27         removeRows (0,rowCount (QModelIndex ()));
28 }
29
30 VymModel* SlideModel::getVymModel()
31 {
32     return vymModel;
33 }
34
35 int SlideModel::columnCount(const QModelIndex & /* parent */) const
36 {
37     return rootItem->columnCount();
38 }
39
40 QVariant SlideModel::data(const QModelIndex &index, int role) const
41 {
42     if (!index.isValid())
43         return QVariant();
44
45     if (role != Qt::DisplayRole && role != Qt::EditRole)
46         return QVariant();
47
48     SlideItem *item = getItem(index);
49
50     return item->data(index.column());
51 }
52
53 Qt::ItemFlags SlideModel::flags(const QModelIndex &index) const
54 {
55     if (!index.isValid())
56         return 0;
57
58     return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
59 }
60
61 QVariant SlideModel::headerData(int section, Qt::Orientation orientation,
62                                int role) const
63 {
64     if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
65         return rootItem->data(section);
66
67     return QVariant();
68 }
69
70 QModelIndex SlideModel::index (SlideItem *fri)
71 {
72     if (!fri || !fri->parent())
73         return QModelIndex();
74     else    
75         return createIndex (fri->row(),0,fri);
76 }
77
78
79 QModelIndex SlideModel::index(int row, int column, const QModelIndex &parent) const
80 {
81     if (parent.isValid() && parent.column() != 0)
82         return QModelIndex();
83
84     SlideItem *parentItem = getItem(parent);
85
86     SlideItem *childItem = parentItem->child(row);
87     if (childItem)
88         return createIndex(row, column, childItem);
89     else
90         return QModelIndex();
91 }
92
93 bool SlideModel::insertColumns(int position, int columns, const QModelIndex &parent)
94 {
95     bool success;
96
97     beginInsertColumns(parent, position, position + columns - 1);
98     success = rootItem->insertColumns(position, columns);
99     endInsertColumns();
100
101     return success;
102 }
103
104 bool SlideModel::insertRows(int position, int rows, const QModelIndex &parent)
105 {
106     SlideItem *parentItem = getItem(parent);
107     bool success;
108
109     beginInsertRows(parent, position, position + rows - 1);
110     success = parentItem->insertChildren(position, rows, rootItem->columnCount());
111     endInsertRows();
112
113     return success;
114 }
115
116 QModelIndex SlideModel::parent(const QModelIndex &index) const
117 {
118     if (!index.isValid())
119         return QModelIndex();
120
121     SlideItem *childItem = getItem(index);
122     SlideItem *parentItem = childItem->parent();
123
124     if (parentItem == rootItem)
125         return QModelIndex();
126
127     return createIndex(parentItem->childNumber(), 0, parentItem);
128 }
129
130 bool SlideModel::removeColumns(int position, int columns, const QModelIndex &parent)
131 {
132     bool success;
133
134     beginRemoveColumns(parent, position, position + columns - 1);
135     success = rootItem->removeColumns(position, columns);
136     endRemoveColumns();
137
138     if (rootItem->columnCount() == 0)
139         removeRows(0, rowCount());
140
141     return success;
142 }
143
144 bool SlideModel::removeRows(int position, int rows, const QModelIndex &parent)
145 {
146     SlideItem *parentItem = getItem(parent);
147     bool success = true;
148
149     beginRemoveRows(parent, position, position + rows - 1);
150     success = parentItem->removeChildren(position, rows);
151     endRemoveRows();
152
153     return success;
154 }
155
156 int SlideModel::count()
157 {
158     return rootItem->childCount();
159 }
160
161 int SlideModel::rowCount(const QModelIndex &parent) const
162 {
163     SlideItem *parentItem = getItem(parent);
164
165     return parentItem->childCount();
166 }
167
168 bool SlideModel::setData(const QModelIndex &index, const QVariant &value,
169                         int role)
170 {
171     if (role != Qt::EditRole)
172         return false;
173
174     SlideItem *item = getItem(index);
175     bool result = item->setData(index.column(), value);
176
177     if (result)
178         emit dataChanged(index, index);
179
180     return result;
181 }
182
183 bool SlideModel::setHeaderData(int section, Qt::Orientation orientation,
184                               const QVariant &value, int role)
185 {
186     if (role != Qt::EditRole || orientation != Qt::Horizontal)
187         return false;
188
189     bool result = rootItem->setData(section, value);
190
191     if (result)
192         emit headerDataChanged(orientation, section, section);
193
194     return result;
195 }
196
197 SlideItem*  SlideModel::addSlide(SlideItem *dst, int n)
198 {
199     SlideItem *si=NULL;
200     if (!dst) dst=rootItem;
201
202     emit (layoutAboutToBeChanged() );
203
204     QModelIndex parix=index (dst);
205     if (n<0) n=dst->childCount();
206     beginInsertRows (parix,n,n);
207     if (rootItem->insertChildren (n,1,0) )
208     {
209         QModelIndex ix=index(n,0,QModelIndex());
210         si=getItem(ix);
211     }
212     endInsertRows ();
213     emit (layoutChanged() );
214         
215     return si;
216 }
217
218 void SlideModel::deleteSlide(SlideItem *si)
219 {
220     QModelIndex ix=index(si);
221     if (ix.isValid())
222     {
223         QModelIndex px=ix.parent();
224         int n=si->childNumber();
225         removeRows (n,1,px);
226     }
227 }
228
229 bool SlideModel::relinkSlide(
230     SlideItem *si,
231     SlideItem *dst,
232     int pos)
233 {
234    if (si && dst)
235    {
236         emit (layoutAboutToBeChanged() );
237         SlideItem *pi=si->parent();
238
239         // Remove at current position
240         int n=si->childNumber();
241
242         beginRemoveRows (index(pi),n,n);
243         pi->removeItem (n);
244         endRemoveRows();
245
246         if (pos<0 ||pos>dst->childCount() ) pos=dst->childCount();
247     
248         // Insert at new position
249         beginInsertRows (index(dst),pos,pos);
250         dst->insertItem (pos, si);
251         endInsertRows();
252
253         emit (layoutChanged() );
254
255         selModel->select (index (si),QItemSelectionModel::ClearAndSelect  );
256
257         return true;
258     }
259     return false;
260 }
261
262 SlideItem* SlideModel::getItem (const QModelIndex &index) const
263 {
264     if (index.isValid()) {
265         SlideItem *item = static_cast<SlideItem*>(index.internalPointer());
266         if (item) return item;
267     }
268     return rootItem;
269 }
270
271 SlideItem* SlideModel::getSlide (int n)
272 {
273     if (n>=count() || n<0) return NULL;
274     return getItem (index (n, 0, QModelIndex() ));
275 }
276
277 SlideItem* SlideModel::findSlideID (uint n)
278 {
279     for (int i=0; i<rootItem->childCount(); i++)
280         if (rootItem->child(i)->getID()==n)
281             return rootItem->child(i);
282     return NULL;            
283 }
284
285 QString SlideModel::saveToDir()
286 {
287     QString s;
288     for (int i=0; i<rootItem->childCount(); i++)
289         s+=rootItem->child(i)->saveToDir();
290     return s;
291 }
292
293 void SlideModel::setSearchString( const QString &s)
294 {
295     searchString=s;
296 }
297
298 QString SlideModel::getSearchString()
299 {
300     return searchString;
301 }
302
303 void SlideModel::setSearchFlags( QTextDocument::FindFlags f)
304 {
305     searchFlags=f;
306 }
307
308 QTextDocument::FindFlags SlideModel::getSearchFlags()
309 {
310     return searchFlags;
311 }
312
313 void SlideModel::setSelectionModel(QItemSelectionModel *sm)
314 {
315     selModel=sm;
316 }
317
318 QItemSelectionModel* SlideModel::getSelectionModel()
319 {
320     return selModel;
321 }
322
323 QModelIndex SlideModel::getSelectedIndex()
324 {
325     if (!selModel)
326     {
327         qDebug ()<<"SlideModel: No selection model!";
328         return QModelIndex();
329     }
330     QModelIndexList list=selModel->selectedIndexes();
331     if (!list.isEmpty() ) return list.first();
332     return QModelIndex();       
333 }
334
335 SlideItem* SlideModel::getSelectedItem ()
336 {
337     QModelIndex ix=getSelectedIndex();
338     if (ix.isValid() ) return getItem (ix);
339     return NULL;
340 }
341