annotate widgets/LayerTree.cpp @ 56:fedaf3ffe80a

* Add menu for re-adding existing layers * Fix layer tree window so that it at least approximates correct * Add bundled operations in command history, for use with things like multiple consecutive changes to a parameter value * Disambiguate plugins that happen to have identical descriptions * Add spectral centroid plugin (could use some parameters!) * Some other fixes
author Chris Cannam
date Fri, 17 Mar 2006 17:38:28 +0000
parents ad214997dddb
children 01ab51f72e84
rev   line source
Chris@43 1
Chris@43 2 /* -*- c-basic-offset: 4 -*- vi:set ts=8 sts=4 sw=4: */
Chris@43 3
Chris@43 4 /*
Chris@43 5 A waveform viewer and audio annotation editor.
Chris@43 6 Chris Cannam, Queen Mary University of London, 2005-2006
Chris@43 7
Chris@43 8 This is experimental software. Not for distribution.
Chris@43 9 */
Chris@43 10
Chris@43 11 #include "LayerTree.h"
Chris@43 12 #include "PaneStack.h"
Chris@43 13
Chris@43 14 #include "widgets/Pane.h"
Chris@43 15 #include "base/Layer.h"
Chris@56 16 #include "base/Model.h"
Chris@43 17
Chris@43 18 #include <iostream>
Chris@43 19
Chris@43 20
Chris@56 21 class ViewObjectAssoc : public QObject
Chris@56 22 {
Chris@56 23 public:
Chris@56 24 ViewObjectAssoc(QObject *parent, View *v, QObject *o) :
Chris@56 25 QObject(parent), view(v), object(o) {
Chris@56 26 ++extantCount;
Chris@56 27 }
Chris@56 28
Chris@56 29 virtual ~ViewObjectAssoc() {
Chris@56 30 std::cerr << "~ViewObjectAssoc (now " << --extantCount << " extant)"
Chris@56 31 << std::endl;
Chris@56 32 }
Chris@56 33
Chris@56 34 View *view;
Chris@56 35 QObject *object;
Chris@56 36
Chris@56 37 static int extantCount;
Chris@56 38 };
Chris@56 39
Chris@56 40 int ViewObjectAssoc::extantCount = 0;
Chris@56 41
Chris@56 42
Chris@43 43 LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) :
Chris@43 44 QAbstractItemModel(parent),
Chris@43 45 m_stack(stack)
Chris@43 46 {
Chris@43 47 }
Chris@43 48
Chris@43 49 LayerTreeModel::~LayerTreeModel()
Chris@43 50 {
Chris@43 51 }
Chris@43 52
Chris@43 53 QVariant
Chris@43 54 LayerTreeModel::data(const QModelIndex &index, int role) const
Chris@43 55 {
Chris@43 56 if (!index.isValid()) return QVariant();
Chris@43 57 if (role != Qt::DisplayRole) return QVariant();
Chris@43 58
Chris@56 59 std::cerr << "LayerTreeModel::data(" << &index << ", role " << role << ")" << std::endl;
Chris@56 60
Chris@43 61 QObject *obj = static_cast<QObject *>(index.internalPointer());
Chris@43 62
Chris@43 63 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
Chris@43 64 if (paneStack) {
Chris@43 65 std::cerr << "node is pane stack" << std::endl;
Chris@43 66 return QVariant("Pane stack");
Chris@43 67 }
Chris@43 68
Chris@43 69 Pane *pane = dynamic_cast<Pane *>(obj);
Chris@43 70 if (pane) {
Chris@43 71 // need index of pane in pane stack
Chris@43 72 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
Chris@43 73 if (pane == m_stack->getPane(i)) {
Chris@43 74 std::cerr << "node is pane " << i << std::endl;
Chris@43 75 return QVariant(QString("Pane %1").arg(i + 1));
Chris@43 76 }
Chris@43 77 }
Chris@43 78 return QVariant();
Chris@43 79 }
Chris@43 80
Chris@56 81 ViewObjectAssoc *assoc = dynamic_cast<ViewObjectAssoc *>(obj);
Chris@56 82 if (assoc) {
Chris@56 83 std::cerr << "node is assoc" << std::endl;
Chris@56 84 Layer *layer = dynamic_cast<Layer *>(assoc->object);
Chris@56 85 if (layer) {
Chris@56 86 std::cerr << "with layer" << std::endl;
Chris@56 87 return QVariant(layer->objectName());
Chris@56 88 }
Chris@56 89 Model *model = dynamic_cast<Model *>(assoc->object);
Chris@56 90 if (model) {
Chris@56 91 std::cerr << "with model" << std::endl;
Chris@56 92 return QVariant(model->objectName());
Chris@56 93 }
Chris@43 94 }
Chris@43 95
Chris@43 96 return QVariant();
Chris@43 97 }
Chris@43 98
Chris@43 99 Qt::ItemFlags
Chris@43 100 LayerTreeModel::flags(const QModelIndex &index) const
Chris@43 101 {
Chris@56 102 if (!index.isValid()) return Qt::ItemIsEnabled;
Chris@56 103 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
Chris@43 104 }
Chris@43 105
Chris@43 106 QVariant
Chris@56 107 LayerTreeModel::headerData(int section,
Chris@43 108 Qt::Orientation orientation,
Chris@43 109 int role) const
Chris@43 110 {
Chris@56 111 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
Chris@56 112 if (section == 0) return QVariant(tr("Layer"));
Chris@56 113 else if (section == 1) return QVariant(tr("Model"));
Chris@56 114 }
Chris@56 115
Chris@56 116 return QVariant();
Chris@43 117 }
Chris@43 118
Chris@43 119 QModelIndex
Chris@43 120 LayerTreeModel::index(int row, int column, const QModelIndex &parent) const
Chris@43 121 {
Chris@43 122 std::cerr << "LayerTreeModel::index(" << row << ", " << column << ", "
Chris@43 123 << &parent << ")" << std::endl;
Chris@43 124
Chris@43 125 if (!parent.isValid()) {
Chris@43 126 // this is the pane stack
Chris@43 127 std::cerr << "parent invalid, returning pane stack as root" << std::endl;
Chris@56 128 if (column > 0) return QModelIndex();
Chris@43 129 return createIndex(row, column, m_stack);
Chris@43 130 }
Chris@43 131
Chris@43 132 QObject *obj = static_cast<QObject *>(parent.internalPointer());
Chris@43 133
Chris@43 134 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
Chris@43 135 if (paneStack) {
Chris@56 136 if (column > 0) return QModelIndex();
Chris@43 137 if (paneStack == m_stack && row < m_stack->getPaneCount()) {
Chris@43 138 std::cerr << "parent is pane stack, returning a pane" << std::endl;
Chris@43 139 return createIndex(row, column, m_stack->getPane(row));
Chris@43 140 }
Chris@43 141 std::cerr << "parent is wrong pane stack, returning nothing" << std::endl;
Chris@43 142 return QModelIndex();
Chris@43 143 }
Chris@43 144
Chris@43 145 Pane *pane = dynamic_cast<Pane *>(obj);
Chris@43 146 if (pane) {
Chris@56 147 std::cerr << "parent is pane" << std::endl;
Chris@43 148 if (row < pane->getLayerCount()) {
Chris@56 149 Layer *layer = pane->getLayer(row);
Chris@56 150 if (column == 0) {
Chris@56 151 std::cerr << "parent is pane, returning layer" << std::endl;
Chris@56 152 ViewObjectAssoc *assoc = new ViewObjectAssoc
Chris@56 153 (const_cast<LayerTreeModel *>(this), pane, layer);
Chris@56 154 return createIndex(row, column, assoc);
Chris@56 155 } else {
Chris@56 156 std::cerr << "parent is pane, column != 0, returning model" << std::endl;
Chris@56 157 ViewObjectAssoc *assoc = new ViewObjectAssoc
Chris@56 158 (const_cast<LayerTreeModel *>(this), pane, layer->getModel());
Chris@56 159 return createIndex(row, column, assoc);
Chris@56 160 }
Chris@43 161 }
Chris@43 162 }
Chris@43 163
Chris@43 164 std::cerr << "unknown parent, returning nothing" << std::endl;
Chris@43 165 return QModelIndex();
Chris@43 166 }
Chris@43 167
Chris@43 168 QModelIndex
Chris@43 169 LayerTreeModel::parent(const QModelIndex &index) const
Chris@43 170 {
Chris@43 171 std::cerr << "LayerTreeModel::parent(" << &index << ")" << std::endl;
Chris@43 172
Chris@43 173 QObject *obj = static_cast<QObject *>(index.internalPointer());
Chris@43 174
Chris@43 175 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
Chris@43 176 if (paneStack) {
Chris@43 177 std::cerr << "node is pane stack, returning no parent" << std::endl;
Chris@43 178 return QModelIndex();
Chris@43 179 }
Chris@43 180
Chris@43 181 Pane *pane = dynamic_cast<Pane *>(obj);
Chris@43 182 if (pane) {
Chris@43 183 std::cerr << "node is pane, returning pane stack as parent" << std::endl;
Chris@43 184 return createIndex(0, 0, m_stack);
Chris@43 185 }
Chris@43 186
Chris@56 187 ViewObjectAssoc *assoc = dynamic_cast<ViewObjectAssoc *>(obj);
Chris@56 188 if (assoc) {
Chris@56 189 View *view = assoc->view;
Chris@56 190 Pane *pane = dynamic_cast<Pane *>(view);
Chris@43 191 if (pane) {
Chris@43 192 // need index of pane in pane stack
Chris@43 193 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
Chris@43 194 if (pane == m_stack->getPane(i)) {
Chris@56 195 std::cerr << "node is assoc, returning pane " << i << " as parent" << std::endl;
Chris@43 196 return createIndex(i, 0, pane);
Chris@43 197 }
Chris@43 198 }
Chris@43 199 }
Chris@56 200 std::cerr << "node is assoc, but no parent found" << std::endl;
Chris@43 201 return QModelIndex();
Chris@43 202 }
Chris@43 203
Chris@43 204 std::cerr << "unknown node" << std::endl;
Chris@43 205 return QModelIndex();
Chris@43 206 }
Chris@43 207
Chris@43 208 int
Chris@43 209 LayerTreeModel::rowCount(const QModelIndex &parent) const
Chris@43 210 {
Chris@43 211 std::cerr << "LayerTreeModel::rowCount(" << &parent << ")" << std::endl;
Chris@43 212
Chris@43 213 if (!parent.isValid()) {
Chris@43 214 std::cerr << "parent invalid, returning 1 for the pane stack" << std::endl;
Chris@43 215 return 1; // the pane stack
Chris@43 216 }
Chris@43 217
Chris@43 218 QObject *obj = static_cast<QObject *>(parent.internalPointer());
Chris@43 219
Chris@43 220 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
Chris@43 221 if (paneStack) {
Chris@43 222 if (paneStack == m_stack) {
Chris@43 223 std::cerr << "parent is pane stack, returning "
Chris@43 224 << m_stack->getPaneCount() << " panes" << std::endl;
Chris@43 225 return m_stack->getPaneCount();
Chris@43 226 } else {
Chris@43 227 return 0;
Chris@43 228 }
Chris@43 229 }
Chris@43 230
Chris@43 231 Pane *pane = dynamic_cast<Pane *>(obj);
Chris@43 232 if (pane) {
Chris@43 233 std::cerr << "parent is pane, returning "
Chris@43 234 << pane->getLayerCount() << " layers" << std::endl;
Chris@43 235 return pane->getLayerCount();
Chris@43 236 }
Chris@43 237
Chris@43 238 std::cerr << "parent unknown, returning 0" << std::endl;
Chris@43 239 return 0;
Chris@43 240 }
Chris@43 241
Chris@43 242 int
Chris@43 243 LayerTreeModel::columnCount(const QModelIndex &parent) const
Chris@43 244 {
Chris@56 245 if (!parent.isValid()) {
Chris@56 246 std::cerr << "LayerTreeModel::columnCount: parent invalid, returning 2" << std::endl;
Chris@56 247 return 2;
Chris@56 248 }
Chris@43 249
Chris@43 250 QObject *obj = static_cast<QObject *>(parent.internalPointer());
Chris@43 251
Chris@43 252 Pane *pane = dynamic_cast<Pane *>(obj);
Chris@43 253 if (pane) {
Chris@56 254 std::cerr << "LayerTreeModel::columnCount: pane, returning 2" << std::endl;
Chris@56 255 return 2; // layer and model
Chris@43 256 }
Chris@43 257
Chris@56 258 std::cerr << "LayerTreeModel::columnCount: returning 1" << std::endl;
Chris@56 259
Chris@43 260 return 1;
Chris@43 261 }
Chris@43 262