lbajardsilogic@0: lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #include "LayerTree.h" lbajardsilogic@0: #include "view/PaneStack.h" lbajardsilogic@0: lbajardsilogic@0: #include "view/Pane.h" lbajardsilogic@0: #include "layer/Layer.h" lbajardsilogic@0: #include "data/model/Model.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: class ViewObjectAssoc : public QObject lbajardsilogic@0: { lbajardsilogic@0: public: lbajardsilogic@0: ViewObjectAssoc(QObject *parent, View *v, QObject *o) : lbajardsilogic@0: QObject(parent), view(v), object(o) { lbajardsilogic@0: ++extantCount; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: virtual ~ViewObjectAssoc() { lbajardsilogic@0: std::cerr << "~ViewObjectAssoc (now " << --extantCount << " extant)" lbajardsilogic@0: << std::endl; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: View *view; lbajardsilogic@0: QObject *object; lbajardsilogic@0: lbajardsilogic@0: static int extantCount; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: int ViewObjectAssoc::extantCount = 0; lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) : lbajardsilogic@0: QAbstractItemModel(parent), lbajardsilogic@0: m_stack(stack) lbajardsilogic@0: { lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: LayerTreeModel::~LayerTreeModel() lbajardsilogic@0: { lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QVariant lbajardsilogic@0: LayerTreeModel::data(const QModelIndex &index, int role) const lbajardsilogic@0: { lbajardsilogic@0: if (!index.isValid()) return QVariant(); lbajardsilogic@0: if (role != Qt::DisplayRole) return QVariant(); lbajardsilogic@0: lbajardsilogic@0: std::cerr << "LayerTreeModel::data(" << &index << ", role " << role << ")" << std::endl; lbajardsilogic@0: lbajardsilogic@0: QObject *obj = static_cast(index.internalPointer()); lbajardsilogic@0: lbajardsilogic@0: PaneStack *paneStack = dynamic_cast(obj); lbajardsilogic@0: if (paneStack) { lbajardsilogic@0: std::cerr << "node is pane stack" << std::endl; lbajardsilogic@0: return QVariant("Pane stack"); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Pane *pane = dynamic_cast(obj); lbajardsilogic@0: if (pane) { lbajardsilogic@0: // need index of pane in pane stack lbajardsilogic@0: for (int i = 0; i < m_stack->getPaneCount(); ++i) { lbajardsilogic@0: if (pane == m_stack->getPane(i)) { lbajardsilogic@0: std::cerr << "node is pane " << i << std::endl; lbajardsilogic@0: return QVariant(QString("Pane %1").arg(i + 1)); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: return QVariant(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: ViewObjectAssoc *assoc = dynamic_cast(obj); lbajardsilogic@0: if (assoc) { lbajardsilogic@0: std::cerr << "node is assoc" << std::endl; lbajardsilogic@0: Layer *layer = dynamic_cast(assoc->object); lbajardsilogic@0: if (layer) { lbajardsilogic@0: std::cerr << "with layer" << std::endl; lbajardsilogic@0: return QVariant(layer->objectName()); lbajardsilogic@0: } lbajardsilogic@0: Model *model = dynamic_cast(assoc->object); lbajardsilogic@0: if (model) { lbajardsilogic@0: std::cerr << "with model" << std::endl; lbajardsilogic@0: return QVariant(model->objectName()); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return QVariant(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Qt::ItemFlags lbajardsilogic@0: LayerTreeModel::flags(const QModelIndex &index) const lbajardsilogic@0: { lbajardsilogic@0: if (!index.isValid()) return Qt::ItemIsEnabled; lbajardsilogic@0: return Qt::ItemIsEnabled | Qt::ItemIsSelectable; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QVariant lbajardsilogic@0: LayerTreeModel::headerData(int section, lbajardsilogic@0: Qt::Orientation orientation, lbajardsilogic@0: int role) const lbajardsilogic@0: { lbajardsilogic@0: if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { lbajardsilogic@0: if (section == 0) return QVariant(tr("Layer")); lbajardsilogic@0: else if (section == 1) return QVariant(tr("Model")); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return QVariant(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QModelIndex lbajardsilogic@0: LayerTreeModel::index(int row, int column, const QModelIndex &parent) const lbajardsilogic@0: { lbajardsilogic@0: std::cerr << "LayerTreeModel::index(" << row << ", " << column << ", " lbajardsilogic@0: << &parent << ")" << std::endl; lbajardsilogic@0: lbajardsilogic@0: if (!parent.isValid()) { lbajardsilogic@0: // this is the pane stack lbajardsilogic@0: std::cerr << "parent invalid, returning pane stack as root" << std::endl; lbajardsilogic@0: if (column > 0) return QModelIndex(); lbajardsilogic@0: return createIndex(row, column, m_stack); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QObject *obj = static_cast(parent.internalPointer()); lbajardsilogic@0: lbajardsilogic@0: PaneStack *paneStack = dynamic_cast(obj); lbajardsilogic@0: if (paneStack) { lbajardsilogic@0: if (column > 0) return QModelIndex(); lbajardsilogic@0: if (paneStack == m_stack && row < m_stack->getPaneCount()) { lbajardsilogic@0: std::cerr << "parent is pane stack, returning a pane" << std::endl; lbajardsilogic@0: return createIndex(row, column, m_stack->getPane(row)); lbajardsilogic@0: } lbajardsilogic@0: std::cerr << "parent is wrong pane stack, returning nothing" << std::endl; lbajardsilogic@0: return QModelIndex(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Pane *pane = dynamic_cast(obj); lbajardsilogic@0: if (pane) { lbajardsilogic@0: std::cerr << "parent is pane" << std::endl; lbajardsilogic@0: if (row < pane->getLayerCount()) { lbajardsilogic@0: Layer *layer = pane->getLayer(row); lbajardsilogic@0: if (column == 0) { lbajardsilogic@0: std::cerr << "parent is pane, returning layer" << std::endl; lbajardsilogic@0: ViewObjectAssoc *assoc = new ViewObjectAssoc lbajardsilogic@0: (const_cast(this), pane, layer); lbajardsilogic@0: return createIndex(row, column, assoc); lbajardsilogic@0: } else { lbajardsilogic@0: std::cerr << "parent is pane, column != 0, returning model" << std::endl; lbajardsilogic@0: ViewObjectAssoc *assoc = new ViewObjectAssoc lbajardsilogic@0: (const_cast(this), pane, layer->getModel()); lbajardsilogic@0: return createIndex(row, column, assoc); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::cerr << "unknown parent, returning nothing" << std::endl; lbajardsilogic@0: return QModelIndex(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QModelIndex lbajardsilogic@0: LayerTreeModel::parent(const QModelIndex &index) const lbajardsilogic@0: { lbajardsilogic@0: std::cerr << "LayerTreeModel::parent(" << &index << ")" << std::endl; lbajardsilogic@0: lbajardsilogic@0: QObject *obj = static_cast(index.internalPointer()); lbajardsilogic@0: lbajardsilogic@0: PaneStack *paneStack = dynamic_cast(obj); lbajardsilogic@0: if (paneStack) { lbajardsilogic@0: std::cerr << "node is pane stack, returning no parent" << std::endl; lbajardsilogic@0: return QModelIndex(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Pane *pane = dynamic_cast(obj); lbajardsilogic@0: if (pane) { lbajardsilogic@0: std::cerr << "node is pane, returning pane stack as parent" << std::endl; lbajardsilogic@0: return createIndex(0, 0, m_stack); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: ViewObjectAssoc *assoc = dynamic_cast(obj); lbajardsilogic@0: if (assoc) { lbajardsilogic@0: View *view = assoc->view; lbajardsilogic@0: Pane *pane = dynamic_cast(view); lbajardsilogic@0: if (pane) { lbajardsilogic@0: // need index of pane in pane stack lbajardsilogic@0: for (int i = 0; i < m_stack->getPaneCount(); ++i) { lbajardsilogic@0: if (pane == m_stack->getPane(i)) { lbajardsilogic@0: std::cerr << "node is assoc, returning pane " << i << " as parent" << std::endl; lbajardsilogic@0: return createIndex(i, 0, pane); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: std::cerr << "node is assoc, but no parent found" << std::endl; lbajardsilogic@0: return QModelIndex(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::cerr << "unknown node" << std::endl; lbajardsilogic@0: return QModelIndex(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: LayerTreeModel::rowCount(const QModelIndex &parent) const lbajardsilogic@0: { lbajardsilogic@0: std::cerr << "LayerTreeModel::rowCount(" << &parent << ")" << std::endl; lbajardsilogic@0: lbajardsilogic@0: if (!parent.isValid()) { lbajardsilogic@0: std::cerr << "parent invalid, returning 1 for the pane stack" << std::endl; lbajardsilogic@0: return 1; // the pane stack lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QObject *obj = static_cast(parent.internalPointer()); lbajardsilogic@0: lbajardsilogic@0: PaneStack *paneStack = dynamic_cast(obj); lbajardsilogic@0: if (paneStack) { lbajardsilogic@0: if (paneStack == m_stack) { lbajardsilogic@0: std::cerr << "parent is pane stack, returning " lbajardsilogic@0: << m_stack->getPaneCount() << " panes" << std::endl; lbajardsilogic@0: return m_stack->getPaneCount(); lbajardsilogic@0: } else { lbajardsilogic@0: return 0; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Pane *pane = dynamic_cast(obj); lbajardsilogic@0: if (pane) { lbajardsilogic@0: std::cerr << "parent is pane, returning " lbajardsilogic@0: << pane->getLayerCount() << " layers" << std::endl; lbajardsilogic@0: return pane->getLayerCount(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::cerr << "parent unknown, returning 0" << std::endl; lbajardsilogic@0: return 0; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: LayerTreeModel::columnCount(const QModelIndex &parent) const lbajardsilogic@0: { lbajardsilogic@0: if (!parent.isValid()) { lbajardsilogic@0: std::cerr << "LayerTreeModel::columnCount: parent invalid, returning 2" << std::endl; lbajardsilogic@0: return 2; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QObject *obj = static_cast(parent.internalPointer()); lbajardsilogic@0: lbajardsilogic@0: Pane *pane = dynamic_cast(obj); lbajardsilogic@0: if (pane) { lbajardsilogic@0: std::cerr << "LayerTreeModel::columnCount: pane, returning 2" << std::endl; lbajardsilogic@0: return 2; // layer and model lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::cerr << "LayerTreeModel::columnCount: returning 1" << std::endl; lbajardsilogic@0: lbajardsilogic@0: return 1; lbajardsilogic@0: } lbajardsilogic@0: