1 /***************************************************************************
2 FET
3 -------------------
4 copyright : (C) by Lalescu Liviu
5 email : Please see https://lalescu.ro/liviu/ for details about contacting Liviu Lalescu (in particular, you can find here the e-mail address)
6 ***************************************************************************
7 sparseitemmodel.cpp - description
8 -------------------
9 begin : 2010
10 copyright : (C) 2010 by Liviu Lalescu
11 : https://lalescu.ro/liviu/
12 ***************************************************************************
13 * *
14 * This program is free software: you can redistribute it and/or modify *
15 * it under the terms of the GNU Affero General Public License as *
16 * published by the Free Software Foundation, either version 3 of the *
17 * License, or (at your option) any later version. *
18 * *
19 ***************************************************************************/
20
21 #include <Qt>
22
23 #include "timetable_defs.h"
24
25 #include "sparseitemmodel.h"
26
SparseItemModel()27 SparseItemModel::SparseItemModel()
28 {
29 n_rows=0;
30 n_columns=0;
31
32 items.clear();
33 horizontalHeaderItems.clear();
34 verticalHeaderItems.clear();
35 }
36
index(int row,int column,const QModelIndex & parent) const37 QModelIndex SparseItemModel::index ( int row, int column, const QModelIndex & parent ) const
38 {
39 Q_UNUSED(parent);
40
41 return createIndex(row, column);
42 }
43
parent(const QModelIndex & index) const44 QModelIndex SparseItemModel::parent ( const QModelIndex & index ) const
45 {
46 Q_UNUSED(index);
47
48 return QModelIndex();
49 }
50
rowCount(const QModelIndex & parent) const51 int SparseItemModel::rowCount ( const QModelIndex & parent ) const
52 {
53 if(parent!=QModelIndex())
54 return 0; //Qt documentation says that
55
56 return n_rows;
57 }
58
columnCount(const QModelIndex & parent) const59 int SparseItemModel::columnCount ( const QModelIndex & parent ) const
60 {
61 if(parent!=QModelIndex())
62 return 0; //Qt documentation says that
63
64 return n_columns;
65 }
66
data(const QModelIndex & index,int role) const67 QVariant SparseItemModel::data ( const QModelIndex & index, int role ) const
68 {
69 if(role!=Qt::DisplayRole)
70 return QVariant();
71
72 int row=index.row();
73 assert(row>=0 && row<n_rows);
74 int column=index.column();
75 assert(column>=0 && column<n_columns);
76
77 QPair<int, int> pair;
78 pair.first=row;
79 pair.second=column;
80 if(items.contains(pair))
81 return items.value(pair);
82 else
83 return QVariant();
84 }
85
headerData(int section,Qt::Orientation orientation,int role) const86 QVariant SparseItemModel::headerData ( int section, Qt::Orientation orientation, int role ) const
87 {
88 if(role!=Qt::DisplayRole)
89 return QVariant();
90
91 if(orientation==Qt::Horizontal){
92 assert(section>=0 && section<horizontalHeaderItems.count());
93 return horizontalHeaderItems.at(section);
94 }
95 else{
96 assert(section>=0 && section<verticalHeaderItems.count());
97 return verticalHeaderItems.at(section);
98 }
99 }
100
clear()101 void SparseItemModel::clear()
102 {
103 assert(n_rows>=0);
104 if(n_rows>0){
105 beginRemoveRows(QModelIndex(), 0, n_rows-1);
106 n_rows=0;
107 endRemoveRows();
108 }
109
110 assert(n_columns>=0);
111 if(n_columns>0){
112 beginRemoveColumns(QModelIndex(), 0, n_columns-1);
113 n_columns=0;
114 endRemoveColumns();
115 }
116
117 items.clear();
118 horizontalHeaderItems.clear();
119 verticalHeaderItems.clear();
120 }
121
clearDataAndHeaders()122 void SparseItemModel::clearDataAndHeaders()
123 {
124 items.clear();
125
126 assert(n_columns==horizontalHeaderItems.count());
127 for(int i=0; i<n_columns; i++)
128 horizontalHeaderItems[i]="";
129
130 assert(n_rows==verticalHeaderItems.count());
131 for(int i=0; i<n_rows; i++)
132 verticalHeaderItems[i]="";
133 }
134
resize(int _nr,int _nc)135 void SparseItemModel::resize(int _nr, int _nc)
136 {
137 if(_nr==n_rows && _nc==n_columns)
138 return;
139
140 this->clear();
141
142 assert(verticalHeaderItems.count()==0);
143 for(int i=0; i<_nr; i++)
144 verticalHeaderItems.append("");
145 assert(horizontalHeaderItems.count()==0);
146 for(int i=0; i<_nc; i++)
147 horizontalHeaderItems.append("");
148
149 assert(n_rows==0);
150 beginInsertRows(QModelIndex(), 0, _nr-1);
151 n_rows=_nr;
152 endInsertRows();
153
154 assert(n_columns==0);
155 beginInsertColumns(QModelIndex(), 0, _nc-1);
156 n_columns=_nc;
157 endInsertColumns();
158 }
159
allItemsChanged()160 void SparseItemModel::allItemsChanged()
161 {
162 emit dataChanged(index(0,0), index(n_rows-1, n_columns-1));
163 }
164
allHeadersChanged()165 void SparseItemModel::allHeadersChanged()
166 {
167 emit headerDataChanged(Qt::Horizontal, 0, n_columns-1);
168 emit headerDataChanged(Qt::Vertical, 0, n_rows-1);
169 }
170