insilmaril@725: #include insilmaril@725: insilmaril@741: #include insilmaril@741: using namespace std; insilmaril@741: 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@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@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="<getHeadingStd(); insilmaril@776: std::string ph="()"; if (previous) ph=previous->getHeadingStd(); insilmaril@776: cout << " cur="<branchCount() >0 ) insilmaril@741: { insilmaril@776: // cout << " yes, going deeper\n"; insilmaril@741: previous=current; insilmaril@741: current=current->getFirstBranch(); insilmaril@741: return current; insilmaril@741: } insilmaril@741: // turn around and go up again insilmaril@776: // cout << " sorry, turn around\n"; insilmaril@776: BranchItem *bi=current; insilmaril@776: current=previous; insilmaril@776: previous=bi; insilmaril@741: } insilmaril@741: insilmaril@776: /* insilmaril@776: cout << " coming from below\n"; insilmaril@776: ch="()"; if (current) ch=current->getHeadingStd(); insilmaril@776: ph="()"; if (previous) ph=previous->getHeadingStd(); insilmaril@776: cout << " cur="<num()="<num()<getHeadingStd()<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@773: current=next (current,previous,start); insilmaril@741: insilmaril@741: return current; insilmaril@741: } insilmaril@741: insilmaril@727: bool TreeModel::removeRows ( int row, int count, const QModelIndex & parent) insilmaril@727: { insilmaril@727: int last=row+count-1; insilmaril@745: TreeItem *pi= getItem (parent); insilmaril@755: TreeItem *ti; insilmaril@727: insilmaril@788: cout << "TM::removeRows row="<(index.internalPointer()); insilmaril@745: insilmaril@788: // cout << " item="<