summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.h1
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel.cpp9
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel.h1
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.cpp9
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.h1
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.cpp16
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.h1
-rw-r--r--src/corelib/itemmodels/qstringlistmodel.cpp11
-rw-r--r--src/corelib/itemmodels/qstringlistmodel.h1
-rw-r--r--src/gui/itemmodels/qstandarditemmodel.cpp9
-rw-r--r--src/gui/itemmodels/qstandarditemmodel.h1
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp11
-rw-r--r--tests/auto/other/modeltest/modeltest.cpp11
13 files changed, 82 insertions, 0 deletions
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
@@ -363,6 +363,15 @@ bool QAbstractProxyModel::hasChildren(const QModelIndex &parent) const
/*!
\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
+ */
QMimeData* QAbstractProxyModel::mimeData(const QModelIndexList &indexes) const
{
Q_D(const QAbstractProxyModel);
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
@@ -171,6 +171,15 @@ QModelIndex QIdentityProxyModel::index(int row, int column, const QModelIndex& p
/*!
\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
+ */
bool QIdentityProxyModel::insertColumns(int column, int count, const QModelIndex& parent)
{
Q_ASSERT(parent.isValid() ? parent.model() == this : true);
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
@@ -1871,6 +1871,22 @@ QModelIndex QSortFilterProxyModel::parent(const QModelIndex &child) const
/*!
\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
+*/
int QSortFilterProxyModel::rowCount(const QModelIndex &parent) const
{
Q_D(const QSortFilterProxyModel);
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
@@ -127,6 +127,17 @@ int QStringListModel::rowCount(const QModelIndex &parent) const
}
/*!
+ \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
@@ -2712,6 +2712,15 @@ bool QStandardItemModel::hasChildren(const QModelIndex &parent) const
/*!
\reimp
*/
+QModelIndex QStandardItemModel::sibling(int row, int column, const QModelIndex &idx) const
+{
+ Q_D(const QStandardItemModel);
+ return createIndex(row, column, idx.internalPointer());
+}
+
+/*!
+ \reimp
+*/
QVariant QStandardItemModel::headerData(int section, Qt::Orientation orientation, int role) const
{
Q_D(const QStandardItemModel);
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 );