diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp index e082a54cc3f..969333bc3fd 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp @@ -176,6 +176,7 @@ bool CollectionDetailsModel::insertRows(int row, int count, const QModelIndex &p m_currentCollection.insertEmptyElements(row, count); endInsertRows(); + selectRow(row); return true; } @@ -189,6 +190,11 @@ bool CollectionDetailsModel::removeColumns(int column, int count, const QModelIn bool columnsRemoved = m_currentCollection.removeColumns(column, count); endRemoveColumns(); + int nextColumn = column - 1; + if (nextColumn < 0 && columnCount(parent) > 0) + nextColumn = 0; + + selectColumn(nextColumn); return columnsRemoved; } diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailssortfiltermodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailssortfiltermodel.cpp index 64bdb8a64d1..50fcadd4944 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailssortfiltermodel.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailssortfiltermodel.cpp @@ -14,24 +14,24 @@ CollectionDetailsSortFilterModel::CollectionDetailsSortFilterModel(QObject *pare : QSortFilterProxyModel(parent) { connect(this, &CollectionDetailsSortFilterModel::rowsInserted, - this, &CollectionDetailsSortFilterModel::updateEmpty); + this, &CollectionDetailsSortFilterModel::updateRowCountChanges); connect(this, &CollectionDetailsSortFilterModel::rowsRemoved, - this, &CollectionDetailsSortFilterModel::updateEmpty); + this, &CollectionDetailsSortFilterModel::updateRowCountChanges); connect(this, &CollectionDetailsSortFilterModel::modelReset, - this, &CollectionDetailsSortFilterModel::updateEmpty); + this, &CollectionDetailsSortFilterModel::updateRowCountChanges); + + setDynamicSortFilter(true); } void CollectionDetailsSortFilterModel::setSourceModel(CollectionDetailsModel *model) { m_source = model; Super::setSourceModel(model); - connect(m_source, &CollectionDetailsModel::selectedColumnChanged, this, [this](int sourceColumn) { - emit selectedColumnChanged(mapFromSource(m_source->index(0, sourceColumn)).column()); - }); + connect(m_source, &CollectionDetailsModel::selectedColumnChanged, + this, &CollectionDetailsSortFilterModel::updateSelectedColumn); - connect(m_source, &CollectionDetailsModel::selectedRowChanged, this, [this](int sourceRow) { - emit selectedRowChanged(mapFromSource(m_source->index(sourceRow, 0)).row()); - }); + connect(m_source, &CollectionDetailsModel::selectedRowChanged, + this, &CollectionDetailsSortFilterModel::updateSelectedRow); } int CollectionDetailsSortFilterModel::selectedRow() const @@ -64,10 +64,12 @@ bool CollectionDetailsSortFilterModel::selectColumn(int column) CollectionDetailsSortFilterModel::~CollectionDetailsSortFilterModel() = default; -bool CollectionDetailsSortFilterModel::filterAcceptsRow( - [[maybe_unused]] int sourceRow, [[maybe_unused]] const QModelIndex &sourceParent) const +bool CollectionDetailsSortFilterModel::filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const { - return true; + QTC_ASSERT(m_source, return false); + QModelIndex sourceIndex(m_source->index(sourceRow, 0, sourceParent)); + return sourceIndex.isValid(); } bool CollectionDetailsSortFilterModel::lessThan(const QModelIndex &sourceleft, @@ -93,4 +95,61 @@ void CollectionDetailsSortFilterModel::updateEmpty() } } +void CollectionDetailsSortFilterModel::updateSelectedRow() +{ + const int upToDateSelectedRow = selectedRow(); + if (m_selectedRow == upToDateSelectedRow) + return; + + const int rows = rowCount(); + const int columns = columnCount(); + const int previousRow = m_selectedRow; + + m_selectedRow = upToDateSelectedRow; + emit this->selectedRowChanged(m_selectedRow); + + auto notifySelectedDataChanged = [this, rows, columns](int notifyingRow) { + if (notifyingRow > -1 && notifyingRow < rows && columns) { + emit dataChanged(index(notifyingRow, 0), + index(notifyingRow, columns - 1), + {CollectionDetailsModel::SelectedRole}); + } + }; + + notifySelectedDataChanged(previousRow); + notifySelectedDataChanged(m_selectedRow); +} + +void CollectionDetailsSortFilterModel::updateSelectedColumn() +{ + const int upToDateSelectedColumn = selectedColumn(); + if (m_selectedColumn == upToDateSelectedColumn) + return; + + const int rows = rowCount(); + const int columns = columnCount(); + const int previousColumn = m_selectedColumn; + + m_selectedColumn = upToDateSelectedColumn; + emit this->selectedColumnChanged(m_selectedColumn); + + auto notifySelectedDataChanged = [this, rows, columns](int notifyingCol) { + if (notifyingCol > -1 && notifyingCol < columns && rows) { + emit dataChanged(index(0, notifyingCol), + index(rows - 1, notifyingCol), + {CollectionDetailsModel::SelectedRole}); + } + }; + + notifySelectedDataChanged(previousColumn); + notifySelectedDataChanged(m_selectedColumn); +} + +void CollectionDetailsSortFilterModel::updateRowCountChanges() +{ + updateEmpty(); + updateSelectedRow(); + invalidate(); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailssortfiltermodel.h b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailssortfiltermodel.h index fdf6f2df9aa..93305f3ca20 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailssortfiltermodel.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailssortfiltermodel.h @@ -44,8 +44,13 @@ protected: private: void updateEmpty(); + void updateSelectedRow(); + void updateSelectedColumn(); + void updateRowCountChanges(); QPointer m_source; + int m_selectedColumn = -1; + int m_selectedRow = -1; bool m_isEmpty = true; };