insilmaril@725: #include insilmaril@725: insilmaril@725: #include "treeitem.h" insilmaril@725: #include "treemodel.h" insilmaril@725: insilmaril@726: TreeItem* TreeModel::itFirst=NULL; insilmaril@726: TreeItem* TreeModel::itCur=NULL; insilmaril@726: 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: int TreeModel::columnCount(const QModelIndex &parent) const insilmaril@725: { insilmaril@725: if (parent.isValid()) insilmaril@725: return static_cast(parent.internalPointer())->columnCount(); insilmaril@725: else insilmaril@725: return rootItem->columnCount(); 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@725: TreeItem *item = static_cast(index.internalPointer()); 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@725: parentItem = static_cast(parent.internalPointer()); 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@725: TreeItem *childItem = static_cast(index.internalPointer()); insilmaril@725: TreeItem *parentItem = childItem->parent(); insilmaril@725: insilmaril@725: if (parentItem == rootItem) insilmaril@725: return QModelIndex(); insilmaril@725: insilmaril@725: return createIndex(parentItem->row(), 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@725: parentItem = static_cast(parent.internalPointer()); insilmaril@725: insilmaril@725: return parentItem->childCount(); insilmaril@725: } insilmaril@725: insilmaril@726: TreeItem* TreeModel::first() insilmaril@726: { insilmaril@726: itCur=NULL; insilmaril@726: itFirst=rootItem; insilmaril@726: return rootItem; insilmaril@726: } insilmaril@726: insilmaril@726: TreeItem* TreeModel::next() insilmaril@726: { insilmaril@726: /* insilmaril@726: BranchObj *bo; insilmaril@726: BranchObj *lmo; insilmaril@726: BranchObj *po=(BranchObj*)parObj; insilmaril@726: insilmaril@726: if (branch.isEmpty()) insilmaril@726: bo=NULL; insilmaril@726: else insilmaril@726: bo=branch.first(); insilmaril@726: insilmaril@726: if (!itCur) insilmaril@726: { insilmaril@726: // no itCur, we are just beginning insilmaril@726: if (bo) insilmaril@726: { insilmaril@726: // we have children, return first one insilmaril@726: itCur=this; insilmaril@726: return bo; insilmaril@726: } insilmaril@726: else insilmaril@726: { insilmaril@726: // No children, so there is no next insilmaril@726: itCur=this; insilmaril@726: return NULL; insilmaril@726: } insilmaril@726: } insilmaril@726: insilmaril@726: // We have an itCur insilmaril@726: if (itCur==po) insilmaril@726: { // We come from parent insilmaril@726: if (bo) insilmaril@726: { insilmaril@726: // there are children, go there insilmaril@726: itCur=this; insilmaril@726: return bo; insilmaril@726: } insilmaril@726: else insilmaril@726: { // no children, try to go up again insilmaril@726: if (po) insilmaril@726: { insilmaril@726: // go back to parent and try to find next there insilmaril@726: itCur=this; insilmaril@726: lmo=po->next(); insilmaril@726: itCur=this; insilmaril@726: return lmo; insilmaril@726: insilmaril@726: } insilmaril@726: else insilmaril@726: { insilmaril@726: // can't go up, I am mapCenter, no next insilmaril@726: itCur=NULL; insilmaril@726: return NULL; insilmaril@726: } insilmaril@726: } insilmaril@726: } insilmaril@726: insilmaril@726: // We don't come from parent, but from brother or children insilmaril@726: insilmaril@726: // Try to find last child, where we came from, in my own children insilmaril@726: bool searching=true; insilmaril@726: int i=0; insilmaril@726: while (inext(); insilmaril@726: itCur=this; insilmaril@726: return lmo; insilmaril@726: } insilmaril@726: else insilmaril@726: { insilmaril@726: // can't go up, I am mapCenter insilmaril@726: itCur=NULL; insilmaril@726: return NULL; insilmaril@726: } insilmaril@726: } insilmaril@726: } insilmaril@726: insilmaril@726: // couldn't find last child, it must be a nephew of mine insilmaril@726: if (branch.size()>0) insilmaril@726: { insilmaril@726: // proceed with my first child insilmaril@726: itCur=this; insilmaril@726: return branch.first(); insilmaril@726: } insilmaril@726: else insilmaril@726: { insilmaril@726: // or go back to my parents insilmaril@726: if (po) insilmaril@726: { insilmaril@726: // go up insilmaril@726: itCur=this; insilmaril@726: lmo=po->next(); insilmaril@726: itCur=this; insilmaril@726: return lmo; insilmaril@726: } insilmaril@726: else insilmaril@726: { insilmaril@726: // can't go up, I am mapCenter insilmaril@726: itCur=NULL; insilmaril@726: return NULL; insilmaril@726: } insilmaril@726: } insilmaril@726: */ insilmaril@726: } insilmaril@726: insilmaril@727: #include insilmaril@727: bool TreeModel::removeRows ( int row, int count, const QModelIndex & parent) insilmaril@727: { insilmaril@727: int last=row+count-1; insilmaril@727: beginRemoveRows (parent,row,last); insilmaril@727: insilmaril@727: TreeItem *pi= static_cast(parent.internalPointer()); insilmaril@727: TreeItem *ti; insilmaril@727: for (int i=row; i<=last; i++) insilmaril@727: { insilmaril@727: std::cout << "TreeModel::removeRows removing i="<removeChild (row); insilmaril@727: } insilmaril@727: insilmaril@727: endRemoveRows (); insilmaril@727: insilmaril@727: } insilmaril@727: insilmaril@726: QModelIndex TreeModel::index (TreeItem* ti) insilmaril@726: { insilmaril@726: return createIndex (ti->row(),ti->column(),ti); insilmaril@726: } insilmaril@726: