insilmaril@725: #include insilmaril@725: insilmaril@741: #include insilmaril@741: using namespace std; insilmaril@741: insilmaril@725: #include "treeitem.h" insilmaril@725: #include "treemodel.h" insilmaril@725: insilmaril@725: TreeModel::TreeModel(QObject *parent) insilmaril@725: : QAbstractItemModel(parent) insilmaril@725: { insilmaril@725: QList rootData; insilmaril@725: rootData << "Heading" << "Type" <<"Note"; insilmaril@725: rootItem = new TreeItem(rootData); insilmaril@725: } insilmaril@725: insilmaril@725: TreeModel::~TreeModel() insilmaril@725: { insilmaril@725: delete rootItem; insilmaril@725: } insilmaril@725: insilmaril@725: QVariant TreeModel::data(const QModelIndex &index, int role) const insilmaril@725: { insilmaril@725: if (!index.isValid()) insilmaril@725: return QVariant(); insilmaril@725: insilmaril@725: if (role != Qt::DisplayRole) insilmaril@725: return QVariant(); insilmaril@725: insilmaril@745: TreeItem *item = getItem (index); insilmaril@725: insilmaril@725: return item->data(index.column()); insilmaril@725: } insilmaril@725: insilmaril@725: Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const insilmaril@725: { insilmaril@725: if (!index.isValid()) insilmaril@725: return Qt::ItemIsEnabled; insilmaril@725: insilmaril@725: return Qt::ItemIsEnabled | Qt::ItemIsSelectable; insilmaril@725: } insilmaril@725: insilmaril@725: QVariant TreeModel::headerData(int section, Qt::Orientation orientation, insilmaril@725: int role) const insilmaril@725: { insilmaril@725: if (orientation == Qt::Horizontal && role == Qt::DisplayRole) insilmaril@725: return rootItem->data(section); insilmaril@725: insilmaril@725: return QVariant(); insilmaril@725: } insilmaril@725: insilmaril@725: QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) insilmaril@725: const insilmaril@725: { insilmaril@725: TreeItem *parentItem; insilmaril@725: insilmaril@725: if (!parent.isValid()) insilmaril@725: parentItem = rootItem; insilmaril@725: else insilmaril@745: parentItem = getItem (parent); insilmaril@725: insilmaril@725: TreeItem *childItem = parentItem->child(row); insilmaril@725: if (childItem) insilmaril@725: return createIndex(row, column, childItem); insilmaril@725: else insilmaril@725: return QModelIndex(); insilmaril@725: } insilmaril@725: insilmaril@725: QModelIndex TreeModel::parent(const QModelIndex &index) const insilmaril@725: { insilmaril@725: if (!index.isValid()) insilmaril@725: return QModelIndex(); insilmaril@725: insilmaril@745: TreeItem *ti= getItem (index); insilmaril@745: TreeItem *parentItem = ti->parent(); insilmaril@725: insilmaril@745: //cout << "TreeModel::parent ti="<getHeading().toStdString()<<" pi="<getHeading().toStdString()<childNumber(), 0, parentItem); insilmaril@725: } insilmaril@725: insilmaril@725: int TreeModel::rowCount(const QModelIndex &parent) const insilmaril@725: { insilmaril@725: TreeItem *parentItem; insilmaril@725: insilmaril@725: if (!parent.isValid()) insilmaril@725: parentItem = rootItem; insilmaril@725: else insilmaril@745: parentItem = getItem (parent); insilmaril@725: insilmaril@725: return parentItem->childCount(); insilmaril@725: } insilmaril@725: insilmaril@741: int TreeModel::columnCount(const QModelIndex &parent) const insilmaril@726: { insilmaril@741: if (parent.isValid()) insilmaril@745: return getItem (parent)->columnCount(); insilmaril@741: else insilmaril@741: return rootItem->columnCount(); insilmaril@726: } insilmaril@726: insilmaril@741: TreeItem* TreeModel::next(TreeItem* ¤t, TreeItem* &previous, int &d0) insilmaril@741: { insilmaril@741: // Walk through map beginning at current with previous==0 insilmaril@741: // Start at root, if current==NULL insilmaril@741: if (!current) current=rootItem; insilmaril@741: insilmaril@741: // Are we just beginning to walk the map? insilmaril@741: if (!previous) insilmaril@741: { insilmaril@741: previous=current; insilmaril@741: d0=current->depth(); insilmaril@741: current=current->getFirstBranch(); insilmaril@741: return current; insilmaril@741: } insilmaril@741: insilmaril@741: //std::cout << " cur="<getHeading().toStdString(); insilmaril@741: //std::cout << " prev="<getHeading().toStdString()<depth() > previous->depth() ) insilmaril@741: { insilmaril@741: // Coming from above insilmaril@741: // Trying to go down deeper insilmaril@741: if (current->branchCount() >0 ) insilmaril@741: { insilmaril@741: previous=current; insilmaril@741: current=current->getFirstBranch(); insilmaril@741: return current; insilmaril@741: } insilmaril@741: // turn around and go up again insilmaril@741: } insilmaril@741: insilmaril@741: // Coming from below, insilmaril@741: // Trying to go down again to siblings insilmaril@741: insilmaril@741: TreeItem *sibling=current->getBranchNum (previous->num()+1); insilmaril@741: insilmaril@741: if (sibling) insilmaril@741: { insilmaril@741: // Found sibling of previous, go there insilmaril@741: previous=current; insilmaril@741: current=sibling; insilmaril@741: return current; insilmaril@741: } insilmaril@741: insilmaril@741: // Go up and try to find siblings of current insilmaril@741: previous=current; insilmaril@741: current=current->parent(); insilmaril@741: insilmaril@741: // Check if we still can go somewhere insilmaril@741: if (!current) return current; insilmaril@741: insilmaril@741: while (current && current->depth() < previous->depth() ) insilmaril@741: next (current,previous,d0); insilmaril@741: insilmaril@741: return current; insilmaril@741: } insilmaril@741: insilmaril@745: bool TreeModel::insertRows ( int row, int count, const QModelIndex & parent) insilmaril@745: { insilmaril@745: std::cout << "TreeModel insertRows()\n"; insilmaril@745: int last=row+count-1; insilmaril@745: beginInsertRows (parent,row,last); insilmaril@745: insilmaril@745: for (int i=row; i<=last; i++) insilmaril@745: { insilmaril@745: std::cout << "TreeModel::insertRows inserting i="<getHeading().toStdString()<