Mercurial > hg > svgui
diff widgets/LayerTree.cpp @ 43:78515b1e29eb
* Rejig project file a bit to do pkg-config detection &c
and change some HAVE_* symbol names accordingly
* Add selection move/resize/delete
* First stubs for add layer / pane commands
author | Chris Cannam |
---|---|
date | Wed, 01 Mar 2006 18:13:01 +0000 |
parents | |
children | ad214997dddb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgets/LayerTree.cpp Wed Mar 01 18:13:01 2006 +0000 @@ -0,0 +1,207 @@ + +/* -*- c-basic-offset: 4 -*- vi:set ts=8 sts=4 sw=4: */ + +/* + A waveform viewer and audio annotation editor. + Chris Cannam, Queen Mary University of London, 2005-2006 + + This is experimental software. Not for distribution. +*/ + +#include "LayerTree.h" +#include "PaneStack.h" + +#include "widgets/Pane.h" +#include "base/Layer.h" + +#include <iostream> + + +LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) : + QAbstractItemModel(parent), + m_stack(stack) +{ +} + +LayerTreeModel::~LayerTreeModel() +{ +} + +QVariant +LayerTreeModel::data(const QModelIndex &index, int role) const +{ + std::cerr << "LayerTreeModel::data(" << &index << ", role " << role << ")" << std::endl; + + if (!index.isValid()) return QVariant(); + if (role != Qt::DisplayRole) return QVariant(); + + QObject *obj = static_cast<QObject *>(index.internalPointer()); + + PaneStack *paneStack = dynamic_cast<PaneStack *>(obj); + if (paneStack) { + std::cerr << "node is pane stack" << std::endl; + return QVariant("Pane stack"); + } + + Pane *pane = dynamic_cast<Pane *>(obj); + if (pane) { + // need index of pane in pane stack + for (int i = 0; i < m_stack->getPaneCount(); ++i) { + if (pane == m_stack->getPane(i)) { + std::cerr << "node is pane " << i << std::endl; + return QVariant(QString("Pane %1").arg(i + 1)); + } + } + return QVariant(); + } + + Layer *layer = dynamic_cast<Layer *>(obj); + if (layer) { + std::cerr << "node is layer" << std::endl; + return QVariant(QString("%1").arg(layer->objectName())); + } + + return QVariant(); +} + +/* +Qt::ItemFlags +LayerTreeModel::flags(const QModelIndex &index) const +{ +} + +QVariant +LayerTreeModel::headerData(const QModelIndex &index, + Qt::Orientation orientation, + int role) const +{ +} +*/ + +QModelIndex +LayerTreeModel::index(int row, int column, const QModelIndex &parent) const +{ + std::cerr << "LayerTreeModel::index(" << row << ", " << column << ", " + << &parent << ")" << std::endl; + + if (!parent.isValid()) { + // this is the pane stack + std::cerr << "parent invalid, returning pane stack as root" << std::endl; + return createIndex(row, column, m_stack); + } + + QObject *obj = static_cast<QObject *>(parent.internalPointer()); + + PaneStack *paneStack = dynamic_cast<PaneStack *>(obj); + if (paneStack) { + if (paneStack == m_stack && row < m_stack->getPaneCount()) { + std::cerr << "parent is pane stack, returning a pane" << std::endl; + return createIndex(row, column, m_stack->getPane(row)); + } + std::cerr << "parent is wrong pane stack, returning nothing" << std::endl; + return QModelIndex(); + } + + Pane *pane = dynamic_cast<Pane *>(obj); + if (pane) { + if (row < pane->getLayerCount()) { + std::cerr << "parent is pane, returning layer" << std::endl; + return createIndex(row, column, pane->getLayer(row)); + } + } + + std::cerr << "unknown parent, returning nothing" << std::endl; + return QModelIndex(); +} + +QModelIndex +LayerTreeModel::parent(const QModelIndex &index) const +{ + std::cerr << "LayerTreeModel::parent(" << &index << ")" << std::endl; + + QObject *obj = static_cast<QObject *>(index.internalPointer()); + + PaneStack *paneStack = dynamic_cast<PaneStack *>(obj); + if (paneStack) { + std::cerr << "node is pane stack, returning no parent" << std::endl; + return QModelIndex(); + } + + Pane *pane = dynamic_cast<Pane *>(obj); + if (pane) { + std::cerr << "node is pane, returning pane stack as parent" << std::endl; + return createIndex(0, 0, m_stack); + } + + Layer *layer = dynamic_cast<Layer *>(obj); + if (layer) { + const View *view = layer->getView(); + Pane *pane = const_cast<Pane *>(dynamic_cast<const Pane *>(view)); + if (pane) { + // need index of pane in pane stack + for (int i = 0; i < m_stack->getPaneCount(); ++i) { + if (pane == m_stack->getPane(i)) { + std::cerr << "node is layer, returning pane " << i << " as parent" << std::endl; + return createIndex(i, 0, pane); + } + } + } + std::cerr << "node is layer, but no parent found" << std::endl; + return QModelIndex(); + } + + + + std::cerr << "unknown node" << std::endl; + return QModelIndex(); +} + +int +LayerTreeModel::rowCount(const QModelIndex &parent) const +{ + std::cerr << "LayerTreeModel::rowCount(" << &parent << ")" << std::endl; + + if (!parent.isValid()) { + std::cerr << "parent invalid, returning 1 for the pane stack" << std::endl; + return 1; // the pane stack + } + + QObject *obj = static_cast<QObject *>(parent.internalPointer()); + + PaneStack *paneStack = dynamic_cast<PaneStack *>(obj); + if (paneStack) { + if (paneStack == m_stack) { + std::cerr << "parent is pane stack, returning " + << m_stack->getPaneCount() << " panes" << std::endl; + return m_stack->getPaneCount(); + } else { + return 0; + } + } + + Pane *pane = dynamic_cast<Pane *>(obj); + if (pane) { + std::cerr << "parent is pane, returning " + << pane->getLayerCount() << " layers" << std::endl; + return pane->getLayerCount(); + } + + std::cerr << "parent unknown, returning 0" << std::endl; + return 0; +} + +int +LayerTreeModel::columnCount(const QModelIndex &parent) const +{ + if (!parent.isValid()) return 1; + + QObject *obj = static_cast<QObject *>(parent.internalPointer()); + + Pane *pane = dynamic_cast<Pane *>(obj); + if (pane) { + return 1; // 2; // layer and model + } + + return 1; +} +