annotate widgets/LayerTree.cpp @ 1496:d09345e578a7

Separate out handling of alignment progress bar from the layer progress bars and fix tendency to have them hanging around even when alignment has completed
author Chris Cannam
date Wed, 14 Aug 2019 10:58:24 +0100
parents 232262e38051
children
rev   line source
Chris@43 1
Chris@58 2 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@43 3
Chris@43 4 /*
Chris@59 5 Sonic Visualiser
Chris@59 6 An audio file viewer and annotation editor.
Chris@59 7 Centre for Digital Music, Queen Mary, University of London.
Chris@59 8 This file copyright 2006 Chris Cannam.
Chris@43 9
Chris@59 10 This program is free software; you can redistribute it and/or
Chris@59 11 modify it under the terms of the GNU General Public License as
Chris@59 12 published by the Free Software Foundation; either version 2 of the
Chris@59 13 License, or (at your option) any later version. See the file
Chris@59 14 COPYING included with this distribution for more information.
Chris@43 15 */
Chris@43 16
Chris@43 17 #include "LayerTree.h"
Chris@128 18 #include "view/PaneStack.h"
Chris@43 19
Chris@298 20 #include "base/PlayParameters.h"
Chris@128 21 #include "view/Pane.h"
Chris@128 22 #include "layer/Layer.h"
Chris@128 23 #include "data/model/Model.h"
Chris@336 24 #include "data/model/WaveFileModel.h"
Chris@43 25
Chris@280 26 #include <QIcon>
Chris@43 27 #include <iostream>
Chris@43 28
Chris@43 29
Chris@392 30 ModelMetadataModel::ModelMetadataModel(PaneStack *stack, bool waveModelsOnly,
Chris@336 31 QObject *parent) :
Chris@43 32 QAbstractItemModel(parent),
Chris@336 33 m_stack(stack),
Chris@336 34 m_waveModelsOnly(waveModelsOnly)
Chris@43 35 {
Chris@336 36 if (m_waveModelsOnly) {
Chris@336 37 m_modelTypeColumn = -1;
Chris@336 38 m_modelNameColumn = 0;
Chris@336 39 m_modelMakerColumn = 1;
Chris@336 40 m_modelSourceColumn = 2;
Chris@336 41 m_columnCount = 3;
Chris@336 42 } else {
Chris@336 43 m_modelTypeColumn = 0;
Chris@336 44 m_modelNameColumn = 1;
Chris@336 45 m_modelMakerColumn = 2;
Chris@336 46 m_modelSourceColumn = 3;
Chris@336 47 m_columnCount = 4;
Chris@336 48 }
Chris@336 49
Chris@336 50 connect(stack, SIGNAL(paneAdded()), this, SLOT(paneAdded()));
Chris@336 51 connect(stack, SIGNAL(paneDeleted()), this, SLOT(paneDeleted()));
Chris@298 52
Chris@298 53 for (int i = 0; i < stack->getPaneCount(); ++i) {
Chris@298 54 Pane *pane = stack->getPane(i);
Chris@298 55 if (!pane) continue;
Chris@298 56 connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)),
Chris@298 57 this, SLOT(propertyContainerAdded(PropertyContainer *)));
Chris@298 58 connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)),
Chris@298 59 this, SLOT(propertyContainerRemoved(PropertyContainer *)));
Chris@298 60 connect(pane, SIGNAL(propertyContainerSelected(PropertyContainer *)),
Chris@298 61 this, SLOT(propertyContainerSelected(PropertyContainer *)));
Chris@298 62 connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)),
Chris@298 63 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *)));
Chris@298 64 connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)),
Chris@298 65 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *)));
Chris@336 66 connect(pane, SIGNAL(layerModelChanged()),
Chris@336 67 this, SLOT(paneLayerModelChanged()));
Chris@336 68 }
Chris@336 69
Chris@336 70 rebuildModelSet();
Chris@336 71 }
Chris@336 72
Chris@392 73 ModelMetadataModel::~ModelMetadataModel()
Chris@336 74 {
Chris@336 75 }
Chris@336 76
Chris@336 77 void
Chris@392 78 ModelMetadataModel::rebuildModelSet()
Chris@336 79 {
Chris@1477 80 std::set<ModelId> unfound = m_models;
Chris@336 81
Chris@336 82 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
Chris@336 83
Chris@336 84 Pane *pane = m_stack->getPane(i);
Chris@336 85 if (!pane) continue;
Chris@336 86
Chris@336 87 for (int j = 0; j < pane->getLayerCount(); ++j) {
Chris@336 88
Chris@336 89 Layer *layer = pane->getLayer(j);
Chris@336 90 if (!layer) continue;
Chris@336 91
Chris@1477 92 ModelId modelId = layer->getModel();
Chris@1477 93 if (modelId.isNone()) continue;
Chris@336 94
Chris@336 95 if (m_waveModelsOnly) {
Chris@1477 96 if (!ModelById::getAs<WaveFileModel>(modelId)) continue;
Chris@336 97 }
Chris@336 98
Chris@1477 99 if (m_models.find(modelId) == m_models.end()) {
Chris@1477 100 m_models.insert(modelId);
Chris@336 101 } else {
Chris@1477 102 unfound.erase(modelId);
Chris@336 103 }
Chris@336 104 }
Chris@336 105 }
Chris@336 106
Chris@1477 107 for (ModelId m: unfound) {
Chris@1477 108 m_models.erase(m);
Chris@336 109 }
Chris@336 110
Chris@587 111 SVDEBUG << "ModelMetadataModel::rebuildModelSet: " << m_models.size() << " models" << endl;
Chris@336 112 }
Chris@336 113
Chris@336 114 void
Chris@392 115 ModelMetadataModel::paneAdded()
Chris@336 116 {
Chris@336 117 rebuildModelSet();
Chris@336 118 emit layoutChanged();
Chris@336 119 }
Chris@336 120
Chris@336 121 void
Chris@392 122 ModelMetadataModel::paneDeleted()
Chris@336 123 {
Chris@336 124 rebuildModelSet();
Chris@336 125 emit layoutChanged();
Chris@336 126 }
Chris@336 127
Chris@336 128 void
Chris@392 129 ModelMetadataModel::paneLayerModelChanged()
Chris@336 130 {
Chris@336 131 rebuildModelSet();
Chris@336 132 emit layoutChanged();
Chris@336 133 }
Chris@336 134
Chris@336 135 void
Chris@392 136 ModelMetadataModel::propertyContainerAdded(PropertyContainer *)
Chris@336 137 {
Chris@336 138 rebuildModelSet();
Chris@336 139 emit layoutChanged();
Chris@336 140 }
Chris@336 141
Chris@336 142 void
Chris@392 143 ModelMetadataModel::propertyContainerRemoved(PropertyContainer *)
Chris@336 144 {
Chris@336 145 rebuildModelSet();
Chris@336 146 emit layoutChanged();
Chris@336 147 }
Chris@336 148
Chris@336 149 void
Chris@392 150 ModelMetadataModel::propertyContainerSelected(PropertyContainer *)
Chris@336 151 {
Chris@336 152 }
Chris@336 153
Chris@336 154 void
Chris@807 155 ModelMetadataModel::propertyContainerPropertyChanged(PropertyContainer *)
Chris@336 156 {
Chris@336 157 }
Chris@336 158
Chris@336 159 void
Chris@807 160 ModelMetadataModel::playParametersAudibilityChanged(bool )
Chris@336 161 {
Chris@336 162 }
Chris@336 163
Chris@336 164 QVariant
Chris@392 165 ModelMetadataModel::data(const QModelIndex &index, int role) const
Chris@336 166 {
Chris@336 167 if (!index.isValid()) return QVariant();
Chris@336 168
Chris@807 169 // QObject *obj = static_cast<QObject *>(index.internalPointer());
Chris@336 170 int row = index.row(), col = index.column();
Chris@336 171
Chris@336 172 //!!! not exactly the ideal use of a std::set
Chris@1477 173 std::set<ModelId>::iterator itr = m_models.begin();
Chris@336 174 for (int i = 0; i < row && itr != m_models.end(); ++i, ++itr);
Chris@336 175 if (itr == m_models.end()) return QVariant();
Chris@336 176
Chris@1477 177 auto model = ModelById::get(*itr);
Chris@1477 178 if (!model) return QVariant();
Chris@336 179
Chris@336 180 if (role != Qt::DisplayRole) {
Chris@336 181 if (m_waveModelsOnly && col == m_modelNameColumn &&
Chris@336 182 role == Qt::DecorationRole) {
Chris@336 183 // There is no meaningful icon for a model, in general --
Chris@336 184 // the icons we have represent layer types and it would be
Chris@336 185 // misleading to use them for models. However, if we're
Chris@336 186 // only showing wave models, we use the waveform icon just
Chris@336 187 // for decorative purposes.
Chris@336 188 return QVariant(QIcon(QString(":/icons/waveform.png")));
Chris@336 189 }
Chris@336 190 return QVariant();
Chris@336 191 }
Chris@336 192
Chris@336 193 if (col == m_modelTypeColumn) {
Chris@336 194 return QVariant(model->getTypeName());
Chris@336 195 } else if (col == m_modelNameColumn) {
Chris@336 196 return QVariant(model->objectName());
Chris@336 197 } else if (col == m_modelMakerColumn) {
Chris@336 198 return QVariant(model->getMaker());
Chris@336 199 } else if (col == m_modelSourceColumn) {
Chris@336 200 return QVariant(model->getLocation());
Chris@336 201 }
Chris@336 202
Chris@336 203 return QVariant();
Chris@336 204 }
Chris@336 205
Chris@336 206 bool
Chris@807 207 ModelMetadataModel::setData(const QModelIndex &, const QVariant &, int )
Chris@336 208 {
Chris@336 209 return false;
Chris@336 210 }
Chris@336 211
Chris@336 212 Qt::ItemFlags
Chris@807 213 ModelMetadataModel::flags(const QModelIndex &) const
Chris@336 214 {
Chris@336 215 Qt::ItemFlags flags = Qt::ItemIsEnabled;
Chris@336 216 return flags;
Chris@336 217 }
Chris@336 218
Chris@336 219 QVariant
Chris@392 220 ModelMetadataModel::headerData(int section,
Chris@1266 221 Qt::Orientation orientation,
Chris@1266 222 int role) const
Chris@336 223 {
Chris@336 224 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
Chris@1266 225 if (section == m_modelTypeColumn) return QVariant(tr("Type"));
Chris@1266 226 else if (section == m_modelNameColumn) return QVariant(tr("Name"));
Chris@1266 227 else if (section == m_modelMakerColumn) return QVariant(tr("Maker"));
Chris@1266 228 else if (section == m_modelSourceColumn) return QVariant(tr("Source"));
Chris@336 229 }
Chris@336 230
Chris@336 231 return QVariant();
Chris@336 232 }
Chris@336 233
Chris@336 234 QModelIndex
Chris@392 235 ModelMetadataModel::index(int row, int column, const QModelIndex &parent) const
Chris@336 236 {
Chris@336 237 if (!parent.isValid()) {
Chris@807 238 if (row >= (int)m_models.size()) return QModelIndex();
Chris@1408 239 return createIndex(row, column, (void *)nullptr);
Chris@336 240 }
Chris@336 241
Chris@336 242 return QModelIndex();
Chris@336 243 }
Chris@336 244
Chris@336 245 QModelIndex
Chris@807 246 ModelMetadataModel::parent(const QModelIndex &) const
Chris@336 247 {
Chris@336 248 return QModelIndex();
Chris@336 249 }
Chris@336 250
Chris@336 251 int
Chris@392 252 ModelMetadataModel::rowCount(const QModelIndex &parent) const
Chris@336 253 {
Chris@908 254 if (!parent.isValid()) return int(m_models.size());
Chris@336 255 return 0;
Chris@336 256 }
Chris@336 257
Chris@336 258 int
Chris@807 259 ModelMetadataModel::columnCount(const QModelIndex &) const
Chris@336 260 {
Chris@336 261 return m_columnCount;
Chris@336 262 }
Chris@336 263
Chris@336 264
Chris@336 265
Chris@336 266 LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) :
Chris@336 267 QAbstractItemModel(parent),
Chris@336 268 m_stack(stack)
Chris@336 269 {
Chris@336 270 m_layerNameColumn = 0;
Chris@336 271 m_layerVisibleColumn = 1;
Chris@336 272 m_layerPlayedColumn = 2;
Chris@336 273 m_modelNameColumn = 3;
Chris@336 274 m_columnCount = 4;
Chris@336 275
Chris@336 276 connect(stack, SIGNAL(paneAdded()), this, SLOT(paneAdded()));
Chris@336 277 connect(stack, SIGNAL(paneAboutToBeDeleted(Pane *)),
Chris@336 278 this, SLOT(paneAboutToBeDeleted(Pane *)));
Chris@336 279
Chris@336 280 for (int i = 0; i < stack->getPaneCount(); ++i) {
Chris@336 281 Pane *pane = stack->getPane(i);
Chris@336 282 if (!pane) continue;
Chris@336 283 connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)),
Chris@336 284 this, SLOT(propertyContainerAdded(PropertyContainer *)));
Chris@336 285 connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)),
Chris@336 286 this, SLOT(propertyContainerRemoved(PropertyContainer *)));
Chris@336 287 connect(pane, SIGNAL(propertyContainerSelected(PropertyContainer *)),
Chris@336 288 this, SLOT(propertyContainerSelected(PropertyContainer *)));
Chris@336 289 connect(pane, SIGNAL(propertyContainerPropertyChanged(PropertyContainer *)),
Chris@336 290 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *)));
Chris@336 291 connect(pane, SIGNAL(propertyContainerNameChanged(PropertyContainer *)),
Chris@336 292 this, SLOT(propertyContainerPropertyChanged(PropertyContainer *)));
Chris@336 293 connect(pane, SIGNAL(layerModelChanged()),
Chris@336 294 this, SLOT(paneLayerModelChanged()));
Chris@336 295
Chris@298 296 for (int j = 0; j < pane->getLayerCount(); ++j) {
Chris@298 297 Layer *layer = pane->getLayer(j);
Chris@298 298 if (!layer) continue;
Chris@1480 299 auto params = layer->getPlayParameters();
Chris@298 300 if (!params) continue;
Chris@1480 301 connect(params.get(), SIGNAL(playAudibleChanged(bool)),
Chris@298 302 this, SLOT(playParametersAudibilityChanged(bool)));
Chris@298 303 }
Chris@298 304 }
Chris@43 305 }
Chris@43 306
Chris@43 307 LayerTreeModel::~LayerTreeModel()
Chris@43 308 {
Chris@43 309 }
Chris@43 310
Chris@298 311 void
Chris@336 312 LayerTreeModel::paneAdded()
Chris@336 313 {
Chris@336 314 emit layoutChanged();
Chris@336 315 }
Chris@336 316
Chris@336 317 void
Chris@336 318 LayerTreeModel::paneAboutToBeDeleted(Pane *pane)
Chris@336 319 {
Chris@682 320 cerr << "paneDeleted: " << pane << endl;
Chris@336 321 m_deletedPanes.insert(pane);
Chris@336 322 emit layoutChanged();
Chris@336 323 }
Chris@336 324
Chris@336 325 void
Chris@298 326 LayerTreeModel::propertyContainerAdded(PropertyContainer *)
Chris@298 327 {
Chris@298 328 emit layoutChanged();
Chris@298 329 }
Chris@298 330
Chris@298 331 void
Chris@298 332 LayerTreeModel::propertyContainerRemoved(PropertyContainer *)
Chris@298 333 {
Chris@298 334 emit layoutChanged();
Chris@298 335 }
Chris@298 336
Chris@298 337 void
Chris@298 338 LayerTreeModel::propertyContainerSelected(PropertyContainer *)
Chris@298 339 {
Chris@298 340 emit layoutChanged();
Chris@298 341 }
Chris@298 342
Chris@298 343 void
Chris@336 344 LayerTreeModel::paneLayerModelChanged()
Chris@336 345 {
Chris@336 346 emit layoutChanged();
Chris@336 347 }
Chris@336 348
Chris@336 349 void
Chris@298 350 LayerTreeModel::propertyContainerPropertyChanged(PropertyContainer *pc)
Chris@298 351 {
Chris@298 352 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
Chris@298 353 Pane *pane = m_stack->getPane(i);
Chris@298 354 if (!pane) continue;
Chris@298 355 for (int j = 0; j < pane->getLayerCount(); ++j) {
Chris@298 356 if (pane->getLayer(j) == pc) {
Chris@298 357 emit dataChanged(createIndex(pane->getLayerCount() - j - 1,
Chris@336 358 m_layerNameColumn, pane),
Chris@298 359 createIndex(pane->getLayerCount() - j - 1,
Chris@336 360 m_modelNameColumn, pane));
Chris@298 361 }
Chris@298 362 }
Chris@298 363 }
Chris@298 364 }
Chris@298 365
Chris@298 366 void
Chris@298 367 LayerTreeModel::playParametersAudibilityChanged(bool a)
Chris@298 368 {
Chris@298 369 PlayParameters *params = dynamic_cast<PlayParameters *>(sender());
Chris@298 370 if (!params) return;
Chris@298 371
Chris@587 372 SVDEBUG << "LayerTreeModel::playParametersAudibilityChanged("
Chris@585 373 << params << "," << a << ")" << endl;
Chris@298 374
Chris@298 375 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
Chris@298 376 Pane *pane = m_stack->getPane(i);
Chris@298 377 if (!pane) continue;
Chris@298 378 for (int j = 0; j < pane->getLayerCount(); ++j) {
Chris@298 379 Layer *layer = pane->getLayer(j);
Chris@298 380 if (!layer) continue;
Chris@1480 381 if (layer->getPlayParameters().get() == params) { // ugh
Chris@587 382 SVDEBUG << "LayerTreeModel::playParametersAudibilityChanged("
Chris@585 383 << params << "," << a << "): row " << pane->getLayerCount() - j - 1 << ", col " << 2 << endl;
Chris@298 384
Chris@298 385 emit dataChanged(createIndex(pane->getLayerCount() - j - 1,
Chris@336 386 m_layerPlayedColumn, pane),
Chris@298 387 createIndex(pane->getLayerCount() - j - 1,
Chris@336 388 m_layerPlayedColumn, pane));
Chris@298 389 }
Chris@298 390 }
Chris@298 391 }
Chris@298 392 }
Chris@298 393
Chris@43 394 QVariant
Chris@43 395 LayerTreeModel::data(const QModelIndex &index, int role) const
Chris@43 396 {
Chris@43 397 if (!index.isValid()) return QVariant();
Chris@56 398
Chris@43 399 QObject *obj = static_cast<QObject *>(index.internalPointer());
Chris@277 400 int row = index.row(), col = index.column();
Chris@277 401
Chris@277 402 Pane *pane = dynamic_cast<Pane *>(obj);
Chris@277 403 if (!pane) {
Chris@277 404 if (col == 0 && row < m_stack->getPaneCount()) {
Chris@277 405 switch (role) {
Chris@277 406 case Qt::DisplayRole:
Chris@277 407 return QVariant(QString("Pane %1").arg(row + 1));
Chris@277 408 case Qt::DecorationRole:
Chris@277 409 return QVariant(QIcon(QString(":/icons/pane.png")));
Chris@277 410 default: break;
Chris@277 411 }
Chris@277 412 }
Chris@43 413 }
Chris@43 414
Chris@277 415 if (pane && pane->getLayerCount() > row) {
Chris@298 416 Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1);
Chris@277 417 if (layer) {
Chris@336 418 if (col == m_layerNameColumn) {
Chris@277 419 switch (role) {
Chris@277 420 case Qt::DisplayRole:
Chris@277 421 return QVariant(layer->objectName());
Chris@277 422 case Qt::DecorationRole:
Chris@277 423 return QVariant
Chris@277 424 (QIcon(QString(":/icons/%1.png")
Chris@277 425 .arg(layer->getPropertyContainerIconName())));
Chris@277 426 default: break;
Chris@277 427 }
Chris@336 428 } else if (col == m_layerVisibleColumn) {
Chris@298 429 if (role == Qt::CheckStateRole) {
Chris@298 430 return QVariant(layer->isLayerDormant(pane) ?
Chris@298 431 Qt::Unchecked : Qt::Checked);
Chris@298 432 } else if (role == Qt::TextAlignmentRole) {
Chris@298 433 return QVariant(Qt::AlignHCenter);
Chris@298 434 }
Chris@336 435 } else if (col == m_layerPlayedColumn) {
Chris@298 436 if (role == Qt::CheckStateRole) {
Chris@1480 437 auto params = layer->getPlayParameters();
Chris@298 438 if (params) return QVariant(params->isPlayMuted() ?
Chris@298 439 Qt::Unchecked : Qt::Checked);
Chris@298 440 else return QVariant();
Chris@298 441 } else if (role == Qt::TextAlignmentRole) {
Chris@298 442 return QVariant(Qt::AlignHCenter);
Chris@298 443 }
Chris@336 444 } else if (col == m_modelNameColumn) {
Chris@1477 445 auto model = ModelById::get(layer->getModel());
Chris@277 446 if (model && role == Qt::DisplayRole) {
Chris@277 447 return QVariant(model->objectName());
Chris@277 448 }
Chris@277 449 }
Chris@277 450 }
Chris@43 451 }
Chris@43 452
Chris@43 453 return QVariant();
Chris@43 454 }
Chris@43 455
Chris@298 456 bool
Chris@298 457 LayerTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
Chris@298 458 {
Chris@298 459 if (!index.isValid()) return false;
Chris@298 460
Chris@298 461 QObject *obj = static_cast<QObject *>(index.internalPointer());
Chris@298 462 int row = index.row(), col = index.column();
Chris@298 463
Chris@298 464 Pane *pane = dynamic_cast<Pane *>(obj);
Chris@298 465 if (!pane || pane->getLayerCount() <= row) return false;
Chris@298 466
Chris@298 467 Layer *layer = pane->getLayer(pane->getLayerCount() - row - 1);
Chris@298 468 if (!layer) return false;
Chris@298 469
Chris@336 470 if (col == m_layerVisibleColumn) {
Chris@298 471 if (role == Qt::CheckStateRole) {
Chris@298 472 layer->showLayer(pane, value.toInt() == Qt::Checked);
Chris@298 473 emit dataChanged(index, index);
Chris@298 474 return true;
Chris@298 475 }
Chris@336 476 } else if (col == m_layerPlayedColumn) {
Chris@298 477 if (role == Qt::CheckStateRole) {
Chris@1480 478 auto params = layer->getPlayParameters();
Chris@298 479 if (params) {
Chris@298 480 params->setPlayMuted(value.toInt() == Qt::Unchecked);
Chris@298 481 emit dataChanged(index, index);
Chris@298 482 return true;
Chris@298 483 }
Chris@298 484 }
Chris@298 485 }
Chris@298 486
Chris@298 487 return false;
Chris@298 488 }
Chris@298 489
Chris@43 490 Qt::ItemFlags
Chris@43 491 LayerTreeModel::flags(const QModelIndex &index) const
Chris@43 492 {
Chris@298 493 Qt::ItemFlags flags = Qt::ItemIsEnabled;
Chris@298 494 if (!index.isValid()) return flags;
Chris@298 495
Chris@336 496 if (index.column() == m_layerVisibleColumn ||
Chris@336 497 index.column() == m_layerPlayedColumn) {
Chris@298 498 flags |= Qt::ItemIsUserCheckable;
Chris@298 499 } else if (index.column() == 0) {
Chris@298 500 flags |= Qt::ItemIsSelectable;
Chris@298 501 }
Chris@298 502
Chris@298 503 return flags;
Chris@43 504 }
Chris@43 505
Chris@43 506 QVariant
Chris@56 507 LayerTreeModel::headerData(int section,
Chris@1266 508 Qt::Orientation orientation,
Chris@1266 509 int role) const
Chris@43 510 {
Chris@56 511 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
Chris@1266 512 if (section == m_layerNameColumn) return QVariant(tr("Layer"));
Chris@336 513 else if (section == m_layerVisibleColumn) return QVariant(tr("Shown"));
Chris@336 514 else if (section == m_layerPlayedColumn) return QVariant(tr("Played"));
Chris@1266 515 else if (section == m_modelNameColumn) return QVariant(tr("Model"));
Chris@56 516 }
Chris@56 517
Chris@56 518 return QVariant();
Chris@43 519 }
Chris@43 520
Chris@43 521 QModelIndex
Chris@43 522 LayerTreeModel::index(int row, int column, const QModelIndex &parent) const
Chris@43 523 {
Chris@277 524 // cell for a pane contains row, column, pane stack
Chris@277 525 // -> its parent is the invalid cell
Chris@277 526
Chris@277 527 // cell for a layer contains row, column, pane
Chris@277 528 // -> its parent is row, column, pane stack (which identify the pane)
Chris@43 529
Chris@43 530 if (!parent.isValid()) {
Chris@277 531 if (row >= m_stack->getPaneCount() || column > 0) return QModelIndex();
Chris@1266 532 return createIndex(row, column, m_stack);
Chris@43 533 }
Chris@43 534
Chris@43 535 QObject *obj = static_cast<QObject *>(parent.internalPointer());
Chris@277 536
Chris@277 537 if (obj == m_stack) {
Chris@277 538 Pane *pane = m_stack->getPane(parent.row());
Chris@277 539 if (!pane || parent.column() > 0) return QModelIndex();
Chris@277 540 return createIndex(row, column, pane);
Chris@43 541 }
Chris@43 542
Chris@43 543 return QModelIndex();
Chris@43 544 }
Chris@43 545
Chris@43 546 QModelIndex
Chris@43 547 LayerTreeModel::parent(const QModelIndex &index) const
Chris@43 548 {
Chris@43 549 QObject *obj = static_cast<QObject *>(index.internalPointer());
Chris@43 550
Chris@336 551 if (m_deletedPanes.find(obj) != m_deletedPanes.end()) {
Chris@336 552 // m_deletedPanes.erase(obj);
Chris@336 553 return QModelIndex();
Chris@336 554 }
Chris@336 555
Chris@43 556 Pane *pane = dynamic_cast<Pane *>(obj);
Chris@43 557 if (pane) {
Chris@277 558 int index = m_stack->getPaneIndex(pane);
Chris@277 559 if (index >= 0) return createIndex(index, 0, m_stack);
Chris@43 560 }
Chris@43 561
Chris@43 562 return QModelIndex();
Chris@43 563 }
Chris@43 564
Chris@43 565 int
Chris@43 566 LayerTreeModel::rowCount(const QModelIndex &parent) const
Chris@43 567 {
Chris@277 568 if (!parent.isValid()) return m_stack->getPaneCount();
Chris@43 569
Chris@43 570 QObject *obj = static_cast<QObject *>(parent.internalPointer());
Chris@43 571
Chris@277 572 if (obj == m_stack) {
Chris@277 573 Pane *pane = m_stack->getPane(parent.row());
Chris@277 574 if (!pane || parent.column() > 0) return 0;
Chris@277 575 return pane->getLayerCount();
Chris@43 576 }
Chris@43 577
Chris@43 578 return 0;
Chris@43 579 }
Chris@43 580
Chris@43 581 int
Chris@43 582 LayerTreeModel::columnCount(const QModelIndex &parent) const
Chris@43 583 {
Chris@336 584 if (!parent.isValid()) return m_columnCount;
Chris@43 585
Chris@43 586 QObject *obj = static_cast<QObject *>(parent.internalPointer());
Chris@336 587 if (obj == m_stack) return m_columnCount; // row for a layer
Chris@56 588
Chris@43 589 return 1;
Chris@43 590 }
Chris@43 591