insilmaril@725: #include insilmaril@725: insilmaril@788: #include "attributeitem.h" insilmaril@750: #include "branchitem.h" insilmaril@788: #include "imageitem.h" insilmaril@725: #include "treeitem.h" insilmaril@725: #include "treemodel.h" insilmaril@790: #include "xlinkitem.h" insilmaril@725: insilmaril@725: TreeModel::TreeModel(QObject *parent) insilmaril@725: : QAbstractItemModel(parent) insilmaril@725: { insilmaril@725: QList rootData; insilmaril@790: rootData << "Heading" << "Type"; insilmaril@791: rootItem = new BranchItem(rootData); insilmaril@725: } insilmaril@725: insilmaril@725: TreeModel::~TreeModel() insilmaril@725: { insilmaril@847: //qDebug()<<"Destr TreeModel this="<getHeadingColor(); insilmaril@848: return QVariant(); insilmaril@848: } insilmaril@725: 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@791: return Qt::NoItemFlags; 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@788: QModelIndex TreeModel::index (TreeItem* ti) insilmaril@788: { insilmaril@788: if (!ti->parent()) insilmaril@788: return QModelIndex(); insilmaril@788: else insilmaril@791: return createIndex (ti->row(),0,ti); insilmaril@788: } insilmaril@788: insilmaril@725: QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) insilmaril@725: const insilmaril@725: { insilmaril@791: // Make sure to return invalid index for invalid values (see modeltest) insilmaril@791: if (row<0 || column<0) return QModelIndex(); insilmaril@791: if (column!=0) return QModelIndex(); insilmaril@791: insilmaril@725: TreeItem *parentItem; insilmaril@725: insilmaril@725: if (!parent.isValid()) insilmaril@791: { insilmaril@725: parentItem = rootItem; insilmaril@788: /* insilmaril@788: cout << "TM::index() no parent?! xxx\n"; insilmaril@788: cout << " row="<getHeadingStd()<parent(); insilmaril@788: //cout << " pi="<getHeading().toStdString()<<" pi="<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@791: int c; insilmaril@741: if (parent.isValid()) insilmaril@791: { insilmaril@791: c= getItem (parent)->columnCount(); insilmaril@791: //cout << "TM::colCount c="<getFirstBranch(); insilmaril@741: return current; insilmaril@741: } insilmaril@804: if (deepLevelsFirst) insilmaril@804: { insilmaril@804: // Going up or down (deeper)? insilmaril@804: if (current->depth() > previous->depth() ) insilmaril@804: { insilmaril@804: // Coming from above insilmaril@804: // Trying to go down deeper insilmaril@804: if (current->branchCount() >0 ) insilmaril@804: { insilmaril@804: previous=current; insilmaril@804: current=current->getFirstBranch(); insilmaril@804: return current; insilmaril@804: } insilmaril@804: // turn around and go up again insilmaril@804: BranchItem *bi=current; insilmaril@804: current=previous; insilmaril@804: previous=bi; insilmaril@804: } insilmaril@741: insilmaril@804: // Coming from below insilmaril@804: // Trying to go down again to siblings insilmaril@804: insilmaril@804: BranchItem *sibling=current->getBranchNum (previous->num()+1); insilmaril@804: insilmaril@804: if (sibling) insilmaril@804: { insilmaril@804: // Found sibling of previous, go there insilmaril@741: previous=current; insilmaril@804: current=sibling; insilmaril@741: return current; insilmaril@804: } insilmaril@741: insilmaril@804: // If we only needed to go through subtree, we are done now insilmaril@804: if (start==current) return NULL; insilmaril@741: insilmaril@804: // Go up and try to find siblings of current insilmaril@804: previous=current; insilmaril@804: current=(BranchItem*)current->parent(); insilmaril@741: insilmaril@804: // Check if we still can go somewhere insilmaril@804: if (!current) return current; insilmaril@804: insilmaril@804: while (current && current->depth() < previous->depth() ) insilmaril@804: current=nextBranch (current,previous,true,start); insilmaril@804: insilmaril@741: return current; insilmaril@741: insilmaril@804: } else insilmaril@804: { insilmaril@804: /*FIXME-3 insilmaril@804: cout << "TM::nextBranch shallow\n"; insilmaril@804: std::string ch="()"; if (current) ch=current->getHeadingStd(); insilmaril@804: std::string ph="()"; if (previous) ph=previous->getHeadingStd(); insilmaril@804: cout << " cur="<