Mercurial > hg > svgui
comparison widgets/LayerTree.cpp @ 374:64e84e5efb76 spectrogram-cache-rejig
* Merge from trunk
author | Chris Cannam |
---|---|
date | Wed, 27 Feb 2008 11:59:42 +0000 |
parents | 226cb289bdf4 |
children | 1d85aa5a49be |
comparison
equal
deleted
inserted
replaced
332:6440e280122e | 374:64e84e5efb76 |
---|---|
19 | 19 |
20 #include "base/PlayParameters.h" | 20 #include "base/PlayParameters.h" |
21 #include "view/Pane.h" | 21 #include "view/Pane.h" |
22 #include "layer/Layer.h" | 22 #include "layer/Layer.h" |
23 #include "data/model/Model.h" | 23 #include "data/model/Model.h" |
24 #include "data/model/WaveFileModel.h" | |
24 | 25 |
25 #include <QIcon> | 26 #include <QIcon> |
26 #include <iostream> | 27 #include <iostream> |
27 | 28 |
28 | 29 |
29 LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) : | 30 ModelDataModel::ModelDataModel(PaneStack *stack, bool waveModelsOnly, |
31 QObject *parent) : | |
30 QAbstractItemModel(parent), | 32 QAbstractItemModel(parent), |
31 m_stack(stack) | 33 m_stack(stack), |
32 { | 34 m_waveModelsOnly(waveModelsOnly) |
33 connect(stack, SIGNAL(paneAdded()), this, SIGNAL(layoutChanged())); | 35 { |
34 connect(stack, SIGNAL(paneDeleted()), this, SIGNAL(layoutChanged())); | 36 if (m_waveModelsOnly) { |
37 m_modelTypeColumn = -1; | |
38 m_modelNameColumn = 0; | |
39 m_modelMakerColumn = 1; | |
40 m_modelSourceColumn = 2; | |
41 m_columnCount = 3; | |
42 } else { | |
43 m_modelTypeColumn = 0; | |
44 m_modelNameColumn = 1; | |
45 m_modelMakerColumn = 2; | |
46 m_modelSourceColumn = 3; | |
47 m_columnCount = 4; | |
48 } | |
49 | |
50 connect(stack, SIGNAL(paneAdded()), this, SLOT(paneAdded())); | |
51 connect(stack, SIGNAL(paneDeleted()), this, SLOT(paneDeleted())); | |
35 | 52 |
36 for (int i = 0; i < stack->getPaneCount(); ++i) { | 53 for (int i = 0; i < stack->getPaneCount(); ++i) { |
37 Pane *pane = stack->getPane(i); | 54 Pane *pane = stack->getPane(i); |
38 if (!pane) continue; | 55 if (!pane) continue; |
39 connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), | 56 connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), |
44 this, SLOT(propertyContainerSelected(PropertyContainer *))); | 61 this, SLOT(propertyContainerSelected(PropertyContainer *))); |
45 connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), | 62 connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), |
46 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); | 63 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); |
47 connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), | 64 connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), |
48 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); | 65 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); |
66 connect(pane, SIGNAL(layerModelChanged()), | |
67 this, SLOT(paneLayerModelChanged())); | |
68 } | |
69 | |
70 rebuildModelSet(); | |
71 } | |
72 | |
73 ModelDataModel::~ModelDataModel() | |
74 { | |
75 } | |
76 | |
77 void | |
78 ModelDataModel::rebuildModelSet() | |
79 { | |
80 std::set<Model *> unfound = m_models; | |
81 | |
82 for (int i = 0; i < m_stack->getPaneCount(); ++i) { | |
83 | |
84 Pane *pane = m_stack->getPane(i); | |
85 if (!pane) continue; | |
86 | |
87 for (int j = 0; j < pane->getLayerCount(); ++j) { | |
88 | |
89 Layer *layer = pane->getLayer(j); | |
90 if (!layer) continue; | |
91 | |
92 Model *model = layer->getModel(); | |
93 if (!model) continue; | |
94 | |
95 if (m_waveModelsOnly) { | |
96 if (!dynamic_cast<WaveFileModel *>(model)) continue; | |
97 } | |
98 | |
99 if (m_models.find(model) == m_models.end()) { | |
100 connect(model, SIGNAL(aboutToBeDeleted()), | |
101 this, SLOT(rebuildModelSet())); | |
102 m_models.insert(model); | |
103 } else { | |
104 unfound.erase(model); | |
105 } | |
106 } | |
107 } | |
108 | |
109 for (std::set<Model *>::iterator i = unfound.begin(); | |
110 i != unfound.end(); ++i) { | |
111 m_models.erase(*i); | |
112 } | |
113 | |
114 std::cerr << "ModelDataModel::rebuildModelSet: " << m_models.size() << " models" << std::endl; | |
115 } | |
116 | |
117 void | |
118 ModelDataModel::paneAdded() | |
119 { | |
120 rebuildModelSet(); | |
121 emit layoutChanged(); | |
122 } | |
123 | |
124 void | |
125 ModelDataModel::paneDeleted() | |
126 { | |
127 rebuildModelSet(); | |
128 emit layoutChanged(); | |
129 } | |
130 | |
131 void | |
132 ModelDataModel::paneLayerModelChanged() | |
133 { | |
134 rebuildModelSet(); | |
135 emit layoutChanged(); | |
136 } | |
137 | |
138 void | |
139 ModelDataModel::propertyContainerAdded(PropertyContainer *) | |
140 { | |
141 rebuildModelSet(); | |
142 emit layoutChanged(); | |
143 } | |
144 | |
145 void | |
146 ModelDataModel::propertyContainerRemoved(PropertyContainer *) | |
147 { | |
148 rebuildModelSet(); | |
149 emit layoutChanged(); | |
150 } | |
151 | |
152 void | |
153 ModelDataModel::propertyContainerSelected(PropertyContainer *) | |
154 { | |
155 } | |
156 | |
157 void | |
158 ModelDataModel::propertyContainerPropertyChanged(PropertyContainer *pc) | |
159 { | |
160 } | |
161 | |
162 void | |
163 ModelDataModel::playParametersAudibilityChanged(bool a) | |
164 { | |
165 } | |
166 | |
167 QVariant | |
168 ModelDataModel::data(const QModelIndex &index, int role) const | |
169 { | |
170 if (!index.isValid()) return QVariant(); | |
171 | |
172 QObject *obj = static_cast<QObject *>(index.internalPointer()); | |
173 int row = index.row(), col = index.column(); | |
174 | |
175 //!!! not exactly the ideal use of a std::set | |
176 std::set<Model *>::iterator itr = m_models.begin(); | |
177 for (int i = 0; i < row && itr != m_models.end(); ++i, ++itr); | |
178 if (itr == m_models.end()) return QVariant(); | |
179 | |
180 Model *model = *itr; | |
181 | |
182 if (role != Qt::DisplayRole) { | |
183 if (m_waveModelsOnly && col == m_modelNameColumn && | |
184 role == Qt::DecorationRole) { | |
185 // There is no meaningful icon for a model, in general -- | |
186 // the icons we have represent layer types and it would be | |
187 // misleading to use them for models. However, if we're | |
188 // only showing wave models, we use the waveform icon just | |
189 // for decorative purposes. | |
190 return QVariant(QIcon(QString(":/icons/waveform.png"))); | |
191 } | |
192 return QVariant(); | |
193 } | |
194 | |
195 if (col == m_modelTypeColumn) { | |
196 return QVariant(model->getTypeName()); | |
197 } else if (col == m_modelNameColumn) { | |
198 return QVariant(model->objectName()); | |
199 } else if (col == m_modelMakerColumn) { | |
200 return QVariant(model->getMaker()); | |
201 } else if (col == m_modelSourceColumn) { | |
202 return QVariant(model->getLocation()); | |
203 } | |
204 | |
205 return QVariant(); | |
206 } | |
207 | |
208 bool | |
209 ModelDataModel::setData(const QModelIndex &index, const QVariant &value, int role) | |
210 { | |
211 return false; | |
212 } | |
213 | |
214 Qt::ItemFlags | |
215 ModelDataModel::flags(const QModelIndex &index) const | |
216 { | |
217 Qt::ItemFlags flags = Qt::ItemIsEnabled; | |
218 return flags; | |
219 } | |
220 | |
221 QVariant | |
222 ModelDataModel::headerData(int section, | |
223 Qt::Orientation orientation, | |
224 int role) const | |
225 { | |
226 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { | |
227 if (section == m_modelTypeColumn) return QVariant(tr("Type")); | |
228 else if (section == m_modelNameColumn) return QVariant(tr("Name")); | |
229 else if (section == m_modelMakerColumn) return QVariant(tr("Maker")); | |
230 else if (section == m_modelSourceColumn) return QVariant(tr("Source")); | |
231 } | |
232 | |
233 return QVariant(); | |
234 } | |
235 | |
236 QModelIndex | |
237 ModelDataModel::index(int row, int column, const QModelIndex &parent) const | |
238 { | |
239 if (!parent.isValid()) { | |
240 if (row >= m_models.size()) return QModelIndex(); | |
241 return createIndex(row, column, 0); | |
242 } | |
243 | |
244 return QModelIndex(); | |
245 } | |
246 | |
247 QModelIndex | |
248 ModelDataModel::parent(const QModelIndex &index) const | |
249 { | |
250 return QModelIndex(); | |
251 } | |
252 | |
253 int | |
254 ModelDataModel::rowCount(const QModelIndex &parent) const | |
255 { | |
256 if (!parent.isValid()) return m_models.size(); | |
257 return 0; | |
258 } | |
259 | |
260 int | |
261 ModelDataModel::columnCount(const QModelIndex &parent) const | |
262 { | |
263 return m_columnCount; | |
264 } | |
265 | |
266 | |
267 | |
268 LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) : | |
269 QAbstractItemModel(parent), | |
270 m_stack(stack) | |
271 { | |
272 m_layerNameColumn = 0; | |
273 m_layerVisibleColumn = 1; | |
274 m_layerPlayedColumn = 2; | |
275 m_modelNameColumn = 3; | |
276 m_columnCount = 4; | |
277 | |
278 connect(stack, SIGNAL(paneAdded()), this, SLOT(paneAdded())); | |
279 connect(stack, SIGNAL(paneAboutToBeDeleted(Pane *)), | |
280 this, SLOT(paneAboutToBeDeleted(Pane *))); | |
281 | |
282 for (int i = 0; i < stack->getPaneCount(); ++i) { | |
283 Pane *pane = stack->getPane(i); | |
284 if (!pane) continue; | |
285 connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)), | |
286 this, SLOT(propertyContainerAdded(PropertyContainer *))); | |
287 connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)), | |
288 this, SLOT(propertyContainerRemoved(PropertyContainer *))); | |
289 connect(pane, SIGNAL(propertyContainerSelected(PropertyContainer *)), | |
290 this, SLOT(propertyContainerSelected(PropertyContainer *))); | |
291 connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)), | |
292 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); | |
293 connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)), | |
294 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *))); | |
295 connect(pane, SIGNAL(layerModelChanged()), | |
296 this, SLOT(paneLayerModelChanged())); | |
297 | |
49 for (int j = 0; j < pane->getLayerCount(); ++j) { | 298 for (int j = 0; j < pane->getLayerCount(); ++j) { |
50 Layer *layer = pane->getLayer(j); | 299 Layer *layer = pane->getLayer(j); |
51 if (!layer) continue; | 300 if (!layer) continue; |
52 PlayParameters *params = layer->getPlayParameters(); | 301 PlayParameters *params = layer->getPlayParameters(); |
53 if (!params) continue; | 302 if (!params) continue; |
60 LayerTreeModel::~LayerTreeModel() | 309 LayerTreeModel::~LayerTreeModel() |
61 { | 310 { |
62 } | 311 } |
63 | 312 |
64 void | 313 void |
314 LayerTreeModel::paneAdded() | |
315 { | |
316 emit layoutChanged(); | |
317 } | |
318 | |
319 void | |
320 LayerTreeModel::paneAboutToBeDeleted(Pane *pane) | |
321 { | |
322 std::cerr << "paneDeleted: " << pane << std::endl; | |
323 m_deletedPanes.insert(pane); | |
324 emit layoutChanged(); | |
325 } | |
326 | |
327 void | |
65 LayerTreeModel::propertyContainerAdded(PropertyContainer *) | 328 LayerTreeModel::propertyContainerAdded(PropertyContainer *) |
66 { | 329 { |
67 emit layoutChanged(); | 330 emit layoutChanged(); |
68 } | 331 } |
69 | 332 |
73 emit layoutChanged(); | 336 emit layoutChanged(); |
74 } | 337 } |
75 | 338 |
76 void | 339 void |
77 LayerTreeModel::propertyContainerSelected(PropertyContainer *) | 340 LayerTreeModel::propertyContainerSelected(PropertyContainer *) |
341 { | |
342 emit layoutChanged(); | |
343 } | |
344 | |
345 void | |
346 LayerTreeModel::paneLayerModelChanged() | |
78 { | 347 { |
79 emit layoutChanged(); | 348 emit layoutChanged(); |
80 } | 349 } |
81 | 350 |
82 void | 351 void |
86 Pane *pane = m_stack->getPane(i); | 355 Pane *pane = m_stack->getPane(i); |
87 if (!pane) continue; | 356 if (!pane) continue; |
88 for (int j = 0; j < pane->getLayerCount(); ++j) { | 357 for (int j = 0; j < pane->getLayerCount(); ++j) { |
89 if (pane->getLayer(j) == pc) { | 358 if (pane->getLayer(j) == pc) { |
90 emit dataChanged(createIndex(pane->getLayerCount() - j - 1, | 359 emit dataChanged(createIndex(pane->getLayerCount() - j - 1, |
91 0, pane), | 360 m_layerNameColumn, pane), |
92 createIndex(pane->getLayerCount() - j - 1, | 361 createIndex(pane->getLayerCount() - j - 1, |
93 3, pane)); | 362 m_modelNameColumn, pane)); |
94 } | 363 } |
95 } | 364 } |
96 } | 365 } |
97 } | 366 } |
98 | 367 |
114 if (layer->getPlayParameters() == params) { | 383 if (layer->getPlayParameters() == params) { |
115 std::cerr << "LayerTreeModel::playParametersAudibilityChanged(" | 384 std::cerr << "LayerTreeModel::playParametersAudibilityChanged(" |
116 << params << "," << a << "): row " << pane->getLayerCount() - j - 1 << ", col " << 2 << std::endl; | 385 << params << "," << a << "): row " << pane->getLayerCount() - j - 1 << ", col " << 2 << std::endl; |
117 | 386 |
118 emit dataChanged(createIndex(pane->getLayerCount() - j - 1, | 387 emit dataChanged(createIndex(pane->getLayerCount() - j - 1, |
119 2, pane), | 388 m_layerPlayedColumn, pane), |
120 createIndex(pane->getLayerCount() - j - 1, | 389 createIndex(pane->getLayerCount() - j - 1, |
121 2, pane)); | 390 m_layerPlayedColumn, pane)); |
122 } | 391 } |
123 } | 392 } |
124 } | 393 } |
125 } | 394 } |
126 | 395 |
146 } | 415 } |
147 | 416 |
148 if (pane && pane->getLayerCount() > row) { | 417 if (pane && pane->getLayerCount() > row) { |
149 Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1); | 418 Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1); |
150 if (layer) { | 419 if (layer) { |
151 if (col == 0) { | 420 if (col == m_layerNameColumn) { |
152 switch (role) { | 421 switch (role) { |
153 case Qt::DisplayRole: | 422 case Qt::DisplayRole: |
154 return QVariant(layer->objectName()); | 423 return QVariant(layer->objectName()); |
155 case Qt::DecorationRole: | 424 case Qt::DecorationRole: |
156 return QVariant | 425 return QVariant |
157 (QIcon(QString(":/icons/%1.png") | 426 (QIcon(QString(":/icons/%1.png") |
158 .arg(layer->getPropertyContainerIconName()))); | 427 .arg(layer->getPropertyContainerIconName()))); |
159 default: break; | 428 default: break; |
160 } | 429 } |
161 } else if (col == 1) { | 430 } else if (col == m_layerVisibleColumn) { |
162 if (role == Qt::CheckStateRole) { | 431 if (role == Qt::CheckStateRole) { |
163 return QVariant(layer->isLayerDormant(pane) ? | 432 return QVariant(layer->isLayerDormant(pane) ? |
164 Qt::Unchecked : Qt::Checked); | 433 Qt::Unchecked : Qt::Checked); |
165 } else if (role == Qt::TextAlignmentRole) { | 434 } else if (role == Qt::TextAlignmentRole) { |
166 return QVariant(Qt::AlignHCenter); | 435 return QVariant(Qt::AlignHCenter); |
167 } | 436 } |
168 } else if (col == 2) { | 437 } else if (col == m_layerPlayedColumn) { |
169 if (role == Qt::CheckStateRole) { | 438 if (role == Qt::CheckStateRole) { |
170 PlayParameters *params = layer->getPlayParameters(); | 439 PlayParameters *params = layer->getPlayParameters(); |
171 if (params) return QVariant(params->isPlayMuted() ? | 440 if (params) return QVariant(params->isPlayMuted() ? |
172 Qt::Unchecked : Qt::Checked); | 441 Qt::Unchecked : Qt::Checked); |
173 else return QVariant(); | 442 else return QVariant(); |
174 } else if (role == Qt::TextAlignmentRole) { | 443 } else if (role == Qt::TextAlignmentRole) { |
175 return QVariant(Qt::AlignHCenter); | 444 return QVariant(Qt::AlignHCenter); |
176 } | 445 } |
177 } else if (col == 3) { | 446 } else if (col == m_modelNameColumn) { |
178 Model *model = layer->getModel(); | 447 Model *model = layer->getModel(); |
179 if (model && role == Qt::DisplayRole) { | 448 if (model && role == Qt::DisplayRole) { |
180 return QVariant(model->objectName()); | 449 return QVariant(model->objectName()); |
181 } | 450 } |
182 } | 451 } |
198 if (!pane || pane->getLayerCount() <= row) return false; | 467 if (!pane || pane->getLayerCount() <= row) return false; |
199 | 468 |
200 Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1); | 469 Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1); |
201 if (!layer) return false; | 470 if (!layer) return false; |
202 | 471 |
203 if (col == 1) { | 472 if (col == m_layerVisibleColumn) { |
204 if (role == Qt::CheckStateRole) { | 473 if (role == Qt::CheckStateRole) { |
205 layer->showLayer(pane, value.toInt() == Qt::Checked); | 474 layer->showLayer(pane, value.toInt() == Qt::Checked); |
206 emit dataChanged(index, index); | 475 emit dataChanged(index, index); |
207 return true; | 476 return true; |
208 } | 477 } |
209 } else if (col == 2) { | 478 } else if (col == m_layerPlayedColumn) { |
210 if (role == Qt::CheckStateRole) { | 479 if (role == Qt::CheckStateRole) { |
211 PlayParameters *params = layer->getPlayParameters(); | 480 PlayParameters *params = layer->getPlayParameters(); |
212 if (params) { | 481 if (params) { |
213 params->setPlayMuted(value.toInt() == Qt::Unchecked); | 482 params->setPlayMuted(value.toInt() == Qt::Unchecked); |
214 emit dataChanged(index, index); | 483 emit dataChanged(index, index); |
224 LayerTreeModel::flags(const QModelIndex &index) const | 493 LayerTreeModel::flags(const QModelIndex &index) const |
225 { | 494 { |
226 Qt::ItemFlags flags = Qt::ItemIsEnabled; | 495 Qt::ItemFlags flags = Qt::ItemIsEnabled; |
227 if (!index.isValid()) return flags; | 496 if (!index.isValid()) return flags; |
228 | 497 |
229 if (index.column() == 1 || index.column() == 2) { | 498 if (index.column() == m_layerVisibleColumn || |
499 index.column() == m_layerPlayedColumn) { | |
230 flags |= Qt::ItemIsUserCheckable; | 500 flags |= Qt::ItemIsUserCheckable; |
231 } else if (index.column() == 0) { | 501 } else if (index.column() == 0) { |
232 flags |= Qt::ItemIsSelectable; | 502 flags |= Qt::ItemIsSelectable; |
233 } | 503 } |
234 | 504 |
239 LayerTreeModel::headerData(int section, | 509 LayerTreeModel::headerData(int section, |
240 Qt::Orientation orientation, | 510 Qt::Orientation orientation, |
241 int role) const | 511 int role) const |
242 { | 512 { |
243 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { | 513 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { |
244 if (section == 0) return QVariant(tr("Layer")); | 514 if (section == m_layerNameColumn) return QVariant(tr("Layer")); |
245 else if (section == 1) return QVariant(tr("Shown")); | 515 else if (section == m_layerVisibleColumn) return QVariant(tr("Shown")); |
246 else if (section == 2) return QVariant(tr("Played")); | 516 else if (section == m_layerPlayedColumn) return QVariant(tr("Played")); |
247 else if (section == 3) return QVariant(tr("Model")); | 517 else if (section == m_modelNameColumn) return QVariant(tr("Model")); |
248 } | 518 } |
249 | 519 |
250 return QVariant(); | 520 return QVariant(); |
251 } | 521 } |
252 | 522 |
277 | 547 |
278 QModelIndex | 548 QModelIndex |
279 LayerTreeModel::parent(const QModelIndex &index) const | 549 LayerTreeModel::parent(const QModelIndex &index) const |
280 { | 550 { |
281 QObject *obj = static_cast<QObject *>(index.internalPointer()); | 551 QObject *obj = static_cast<QObject *>(index.internalPointer()); |
552 | |
553 if (m_deletedPanes.find(obj) != m_deletedPanes.end()) { | |
554 // m_deletedPanes.erase(obj); | |
555 return QModelIndex(); | |
556 } | |
282 | 557 |
283 Pane *pane = dynamic_cast<Pane *>(obj); | 558 Pane *pane = dynamic_cast<Pane *>(obj); |
284 if (pane) { | 559 if (pane) { |
285 int index = m_stack->getPaneIndex(pane); | 560 int index = m_stack->getPaneIndex(pane); |
286 if (index >= 0) return createIndex(index, 0, m_stack); | 561 if (index >= 0) return createIndex(index, 0, m_stack); |
306 } | 581 } |
307 | 582 |
308 int | 583 int |
309 LayerTreeModel::columnCount(const QModelIndex &parent) const | 584 LayerTreeModel::columnCount(const QModelIndex &parent) const |
310 { | 585 { |
311 if (!parent.isValid()) return 4; | 586 if (!parent.isValid()) return m_columnCount; |
312 | 587 |
313 QObject *obj = static_cast<QObject *>(parent.internalPointer()); | 588 QObject *obj = static_cast<QObject *>(parent.internalPointer()); |
314 if (obj == m_stack) return 4; // row for a layer | 589 if (obj == m_stack) return m_columnCount; // row for a layer |
315 | 590 |
316 return 1; | 591 return 1; |
317 } | 592 } |
318 | 593 |