1 #include "tree-model.h"
4 ScoreTreeModel::ScoreTreeModel(QList <Score *> &scoreList, QObject *parent) : QAbstractItemModel(parent)
6 rootItem = new TreeItem();
7 setupModelData(scoreList, rootItem);
10 void ScoreTreeModel::setupModelData(QList<Score *> &scoreList, TreeItem *parent)
12 QListIterator<Score *> iScore(scoreList);
13 QMultiMap<QString, Score *> yearMap;
15 QSet<QString> yearSet;
17 // Create multi map with years as keys, scores as values
18 // Create list of years
19 while (iScore.hasNext()) {
20 Score *score = iScore.next();
21 QString year = score->getDate().split("-").at(0);
22 yearMap.insert(year, score);
26 // Create uniq list of years
27 yearSet = QSet<QString>::fromList(yearList);
28 QList<QString> years = yearMap.keys();
29 QSetIterator<QString> iYear(yearSet);
31 // For each year, add scores as childs
32 while (iYear.hasNext()) {
33 QString year = iYear.next();
35 qDebug() << "---" << year;
37 TreeItem *newItem = new TreeItem(year);
38 parent->appendChild(newItem);
40 QList<Score *> scoresPerYear = yearMap.values(year);
41 QListIterator<Score *> iScoresPerYear(scoresPerYear);
43 // for each year, add score
44 while (iScoresPerYear.hasNext()) {
45 Score *s = iScoresPerYear.next();
46 TreeItem *nextItem = new TreeItem(s);
47 newItem->appendChild(nextItem);
52 int ScoreTreeModel::rowCount(const QModelIndex & parent) const
55 if (parent.column() > 0)
58 if (!parent.isValid())
59 parentItem = rootItem;
61 parentItem = static_cast<TreeItem*>(parent.internalPointer());
63 return parentItem->childCount();
66 int ScoreTreeModel::columnCount(const QModelIndex & parent) const
69 return static_cast<TreeItem*>(parent.internalPointer())->columnCount();
71 return rootItem->columnCount();
74 TreeItem *ScoreTreeModel::itemFromIndex(const QModelIndex &index) const
77 return static_cast<TreeItem*>(index.internalPointer());
82 //Given a model index for a parent item, this function allows views
83 //and delegates to access children of that item
84 QModelIndex ScoreTreeModel::index(int row, int column, const QModelIndex &parent) const
88 if (!hasIndex(row, column, parent))
91 TreeItem *parentItem = itemFromIndex(parent);
92 TreeItem *childItem = parentItem->children.value(row);
95 index = createIndex(row, column, childItem);
97 index = QModelIndex();
99 //qDebug() << "index: " << row << ":" << column << "parent" << parent << "index" << index;
103 QModelIndex ScoreTreeModel::parent(const QModelIndex & index) const
105 if (!index.isValid())
106 return QModelIndex();
108 TreeItem *item = itemFromIndex(index);
110 return QModelIndex();
112 TreeItem *parent = item->parent;
114 return QModelIndex();
116 TreeItem *grandParent = parent->parent;
118 return QModelIndex();
120 int row = grandParent->children.indexOf(parent);
121 return createIndex(row, 0, parent);
124 QVariant ScoreTreeModel::data(const QModelIndex &index, int role) const
126 if (!index.isValid())
129 if (role != Qt::DisplayRole && role < Qt::UserRole)
132 TreeItem *item = itemFromIndex(index);
137 case Qt::DisplayRole:
140 // User defined roles
146 return item->score->getTotal(Total);
151 return item->score->getTotal(TotalOut);
156 return item->score->getTotal(TotalIn);
160 qDebug() << "data: unknow role: " << role;
165 QVariant ScoreTreeModel::headerData(int section, Qt::Orientation orientation, int role) const
168 if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
169 return rootItem->data(section);