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@43
|
16
|
Chris@43
|
17 #include <iostream>
|
Chris@43
|
18
|
Chris@43
|
19
|
Chris@43
|
20 LayerTreeModel::LayerTreeModel(PaneStack *stack, QObject *parent) :
|
Chris@43
|
21 QAbstractItemModel(parent),
|
Chris@43
|
22 m_stack(stack)
|
Chris@43
|
23 {
|
Chris@43
|
24 }
|
Chris@43
|
25
|
Chris@43
|
26 LayerTreeModel::~LayerTreeModel()
|
Chris@43
|
27 {
|
Chris@43
|
28 }
|
Chris@43
|
29
|
Chris@43
|
30 QVariant
|
Chris@43
|
31 LayerTreeModel::data(const QModelIndex &index, int role) const
|
Chris@43
|
32 {
|
Chris@43
|
33 std::cerr << "LayerTreeModel::data(" << &index << ", role " << role << ")" << std::endl;
|
Chris@43
|
34
|
Chris@43
|
35 if (!index.isValid()) return QVariant();
|
Chris@43
|
36 if (role != Qt::DisplayRole) return QVariant();
|
Chris@43
|
37
|
Chris@43
|
38 QObject *obj = static_cast<QObject *>(index.internalPointer());
|
Chris@43
|
39
|
Chris@43
|
40 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
|
Chris@43
|
41 if (paneStack) {
|
Chris@43
|
42 std::cerr << "node is pane stack" << std::endl;
|
Chris@43
|
43 return QVariant("Pane stack");
|
Chris@43
|
44 }
|
Chris@43
|
45
|
Chris@43
|
46 Pane *pane = dynamic_cast<Pane *>(obj);
|
Chris@43
|
47 if (pane) {
|
Chris@43
|
48 // need index of pane in pane stack
|
Chris@43
|
49 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
|
Chris@43
|
50 if (pane == m_stack->getPane(i)) {
|
Chris@43
|
51 std::cerr << "node is pane " << i << std::endl;
|
Chris@43
|
52 return QVariant(QString("Pane %1").arg(i + 1));
|
Chris@43
|
53 }
|
Chris@43
|
54 }
|
Chris@43
|
55 return QVariant();
|
Chris@43
|
56 }
|
Chris@43
|
57
|
Chris@43
|
58 Layer *layer = dynamic_cast<Layer *>(obj);
|
Chris@43
|
59 if (layer) {
|
Chris@43
|
60 std::cerr << "node is layer" << std::endl;
|
Chris@43
|
61 return QVariant(QString("%1").arg(layer->objectName()));
|
Chris@43
|
62 }
|
Chris@43
|
63
|
Chris@43
|
64 return QVariant();
|
Chris@43
|
65 }
|
Chris@43
|
66
|
Chris@43
|
67 /*
|
Chris@43
|
68 Qt::ItemFlags
|
Chris@43
|
69 LayerTreeModel::flags(const QModelIndex &index) const
|
Chris@43
|
70 {
|
Chris@43
|
71 }
|
Chris@43
|
72
|
Chris@43
|
73 QVariant
|
Chris@43
|
74 LayerTreeModel::headerData(const QModelIndex &index,
|
Chris@43
|
75 Qt::Orientation orientation,
|
Chris@43
|
76 int role) const
|
Chris@43
|
77 {
|
Chris@43
|
78 }
|
Chris@43
|
79 */
|
Chris@43
|
80
|
Chris@43
|
81 QModelIndex
|
Chris@43
|
82 LayerTreeModel::index(int row, int column, const QModelIndex &parent) const
|
Chris@43
|
83 {
|
Chris@43
|
84 std::cerr << "LayerTreeModel::index(" << row << ", " << column << ", "
|
Chris@43
|
85 << &parent << ")" << std::endl;
|
Chris@43
|
86
|
Chris@43
|
87 if (!parent.isValid()) {
|
Chris@43
|
88 // this is the pane stack
|
Chris@43
|
89 std::cerr << "parent invalid, returning pane stack as root" << std::endl;
|
Chris@43
|
90 return createIndex(row, column, m_stack);
|
Chris@43
|
91 }
|
Chris@43
|
92
|
Chris@43
|
93 QObject *obj = static_cast<QObject *>(parent.internalPointer());
|
Chris@43
|
94
|
Chris@43
|
95 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
|
Chris@43
|
96 if (paneStack) {
|
Chris@43
|
97 if (paneStack == m_stack && row < m_stack->getPaneCount()) {
|
Chris@43
|
98 std::cerr << "parent is pane stack, returning a pane" << std::endl;
|
Chris@43
|
99 return createIndex(row, column, m_stack->getPane(row));
|
Chris@43
|
100 }
|
Chris@43
|
101 std::cerr << "parent is wrong pane stack, returning nothing" << std::endl;
|
Chris@43
|
102 return QModelIndex();
|
Chris@43
|
103 }
|
Chris@43
|
104
|
Chris@43
|
105 Pane *pane = dynamic_cast<Pane *>(obj);
|
Chris@43
|
106 if (pane) {
|
Chris@43
|
107 if (row < pane->getLayerCount()) {
|
Chris@43
|
108 std::cerr << "parent is pane, returning layer" << std::endl;
|
Chris@43
|
109 return createIndex(row, column, pane->getLayer(row));
|
Chris@43
|
110 }
|
Chris@43
|
111 }
|
Chris@43
|
112
|
Chris@43
|
113 std::cerr << "unknown parent, returning nothing" << std::endl;
|
Chris@43
|
114 return QModelIndex();
|
Chris@43
|
115 }
|
Chris@43
|
116
|
Chris@43
|
117 QModelIndex
|
Chris@43
|
118 LayerTreeModel::parent(const QModelIndex &index) const
|
Chris@43
|
119 {
|
Chris@43
|
120 std::cerr << "LayerTreeModel::parent(" << &index << ")" << std::endl;
|
Chris@43
|
121
|
Chris@43
|
122 QObject *obj = static_cast<QObject *>(index.internalPointer());
|
Chris@43
|
123
|
Chris@43
|
124 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
|
Chris@43
|
125 if (paneStack) {
|
Chris@43
|
126 std::cerr << "node is pane stack, returning no parent" << std::endl;
|
Chris@43
|
127 return QModelIndex();
|
Chris@43
|
128 }
|
Chris@43
|
129
|
Chris@43
|
130 Pane *pane = dynamic_cast<Pane *>(obj);
|
Chris@43
|
131 if (pane) {
|
Chris@43
|
132 std::cerr << "node is pane, returning pane stack as parent" << std::endl;
|
Chris@43
|
133 return createIndex(0, 0, m_stack);
|
Chris@43
|
134 }
|
Chris@43
|
135
|
Chris@43
|
136 Layer *layer = dynamic_cast<Layer *>(obj);
|
Chris@43
|
137 if (layer) {
|
Chris@44
|
138 //!!! const View *view = layer->getView();
|
Chris@44
|
139 const View *view = 0;
|
Chris@43
|
140 Pane *pane = const_cast<Pane *>(dynamic_cast<const Pane *>(view));
|
Chris@43
|
141 if (pane) {
|
Chris@43
|
142 // need index of pane in pane stack
|
Chris@43
|
143 for (int i = 0; i < m_stack->getPaneCount(); ++i) {
|
Chris@43
|
144 if (pane == m_stack->getPane(i)) {
|
Chris@43
|
145 std::cerr << "node is layer, returning pane " << i << " as parent" << std::endl;
|
Chris@43
|
146 return createIndex(i, 0, pane);
|
Chris@43
|
147 }
|
Chris@43
|
148 }
|
Chris@43
|
149 }
|
Chris@43
|
150 std::cerr << "node is layer, but no parent found" << std::endl;
|
Chris@43
|
151 return QModelIndex();
|
Chris@43
|
152 }
|
Chris@43
|
153
|
Chris@43
|
154
|
Chris@43
|
155
|
Chris@43
|
156 std::cerr << "unknown node" << std::endl;
|
Chris@43
|
157 return QModelIndex();
|
Chris@43
|
158 }
|
Chris@43
|
159
|
Chris@43
|
160 int
|
Chris@43
|
161 LayerTreeModel::rowCount(const QModelIndex &parent) const
|
Chris@43
|
162 {
|
Chris@43
|
163 std::cerr << "LayerTreeModel::rowCount(" << &parent << ")" << std::endl;
|
Chris@43
|
164
|
Chris@43
|
165 if (!parent.isValid()) {
|
Chris@43
|
166 std::cerr << "parent invalid, returning 1 for the pane stack" << std::endl;
|
Chris@43
|
167 return 1; // the pane stack
|
Chris@43
|
168 }
|
Chris@43
|
169
|
Chris@43
|
170 QObject *obj = static_cast<QObject *>(parent.internalPointer());
|
Chris@43
|
171
|
Chris@43
|
172 PaneStack *paneStack = dynamic_cast<PaneStack *>(obj);
|
Chris@43
|
173 if (paneStack) {
|
Chris@43
|
174 if (paneStack == m_stack) {
|
Chris@43
|
175 std::cerr << "parent is pane stack, returning "
|
Chris@43
|
176 << m_stack->getPaneCount() << " panes" << std::endl;
|
Chris@43
|
177 return m_stack->getPaneCount();
|
Chris@43
|
178 } else {
|
Chris@43
|
179 return 0;
|
Chris@43
|
180 }
|
Chris@43
|
181 }
|
Chris@43
|
182
|
Chris@43
|
183 Pane *pane = dynamic_cast<Pane *>(obj);
|
Chris@43
|
184 if (pane) {
|
Chris@43
|
185 std::cerr << "parent is pane, returning "
|
Chris@43
|
186 << pane->getLayerCount() << " layers" << std::endl;
|
Chris@43
|
187 return pane->getLayerCount();
|
Chris@43
|
188 }
|
Chris@43
|
189
|
Chris@43
|
190 std::cerr << "parent unknown, returning 0" << std::endl;
|
Chris@43
|
191 return 0;
|
Chris@43
|
192 }
|
Chris@43
|
193
|
Chris@43
|
194 int
|
Chris@43
|
195 LayerTreeModel::columnCount(const QModelIndex &parent) const
|
Chris@43
|
196 {
|
Chris@43
|
197 if (!parent.isValid()) return 1;
|
Chris@43
|
198
|
Chris@43
|
199 QObject *obj = static_cast<QObject *>(parent.internalPointer());
|
Chris@43
|
200
|
Chris@43
|
201 Pane *pane = dynamic_cast<Pane *>(obj);
|
Chris@43
|
202 if (pane) {
|
Chris@43
|
203 return 1; // 2; // layer and model
|
Chris@43
|
204 }
|
Chris@43
|
205
|
Chris@43
|
206 return 1;
|
Chris@43
|
207 }
|
Chris@43
|
208
|