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