annotate widgets/LayerTree.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1
lbajardsilogic@0 2 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 3
lbajardsilogic@0 4 /*
lbajardsilogic@0 5 Sonic Visualiser
lbajardsilogic@0 6 An audio file viewer and annotation editor.
lbajardsilogic@0 7 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 8 This file copyright 2006 Chris Cannam.
lbajardsilogic@0 9
lbajardsilogic@0 10 This program is free software; you can redistribute it and/or
lbajardsilogic@0 11 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 12 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 13 License, or (at your option) any later version. See the file
lbajardsilogic@0 14 COPYING included with this distribution for more information.
lbajardsilogic@0 15 */
lbajardsilogic@0 16
lbajardsilogic@0 17 #include "LayerTree.h"
lbajardsilogic@0 18 #include "view/PaneStack.h"
lbajardsilogic@0 19
lbajardsilogic@0 20 #include "view/Pane.h"
lbajardsilogic@0 21 #include "layer/Layer.h"
lbajardsilogic@0 22 #include "data/model/Model.h"
lbajardsilogic@0 23
lbajardsilogic@0 24 #include <iostream>
lbajardsilogic@0 25
lbajardsilogic@0 26
lbajardsilogic@0 27 class ViewObjectAssoc : public QObject
lbajardsilogic@0 28 {
lbajardsilogic@0 29 public:
lbajardsilogic@0 30 ViewObjectAssoc(QObject *parent, View *v, QObject *o) :
lbajardsilogic@0 31 QObject(parent), view(v), object(o) {
lbajardsilogic@0 32 ++extantCount;
lbajardsilogic@0 33 }
lbajardsilogic@0 34
lbajardsilogic@0 35 virtual ~ViewObjectAssoc() {
lbajardsilogic@0 36 std::cerr << "~ViewObjectAssoc (now " << --extantCount << " extant)"
lbajardsilogic@0 37 << std::endl;
lbajardsilogic@0 38 }
lbajardsilogic@0 39
lbajardsilogic@0 40 View *view;
lbajardsilogic@0 41 QObject *object;
lbajardsilogic@0 42
lbajardsilogic@0 43 static int extantCount;
lbajardsilogic@0 44 };
lbajardsilogic@0 45
lbajardsilogic@0 46 int ViewObjectAssoc::extantCount = 0;
lbajardsilogic@0 47
lbajardsilogic@0 48
lbajardsilogic@0 49 LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) :
lbajardsilogic@0 50 QAbstractItemModel(parent),
lbajardsilogic@0 51 m_stack(stack)
lbajardsilogic@0 52 {
lbajardsilogic@0 53 }
lbajardsilogic@0 54
lbajardsilogic@0 55 LayerTreeModel::~LayerTreeModel()
lbajardsilogic@0 56 {
lbajardsilogic@0 57 }
lbajardsilogic@0 58
lbajardsilogic@0 59 QVariant
lbajardsilogic@0 60 LayerTreeModel::data(const QModelIndex &index, int role) const
lbajardsilogic@0 61 {
lbajardsilogic@0 62 if (!index.isValid()) return QVariant();
lbajardsilogic@0 63 if (role != Qt::DisplayRole) return QVariant();
lbajardsilogic@0 64
lbajardsilogic@0 65 std::cerr << "LayerTreeModel::data(" << &index << ", role " << role << ")" << std::endl;
lbajardsilogic@0 66
lbajardsilogic@0 67 QObject *obj = static_cast<QObject *>(index.internalPointer());
lbajardsilogic@0 68
lbajardsilogic@0 69 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
lbajardsilogic@0 70 if (paneStack) {
lbajardsilogic@0 71 std::cerr << "node is pane stack" << std::endl;
lbajardsilogic@0 72 return QVariant("Pane stack");
lbajardsilogic@0 73 }
lbajardsilogic@0 74
lbajardsilogic@0 75 Pane *pane = dynamic_cast<Pane *>(obj);
lbajardsilogic@0 76 if (pane) {
lbajardsilogic@0 77 // need index of pane in pane stack
lbajardsilogic@0 78 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
lbajardsilogic@0 79 if (pane == m_stack->getPane(i)) {
lbajardsilogic@0 80 std::cerr << "node is pane " << i << std::endl;
lbajardsilogic@0 81 return QVariant(QString("Pane %1").arg(i + 1));
lbajardsilogic@0 82 }
lbajardsilogic@0 83 }
lbajardsilogic@0 84 return QVariant();
lbajardsilogic@0 85 }
lbajardsilogic@0 86
lbajardsilogic@0 87 ViewObjectAssoc *assoc = dynamic_cast<ViewObjectAssoc *>(obj);
lbajardsilogic@0 88 if (assoc) {
lbajardsilogic@0 89 std::cerr << "node is assoc" << std::endl;
lbajardsilogic@0 90 Layer *layer = dynamic_cast<Layer *>(assoc->object);
lbajardsilogic@0 91 if (layer) {
lbajardsilogic@0 92 std::cerr << "with layer" << std::endl;
lbajardsilogic@0 93 return QVariant(layer->objectName());
lbajardsilogic@0 94 }
lbajardsilogic@0 95 Model *model = dynamic_cast<Model *>(assoc->object);
lbajardsilogic@0 96 if (model) {
lbajardsilogic@0 97 std::cerr << "with model" << std::endl;
lbajardsilogic@0 98 return QVariant(model->objectName());
lbajardsilogic@0 99 }
lbajardsilogic@0 100 }
lbajardsilogic@0 101
lbajardsilogic@0 102 return QVariant();
lbajardsilogic@0 103 }
lbajardsilogic@0 104
lbajardsilogic@0 105 Qt::ItemFlags
lbajardsilogic@0 106 LayerTreeModel::flags(const QModelIndex &index) const
lbajardsilogic@0 107 {
lbajardsilogic@0 108 if (!index.isValid()) return Qt::ItemIsEnabled;
lbajardsilogic@0 109 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
lbajardsilogic@0 110 }
lbajardsilogic@0 111
lbajardsilogic@0 112 QVariant
lbajardsilogic@0 113 LayerTreeModel::headerData(int section,
lbajardsilogic@0 114 Qt::Orientation orientation,
lbajardsilogic@0 115 int role) const
lbajardsilogic@0 116 {
lbajardsilogic@0 117 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
lbajardsilogic@0 118 if (section == 0) return QVariant(tr("Layer"));
lbajardsilogic@0 119 else if (section == 1) return QVariant(tr("Model"));
lbajardsilogic@0 120 }
lbajardsilogic@0 121
lbajardsilogic@0 122 return QVariant();
lbajardsilogic@0 123 }
lbajardsilogic@0 124
lbajardsilogic@0 125 QModelIndex
lbajardsilogic@0 126 LayerTreeModel::index(int row, int column, const QModelIndex &parent) const
lbajardsilogic@0 127 {
lbajardsilogic@0 128 std::cerr << "LayerTreeModel::index(" << row << ", " << column << ", "
lbajardsilogic@0 129 << &parent << ")" << std::endl;
lbajardsilogic@0 130
lbajardsilogic@0 131 if (!parent.isValid()) {
lbajardsilogic@0 132 // this is the pane stack
lbajardsilogic@0 133 std::cerr << "parent invalid, returning pane stack as root" << std::endl;
lbajardsilogic@0 134 if (column > 0) return QModelIndex();
lbajardsilogic@0 135 return createIndex(row, column, m_stack);
lbajardsilogic@0 136 }
lbajardsilogic@0 137
lbajardsilogic@0 138 QObject *obj = static_cast<QObject *>(parent.internalPointer());
lbajardsilogic@0 139
lbajardsilogic@0 140 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
lbajardsilogic@0 141 if (paneStack) {
lbajardsilogic@0 142 if (column > 0) return QModelIndex();
lbajardsilogic@0 143 if (paneStack == m_stack && row < m_stack->getPaneCount()) {
lbajardsilogic@0 144 std::cerr << "parent is pane stack, returning a pane" << std::endl;
lbajardsilogic@0 145 return createIndex(row, column, m_stack->getPane(row));
lbajardsilogic@0 146 }
lbajardsilogic@0 147 std::cerr << "parent is wrong pane stack, returning nothing" << std::endl;
lbajardsilogic@0 148 return QModelIndex();
lbajardsilogic@0 149 }
lbajardsilogic@0 150
lbajardsilogic@0 151 Pane *pane = dynamic_cast<Pane *>(obj);
lbajardsilogic@0 152 if (pane) {
lbajardsilogic@0 153 std::cerr << "parent is pane" << std::endl;
lbajardsilogic@0 154 if (row < pane->getLayerCount()) {
lbajardsilogic@0 155 Layer *layer = pane->getLayer(row);
lbajardsilogic@0 156 if (column == 0) {
lbajardsilogic@0 157 std::cerr << "parent is pane, returning layer" << std::endl;
lbajardsilogic@0 158 ViewObjectAssoc *assoc = new ViewObjectAssoc
lbajardsilogic@0 159 (const_cast<LayerTreeModel *>(this), pane, layer);
lbajardsilogic@0 160 return createIndex(row, column, assoc);
lbajardsilogic@0 161 } else {
lbajardsilogic@0 162 std::cerr << "parent is pane, column != 0, returning model" << std::endl;
lbajardsilogic@0 163 ViewObjectAssoc *assoc = new ViewObjectAssoc
lbajardsilogic@0 164 (const_cast<LayerTreeModel *>(this), pane, layer->getModel());
lbajardsilogic@0 165 return createIndex(row, column, assoc);
lbajardsilogic@0 166 }
lbajardsilogic@0 167 }
lbajardsilogic@0 168 }
lbajardsilogic@0 169
lbajardsilogic@0 170 std::cerr << "unknown parent, returning nothing" << std::endl;
lbajardsilogic@0 171 return QModelIndex();
lbajardsilogic@0 172 }
lbajardsilogic@0 173
lbajardsilogic@0 174 QModelIndex
lbajardsilogic@0 175 LayerTreeModel::parent(const QModelIndex &index) const
lbajardsilogic@0 176 {
lbajardsilogic@0 177 std::cerr << "LayerTreeModel::parent(" << &index << ")" << std::endl;
lbajardsilogic@0 178
lbajardsilogic@0 179 QObject *obj = static_cast<QObject *>(index.internalPointer());
lbajardsilogic@0 180
lbajardsilogic@0 181 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
lbajardsilogic@0 182 if (paneStack) {
lbajardsilogic@0 183 std::cerr << "node is pane stack, returning no parent" << std::endl;
lbajardsilogic@0 184 return QModelIndex();
lbajardsilogic@0 185 }
lbajardsilogic@0 186
lbajardsilogic@0 187 Pane *pane = dynamic_cast<Pane *>(obj);
lbajardsilogic@0 188 if (pane) {
lbajardsilogic@0 189 std::cerr << "node is pane, returning pane stack as parent" << std::endl;
lbajardsilogic@0 190 return createIndex(0, 0, m_stack);
lbajardsilogic@0 191 }
lbajardsilogic@0 192
lbajardsilogic@0 193 ViewObjectAssoc *assoc = dynamic_cast<ViewObjectAssoc *>(obj);
lbajardsilogic@0 194 if (assoc) {
lbajardsilogic@0 195 View *view = assoc->view;
lbajardsilogic@0 196 Pane *pane = dynamic_cast<Pane *>(view);
lbajardsilogic@0 197 if (pane) {
lbajardsilogic@0 198 // need index of pane in pane stack
lbajardsilogic@0 199 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
lbajardsilogic@0 200 if (pane == m_stack->getPane(i)) {
lbajardsilogic@0 201 std::cerr << "node is assoc, returning pane " << i << " as parent" << std::endl;
lbajardsilogic@0 202 return createIndex(i, 0, pane);
lbajardsilogic@0 203 }
lbajardsilogic@0 204 }
lbajardsilogic@0 205 }
lbajardsilogic@0 206 std::cerr << "node is assoc, but no parent found" << std::endl;
lbajardsilogic@0 207 return QModelIndex();
lbajardsilogic@0 208 }
lbajardsilogic@0 209
lbajardsilogic@0 210 std::cerr << "unknown node" << std::endl;
lbajardsilogic@0 211 return QModelIndex();
lbajardsilogic@0 212 }
lbajardsilogic@0 213
lbajardsilogic@0 214 int
lbajardsilogic@0 215 LayerTreeModel::rowCount(const QModelIndex &parent) const
lbajardsilogic@0 216 {
lbajardsilogic@0 217 std::cerr << "LayerTreeModel::rowCount(" << &parent << ")" << std::endl;
lbajardsilogic@0 218
lbajardsilogic@0 219 if (!parent.isValid()) {
lbajardsilogic@0 220 std::cerr << "parent invalid, returning 1 for the pane stack" << std::endl;
lbajardsilogic@0 221 return 1; // the pane stack
lbajardsilogic@0 222 }
lbajardsilogic@0 223
lbajardsilogic@0 224 QObject *obj = static_cast<QObject *>(parent.internalPointer());
lbajardsilogic@0 225
lbajardsilogic@0 226 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
lbajardsilogic@0 227 if (paneStack) {
lbajardsilogic@0 228 if (paneStack == m_stack) {
lbajardsilogic@0 229 std::cerr << "parent is pane stack, returning "
lbajardsilogic@0 230 << m_stack->getPaneCount() << " panes" << std::endl;
lbajardsilogic@0 231 return m_stack->getPaneCount();
lbajardsilogic@0 232 } else {
lbajardsilogic@0 233 return 0;
lbajardsilogic@0 234 }
lbajardsilogic@0 235 }
lbajardsilogic@0 236
lbajardsilogic@0 237 Pane *pane = dynamic_cast<Pane *>(obj);
lbajardsilogic@0 238 if (pane) {
lbajardsilogic@0 239 std::cerr << "parent is pane, returning "
lbajardsilogic@0 240 << pane->getLayerCount() << " layers" << std::endl;
lbajardsilogic@0 241 return pane->getLayerCount();
lbajardsilogic@0 242 }
lbajardsilogic@0 243
lbajardsilogic@0 244 std::cerr << "parent unknown, returning 0" << std::endl;
lbajardsilogic@0 245 return 0;
lbajardsilogic@0 246 }
lbajardsilogic@0 247
lbajardsilogic@0 248 int
lbajardsilogic@0 249 LayerTreeModel::columnCount(const QModelIndex &parent) const
lbajardsilogic@0 250 {
lbajardsilogic@0 251 if (!parent.isValid()) {
lbajardsilogic@0 252 std::cerr << "LayerTreeModel::columnCount: parent invalid, returning 2" << std::endl;
lbajardsilogic@0 253 return 2;
lbajardsilogic@0 254 }
lbajardsilogic@0 255
lbajardsilogic@0 256 QObject *obj = static_cast<QObject *>(parent.internalPointer());
lbajardsilogic@0 257
lbajardsilogic@0 258 Pane *pane = dynamic_cast<Pane *>(obj);
lbajardsilogic@0 259 if (pane) {
lbajardsilogic@0 260 std::cerr << "LayerTreeModel::columnCount: pane, returning 2" << std::endl;
lbajardsilogic@0 261 return 2; // layer and model
lbajardsilogic@0 262 }
lbajardsilogic@0 263
lbajardsilogic@0 264 std::cerr << "LayerTreeModel::columnCount: returning 1" << std::endl;
lbajardsilogic@0 265
lbajardsilogic@0 266 return 1;
lbajardsilogic@0 267 }
lbajardsilogic@0 268