From 9dfba89c28bbff3316cb7aed6c07f90c0f2d5a22 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 26 Sep 2012 18:16:08 +0200 Subject: Add implementations of QAIM::sibling in public APIs. Change-Id: I2248641f2ed8735c28bd9572470520995a4a5b62 Reviewed-by: Marc Mutz Reviewed-by: Stephen Kelly --- src/corelib/itemmodels/qabstractitemmodel.h | 1 + src/corelib/itemmodels/qabstractproxymodel.cpp | 9 +++++++++ src/corelib/itemmodels/qabstractproxymodel.h | 1 + src/corelib/itemmodels/qidentityproxymodel.cpp | 9 +++++++++ src/corelib/itemmodels/qidentityproxymodel.h | 1 + src/corelib/itemmodels/qsortfilterproxymodel.cpp | 16 ++++++++++++++++ src/corelib/itemmodels/qsortfilterproxymodel.h | 1 + src/corelib/itemmodels/qstringlistmodel.cpp | 11 +++++++++++ src/corelib/itemmodels/qstringlistmodel.h | 1 + src/gui/itemmodels/qstandarditemmodel.cpp | 9 +++++++++ src/gui/itemmodels/qstandarditemmodel.h | 1 + .../corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp | 11 +++++++++++ tests/auto/other/modeltest/modeltest.cpp | 11 +++++++++++ 13 files changed, 82 insertions(+) diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h index 00e108099d..9513a245d7 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.h +++ b/src/corelib/itemmodels/qabstractitemmodel.h @@ -420,6 +420,7 @@ public: QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); + protected: QAbstractTableModel(QAbstractItemModelPrivate &dd, QObject *parent); diff --git a/src/corelib/itemmodels/qabstractproxymodel.cpp b/src/corelib/itemmodels/qabstractproxymodel.cpp index 680c995fe6..9b8c11af12 100644 --- a/src/corelib/itemmodels/qabstractproxymodel.cpp +++ b/src/corelib/itemmodels/qabstractproxymodel.cpp @@ -360,6 +360,15 @@ bool QAbstractProxyModel::hasChildren(const QModelIndex &parent) const return d->model->hasChildren(mapToSource(parent)); } +/*! + \reimp + */ +QModelIndex QAbstractProxyModel::sibling(int row, int column, const QModelIndex &idx) const +{ + Q_D(const QAbstractProxyModel); + return d->model->sibling(row, column, mapToSource(idx)); +} + /*! \reimp */ diff --git a/src/corelib/itemmodels/qabstractproxymodel.h b/src/corelib/itemmodels/qabstractproxymodel.h index 1310341ac9..2561e5a7e2 100644 --- a/src/corelib/itemmodels/qabstractproxymodel.h +++ b/src/corelib/itemmodels/qabstractproxymodel.h @@ -90,6 +90,7 @@ public: void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); QSize span(const QModelIndex &index) const; bool hasChildren(const QModelIndex &parent = QModelIndex()) const; + QModelIndex sibling(int row, int column, const QModelIndex &idx) const; QMimeData* mimeData(const QModelIndexList &indexes) const; QStringList mimeTypes() const; diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp index 37ec1cd0a9..75a1c0d4e0 100644 --- a/src/corelib/itemmodels/qidentityproxymodel.cpp +++ b/src/corelib/itemmodels/qidentityproxymodel.cpp @@ -168,6 +168,15 @@ QModelIndex QIdentityProxyModel::index(int row, int column, const QModelIndex& p return mapFromSource(sourceIndex); } +/*! + \reimp + */ +QModelIndex QIdentityProxyModel::sibling(int row, int column, const QModelIndex &idx) const +{ + Q_D(const QIdentityProxyModel); + return d->model->sibling(row, column, mapToSource(idx)); +} + /*! \reimp */ diff --git a/src/corelib/itemmodels/qidentityproxymodel.h b/src/corelib/itemmodels/qidentityproxymodel.h index b402c175d2..da40836dd0 100644 --- a/src/corelib/itemmodels/qidentityproxymodel.h +++ b/src/corelib/itemmodels/qidentityproxymodel.h @@ -69,6 +69,7 @@ public: int rowCount(const QModelIndex& parent = QModelIndex()) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); + QModelIndex sibling(int row, int column, const QModelIndex &idx) const; QItemSelection mapSelectionFromSource(const QItemSelection& selection) const; QItemSelection mapSelectionToSource(const QItemSelection& selection) const; diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp index 8551db0c28..80961e8eb3 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp +++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp @@ -1868,6 +1868,22 @@ QModelIndex QSortFilterProxyModel::parent(const QModelIndex &child) const return proxy_parent; } +/*! + \reimp +*/ +QModelIndex QSortFilterProxyModel::sibling(int row, int column, const QModelIndex &idx) const +{ + Q_D(const QSortFilterProxyModel); + if (!d->indexValid(idx)) + return QModelIndex(); + + const IndexMap::const_iterator it = d->index_to_iterator(idx); + if (it.value()->source_rows.count() <= row || it.value()->source_columns.count() <= column) + return QModelIndex(); + + return d->create_index(row, column, it); +} + /*! \reimp */ diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.h b/src/corelib/itemmodels/qsortfilterproxymodel.h index 905c401886..18b7078375 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.h +++ b/src/corelib/itemmodels/qsortfilterproxymodel.h @@ -135,6 +135,7 @@ public: QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &child) const; + QModelIndex sibling(int row, int column, const QModelIndex &idx) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; diff --git a/src/corelib/itemmodels/qstringlistmodel.cpp b/src/corelib/itemmodels/qstringlistmodel.cpp index 2bea97d4b4..49345f155a 100644 --- a/src/corelib/itemmodels/qstringlistmodel.cpp +++ b/src/corelib/itemmodels/qstringlistmodel.cpp @@ -126,6 +126,17 @@ int QStringListModel::rowCount(const QModelIndex &parent) const return lst.count(); } +/*! + \reimp +*/ +QModelIndex QStringListModel::sibling(int row, int column, const QModelIndex &idx) const +{ + if (!idx.isValid() || column != 0 || row >= lst.count()) + return QModelIndex(); + + return createIndex(row, 0); +} + /*! Returns data for the specified \a role, from the item with the given \a index. diff --git a/src/corelib/itemmodels/qstringlistmodel.h b/src/corelib/itemmodels/qstringlistmodel.h index 85d90e7a01..4da435c453 100644 --- a/src/corelib/itemmodels/qstringlistmodel.h +++ b/src/corelib/itemmodels/qstringlistmodel.h @@ -60,6 +60,7 @@ public: explicit QStringListModel(const QStringList &strings, QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; + QModelIndex sibling(int row, int column, const QModelIndex &idx) const; QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); diff --git a/src/gui/itemmodels/qstandarditemmodel.cpp b/src/gui/itemmodels/qstandarditemmodel.cpp index fdd00fe980..13d7a5c7a7 100644 --- a/src/gui/itemmodels/qstandarditemmodel.cpp +++ b/src/gui/itemmodels/qstandarditemmodel.cpp @@ -2709,6 +2709,15 @@ bool QStandardItemModel::hasChildren(const QModelIndex &parent) const return item ? item->hasChildren() : false; } +/*! + \reimp +*/ +QModelIndex QStandardItemModel::sibling(int row, int column, const QModelIndex &idx) const +{ + Q_D(const QStandardItemModel); + return createIndex(row, column, idx.internalPointer()); +} + /*! \reimp */ diff --git a/src/gui/itemmodels/qstandarditemmodel.h b/src/gui/itemmodels/qstandarditemmodel.h index c21e8cef5d..e243085f4c 100644 --- a/src/gui/itemmodels/qstandarditemmodel.h +++ b/src/gui/itemmodels/qstandarditemmodel.h @@ -332,6 +332,7 @@ public: int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; bool hasChildren(const QModelIndex &parent = QModelIndex()) const; + QModelIndex sibling(int row, int column, const QModelIndex &idx) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); diff --git a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp index 72a5c4a57b..633812f935 100644 --- a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp +++ b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp @@ -392,6 +392,8 @@ void checkChildren(QAbstractItemModel *currentModel, const QModelIndex &parent, int rows = currentModel->rowCount(parent); int columns = currentModel->columnCount(parent); + const QModelIndex topLeftChild = currentModel->index( 0, 0, parent ); + QCOMPARE(rows > 0, (currentModel->hasChildren(parent))); // Some reasuring testing against rows(),columns(), and hasChildren() @@ -423,6 +425,15 @@ void checkChildren(QAbstractItemModel *currentModel, const QModelIndex &parent, QModelIndex b = currentModel->index(r, c, parent); QVERIFY(a == b); + { + const QModelIndex sibling = currentModel->sibling( r, c, topLeftChild ); + QVERIFY( index == sibling ); + } + { + const QModelIndex sibling = topLeftChild.sibling( r, c ); + QVERIFY( index == sibling ); + } + // Some basic checking on the index that is returned QVERIFY(index.model() == currentModel); QCOMPARE(index.row(), r); diff --git a/tests/auto/other/modeltest/modeltest.cpp b/tests/auto/other/modeltest/modeltest.cpp index f8338dc6fa..17f164b638 100644 --- a/tests/auto/other/modeltest/modeltest.cpp +++ b/tests/auto/other/modeltest/modeltest.cpp @@ -339,6 +339,8 @@ void ModelTest::checkChildren ( const QModelIndex &parent, int currentDepth ) //qDebug() << "parent:" << model->data(parent).toString() << "rows:" << rows // << "columns:" << columns << "parent column:" << parent.column(); + const QModelIndex topLeftChild = model->index( 0, 0, parent ); + QVERIFY( !model->hasIndex ( rows + 1, 0, parent ) ); for ( int r = 0; r < rows; ++r ) { if ( model->canFetchMore ( parent ) ) { @@ -362,6 +364,15 @@ void ModelTest::checkChildren ( const QModelIndex &parent, int currentDepth ) QModelIndex b = model->index ( r, c, parent ); QVERIFY( a == b ); + { + const QModelIndex sibling = model->sibling( r, c, topLeftChild ); + QVERIFY( index == sibling ); + } + { + const QModelIndex sibling = topLeftChild.sibling( r, c ); + QVERIFY( index == sibling ); + } + // Some basic checking on the index that is returned QVERIFY( index.model() == model ); QCOMPARE( index.row(), r ); -- cgit v1.2.3