comparison data/model/ModelDataTableModel.cpp @ 1748:91a194e2d80b by-id

Update to ModelId
author Chris Cannam
date Wed, 03 Jul 2019 14:20:19 +0100
parents 70e172e6cc59
children dffc70996f54
comparison
equal deleted inserted replaced
1747:498b426191e5 1748:91a194e2d80b
20 20
21 #include <map> 21 #include <map>
22 #include <algorithm> 22 #include <algorithm>
23 #include <iostream> 23 #include <iostream>
24 24
25 ModelDataTableModel::ModelDataTableModel(TabularModel *m) : 25 ModelDataTableModel::ModelDataTableModel(ModelId m) :
26 m_model(m), 26 m_model(m),
27 m_sortColumn(0), 27 m_sortColumn(0),
28 m_sortOrdering(Qt::AscendingOrder), 28 m_sortOrdering(Qt::AscendingOrder),
29 m_currentRow(0) 29 m_currentRow(0)
30 { 30 {
31 Model *baseModel = dynamic_cast<Model *>(m); 31 auto model = ModelById::get(m);
32 32 if (model) {
33 connect(baseModel, SIGNAL(modelChanged()), this, SLOT(modelChanged())); 33 connect(model.get(), SIGNAL(modelChanged()), this, SLOT(modelChanged()));
34 connect(baseModel, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), 34 connect(model.get(), SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)),
35 this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t))); 35 this, SLOT(modelChangedWithin(sv_frame_t, sv_frame_t)));
36 connect(baseModel, SIGNAL(aboutToBeDeleted()), 36 }
37 this, SLOT(modelAboutToBeDeleted()));
38 } 37 }
39 38
40 ModelDataTableModel::~ModelDataTableModel() 39 ModelDataTableModel::~ModelDataTableModel()
41 { 40 {
42 } 41 }
43 42
44 QVariant 43 QVariant
45 ModelDataTableModel::data(const QModelIndex &index, int role) const 44 ModelDataTableModel::data(const QModelIndex &index, int role) const
46 { 45 {
47 if (!m_model) return QVariant(); 46 auto model = getTabularModel();
47 if (!model) return QVariant();
48 if (role != Qt::EditRole && role != Qt::DisplayRole) return QVariant(); 48 if (role != Qt::EditRole && role != Qt::DisplayRole) return QVariant();
49 if (!index.isValid()) return QVariant(); 49 if (!index.isValid()) return QVariant();
50 QVariant d = m_model->getData(getUnsorted(index.row()), index.column(), role); 50 QVariant d = model->getData(getUnsorted(index.row()), index.column(), role);
51 return d; 51 return d;
52 } 52 }
53 53
54 bool 54 bool
55 ModelDataTableModel::setData(const QModelIndex &index, const QVariant &value, int role) 55 ModelDataTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
56 { 56 {
57 if (!m_model) return false; 57 auto model = getTabularModel();
58 if (!model) return false;
58 if (!index.isValid()) return false; 59 if (!index.isValid()) return false;
59 Command *command = m_model->getSetDataCommand(getUnsorted(index.row()), 60 Command *command = model->getSetDataCommand(getUnsorted(index.row()),
60 index.column(), 61 index.column(),
61 value, role); 62 value, role);
62 if (command) { 63 if (command) {
63 emit addCommand(command); 64 emit addCommand(command);
64 return true; 65 return true;
68 } 69 }
69 70
70 bool 71 bool
71 ModelDataTableModel::insertRow(int row, const QModelIndex &parent) 72 ModelDataTableModel::insertRow(int row, const QModelIndex &parent)
72 { 73 {
73 if (!m_model) return false; 74 auto model = getTabularModel();
75 if (!model) return false;
74 if (parent.isValid()) return false; 76 if (parent.isValid()) return false;
75 77
76 Command *command = m_model->getInsertRowCommand(getUnsorted(row)); 78 Command *command = model->getInsertRowCommand(getUnsorted(row));
77 79
78 if (command) { 80 if (command) {
79 emit addCommand(command); 81 emit addCommand(command);
80 } 82 }
81 83
83 } 85 }
84 86
85 bool 87 bool
86 ModelDataTableModel::removeRow(int row, const QModelIndex &parent) 88 ModelDataTableModel::removeRow(int row, const QModelIndex &parent)
87 { 89 {
88 if (!m_model) return false; 90 auto model = getTabularModel();
91 if (!model) return false;
89 if (parent.isValid()) return false; 92 if (parent.isValid()) return false;
90 93
91 Command *command = m_model->getRemoveRowCommand(getUnsorted(row)); 94 Command *command = model->getRemoveRowCommand(getUnsorted(row));
92 95
93 if (command) { 96 if (command) {
94 emit addCommand(command); 97 emit addCommand(command);
95 } 98 }
96 99
106 } 109 }
107 110
108 QVariant 111 QVariant
109 ModelDataTableModel::headerData(int section, Qt::Orientation orientation, int role) const 112 ModelDataTableModel::headerData(int section, Qt::Orientation orientation, int role) const
110 { 113 {
111 if (!m_model) return QVariant(); 114 auto model = getTabularModel();
115 if (!model) return QVariant();
112 116
113 if (orientation == Qt::Vertical && role == Qt::DisplayRole) { 117 if (orientation == Qt::Vertical && role == Qt::DisplayRole) {
114 return section + 1; 118 return section + 1;
115 } 119 }
116 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { 120 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
117 return m_model->getHeading(section); 121 return model->getHeading(section);
118 } 122 }
119 return QVariant(); 123 return QVariant();
120 } 124 }
121 125
122 QModelIndex 126 QModelIndex
132 } 136 }
133 137
134 int 138 int
135 ModelDataTableModel::rowCount(const QModelIndex &parent) const 139 ModelDataTableModel::rowCount(const QModelIndex &parent) const
136 { 140 {
137 if (!m_model) return 0; 141 auto model = getTabularModel();
142 if (!model) return 0;
138 if (parent.isValid()) return 0; 143 if (parent.isValid()) return 0;
139 int count = m_model->getRowCount(); 144 int count = model->getRowCount();
140 return count; 145 return count;
141 } 146 }
142 147
143 int 148 int
144 ModelDataTableModel::columnCount(const QModelIndex &parent) const 149 ModelDataTableModel::columnCount(const QModelIndex &parent) const
145 { 150 {
146 if (!m_model) return 0; 151 auto model = getTabularModel();
152 if (!model) return 0;
147 if (parent.isValid()) return 0; 153 if (parent.isValid()) return 0;
148 return m_model->getColumnCount(); 154 return model->getColumnCount();
149 } 155 }
150 156
151 QModelIndex 157 QModelIndex
152 ModelDataTableModel::getModelIndexForFrame(sv_frame_t frame) const 158 ModelDataTableModel::getModelIndexForFrame(sv_frame_t frame) const
153 { 159 {
154 if (!m_model) return createIndex(0, 0); 160 auto model = getTabularModel();
155 int row = m_model->getRowForFrame(frame); 161 if (!model) return createIndex(0, 0);
162 int row = model->getRowForFrame(frame);
156 return createIndex(getSorted(row), 0, (void *)nullptr); 163 return createIndex(getSorted(row), 0, (void *)nullptr);
157 } 164 }
158 165
159 sv_frame_t 166 sv_frame_t
160 ModelDataTableModel::getFrameForModelIndex(const QModelIndex &index) const 167 ModelDataTableModel::getFrameForModelIndex(const QModelIndex &index) const
161 { 168 {
162 if (!m_model) return 0; 169 auto model = getTabularModel();
163 return m_model->getFrameForRow(getUnsorted(index.row())); 170 if (!model) return 0;
171 return model->getFrameForRow(getUnsorted(index.row()));
164 } 172 }
165 173
166 QModelIndex 174 QModelIndex
167 ModelDataTableModel::findText(QString text) const 175 ModelDataTableModel::findText(QString text) const
168 { 176 {
177 auto model = getTabularModel();
178 if (!model) return QModelIndex();
169 if (text == "") return QModelIndex(); 179 if (text == "") return QModelIndex();
170 int rows = rowCount(); 180 int rows = rowCount();
171 int cols = columnCount(); 181 int cols = columnCount();
172 int current = getCurrentRow(); 182 int current = getCurrentRow();
173 for (int row = 1; row <= rows; ++row) { 183 for (int row = 1; row <= rows; ++row) {
174 int wrapped = (row + current) % rows; 184 int wrapped = (row + current) % rows;
175 for (int col = 0; col < cols; ++col) { 185 for (int col = 0; col < cols; ++col) {
176 if (m_model->getSortType(col) != TabularModel::SortAlphabetical) { 186 if (model->getSortType(col) != TabularModel::SortAlphabetical) {
177 continue; 187 continue;
178 } 188 }
179 QString cell = m_model->getData(getUnsorted(wrapped), col, 189 QString cell = model->getData(getUnsorted(wrapped), col,
180 Qt::DisplayRole).toString(); 190 Qt::DisplayRole).toString();
181 if (cell.contains(text, Qt::CaseInsensitive)) { 191 if (cell.contains(text, Qt::CaseInsensitive)) {
182 return createIndex(wrapped, col); 192 return createIndex(wrapped, col);
183 } 193 }
184 } 194 }
241 emit dataChanged(ix0, ix1); 251 emit dataChanged(ix0, ix1);
242 clearSort(); 252 clearSort();
243 emit layoutChanged(); 253 emit layoutChanged();
244 } 254 }
245 255
246 void
247 ModelDataTableModel::modelAboutToBeDeleted()
248 {
249 m_model = nullptr;
250 emit modelRemoved();
251 }
252
253 int 256 int
254 ModelDataTableModel::getSorted(int row) const 257 ModelDataTableModel::getSorted(int row) const
255 { 258 {
256 if (!m_model) return row; 259 auto model = getTabularModel();
257 260 if (!model) return row;
258 if (m_model->isColumnTimeValue(m_sortColumn)) { 261
262 if (model->isColumnTimeValue(m_sortColumn)) {
259 if (m_sortOrdering == Qt::AscendingOrder) { 263 if (m_sortOrdering == Qt::AscendingOrder) {
260 return row; 264 return row;
261 } else { 265 } else {
262 return rowCount() - row - 1; 266 return rowCount() - row - 1;
263 } 267 }
278 } 282 }
279 283
280 int 284 int
281 ModelDataTableModel::getUnsorted(int row) const 285 ModelDataTableModel::getUnsorted(int row) const
282 { 286 {
283 if (!m_model) return row; 287 auto model = getTabularModel();
284 288 if (!model) return row;
285 if (m_model->isColumnTimeValue(m_sortColumn)) { 289
290 if (model->isColumnTimeValue(m_sortColumn)) {
286 if (m_sortOrdering == Qt::AscendingOrder) { 291 if (m_sortOrdering == Qt::AscendingOrder) {
287 return row; 292 return row;
288 } else { 293 } else {
289 return rowCount() - row - 1; 294 return rowCount() - row - 1;
290 } 295 }
307 } 312 }
308 313
309 void 314 void
310 ModelDataTableModel::resort() const 315 ModelDataTableModel::resort() const
311 { 316 {
312 if (!m_model) return; 317 auto model = getTabularModel();
313 318 if (!model) return;
314 bool numeric = (m_model->getSortType(m_sortColumn) == 319
320 bool numeric = (model->getSortType(m_sortColumn) ==
315 TabularModel::SortNumeric); 321 TabularModel::SortNumeric);
316 322
317 // cerr << "resort: numeric == " << numeric << endl; 323 // cerr << "resort: numeric == " << numeric << endl;
318 324
319 m_sort.clear(); 325 m_sort.clear();
340 } 346 }
341 347
342 void 348 void
343 ModelDataTableModel::resortNumeric() const 349 ModelDataTableModel::resortNumeric() const
344 { 350 {
345 if (!m_model) return; 351 auto model = getTabularModel();
352 if (!model) return;
346 353
347 typedef std::multimap<double, int> MapType; 354 typedef std::multimap<double, int> MapType;
348 355
349 MapType rowMap; 356 MapType rowMap;
350 int rows = m_model->getRowCount(); 357 int rows = model->getRowCount();
351 358
352 for (int i = 0; i < rows; ++i) { 359 for (int i = 0; i < rows; ++i) {
353 QVariant value = m_model->getData(i, m_sortColumn, TabularModel::SortRole); 360 QVariant value = model->getData(i, m_sortColumn, TabularModel::SortRole);
354 rowMap.insert(MapType::value_type(value.toDouble(), i)); 361 rowMap.insert(MapType::value_type(value.toDouble(), i));
355 } 362 }
356 363
357 for (MapType::iterator i = rowMap.begin(); i != rowMap.end(); ++i) { 364 for (MapType::iterator i = rowMap.begin(); i != rowMap.end(); ++i) {
358 // cerr << "resortNumeric: " << i->second << ": " << i->first << endl; 365 // cerr << "resortNumeric: " << i->second << ": " << i->first << endl;
363 } 370 }
364 371
365 void 372 void
366 ModelDataTableModel::resortAlphabetical() const 373 ModelDataTableModel::resortAlphabetical() const
367 { 374 {
368 if (!m_model) return; 375 auto model = getTabularModel();
376 if (!model) return;
369 377
370 typedef std::multimap<QString, int> MapType; 378 typedef std::multimap<QString, int> MapType;
371 379
372 MapType rowMap; 380 MapType rowMap;
373 int rows = m_model->getRowCount(); 381 int rows = model->getRowCount();
374 382
375 for (int i = 0; i < rows; ++i) { 383 for (int i = 0; i < rows; ++i) {
376 QVariant value = 384 QVariant value =
377 m_model->getData(i, m_sortColumn, TabularModel::SortRole); 385 model->getData(i, m_sortColumn, TabularModel::SortRole);
378 rowMap.insert(MapType::value_type(value.toString(), i)); 386 rowMap.insert(MapType::value_type(value.toString(), i));
379 } 387 }
380 388
381 for (MapType::iterator i = rowMap.begin(); i != rowMap.end(); ++i) { 389 for (MapType::iterator i = rowMap.begin(); i != rowMap.end(); ++i) {
382 // cerr << "resortAlphabetical: " << i->second << ": " << i->first << endl; 390 // cerr << "resortAlphabetical: " << i->second << ": " << i->first << endl;