diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp index efa47e600d..d0999c5c56 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp @@ -25,19 +25,47 @@ namespace AzToolsFramework AZ_Assert( m_filterModel, "Error in AssetBrowserTableModel initialization, class expects source model to be an AssetBrowserFilterModel."); + connect(sourceModel, &QAbstractItemModel::rowsInserted, this, &AssetBrowserTableModel::UpdateTableModelMaps); + connect(sourceModel, &QAbstractItemModel::rowsRemoved, this, &AssetBrowserTableModel::UpdateTableModelMaps); + connect(sourceModel, &QAbstractItemModel::modelAboutToBeReset, this, &AssetBrowserTableModel::beginResetModel); + connect( + sourceModel, &QAbstractItemModel::modelReset, this, + [this]() + { + { + QSignalBlocker sb(this); + UpdateTableModelMaps(); + } + endResetModel(); + }); + connect(sourceModel, &QAbstractItemModel::layoutChanged, this, &AssetBrowserTableModel::UpdateTableModelMaps); + connect(sourceModel, &QAbstractItemModel::dataChanged, this, &AssetBrowserTableModel::SourceDataChanged); + + QSortFilterProxyModel::setSourceModel(sourceModel); } QModelIndex AssetBrowserTableModel::mapToSource(const QModelIndex& proxyIndex) const { Q_ASSERT(!proxyIndex.isValid() || proxyIndex.model() == this); - if (!proxyIndex.isValid()) + if (!proxyIndex.isValid() || !m_indexMap.contains(proxyIndex.row())) { return QModelIndex(); } return m_indexMap[proxyIndex.row()]; } + QModelIndex AssetBrowserTableModel::mapFromSource(const QModelIndex& sourceIndex) const + { + Q_ASSERT(!sourceIndex.isValid() || sourceIndex.model() == sourceModel()); + if (!sourceIndex.isValid() || !m_rowMap.contains(sourceIndex)) + { + return QModelIndex(); + } + + return createIndex(m_rowMap[sourceIndex], sourceIndex.column()); + } + QVariant AssetBrowserTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role == Qt::DisplayRole && orientation == Qt::Horizontal) @@ -49,20 +77,8 @@ namespace AzToolsFramework QVariant AssetBrowserTableModel::data(const QModelIndex& index, int role) const { - auto sourceIndex = mapToSource(index); - if (!sourceIndex.isValid()) - { - return QVariant(); - } - - AssetBrowserEntry* entry = GetAssetEntry(sourceIndex); - if (entry == nullptr) - { - AZ_Assert(false, "AssetBrowserTableModel - QModelIndex does not reference an AssetEntry. Source model is not valid."); - return QVariant(); - } - - return sourceIndex.data(role); + Q_ASSERT(index.isValid() && index.model() == this); + return sourceModel()->data(mapToSource(index), role); } QModelIndex AssetBrowserTableModel::parent([[maybe_unused]] const QModelIndex& child) const @@ -76,14 +92,28 @@ namespace AzToolsFramework return QModelIndex(); } + void AssetBrowserTableModel::SourceDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight) + { + for (int row = topLeft.row(); row <= bottomRight.row(); ++row) + { + if (!m_indexMap.contains(row)) + { + UpdateTableModelMaps(); + return; + } + } + } + QModelIndex AssetBrowserTableModel::index(int row, int column, const QModelIndex& parent) const { + Q_ASSERT(!parent.isValid()); + return parent.isValid() ? QModelIndex() : createIndex(row, column, m_indexMap[row].internalPointer()); } int AssetBrowserTableModel::rowCount(const QModelIndex& parent) const { - return !parent.isValid() ? m_indexMap.size() : 0; + return !parent.isValid() ? m_indexMap.size() : sourceModel()->rowCount(parent); } int AssetBrowserTableModel::BuildTableModelMap( @@ -103,13 +133,11 @@ namespace AzToolsFramework QModelIndex index = model->index(currentRow, 0, parent); AssetBrowserEntry* entry = GetAssetEntry(m_filterModel->mapToSource(index)); // We only want to see the source assets. - if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source) + if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source || + entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Product) { - beginInsertRows(parent, row, row); m_indexMap[row] = index; - endInsertRows(); - - Q_EMIT dataChanged(index, index); + m_rowMap[index] = row; ++row; ++m_displayedItemsCounter; } @@ -143,12 +171,8 @@ namespace AzToolsFramework void AssetBrowserTableModel::UpdateTableModelMaps() { emit layoutAboutToBeChanged(); - if (!m_indexMap.isEmpty()) - { - beginRemoveRows(m_indexMap.first(), m_indexMap.first().row(), m_indexMap.last().row()); - m_indexMap.clear(); - endRemoveRows(); - } + m_indexMap.clear(); + m_rowMap.clear(); AzToolsFramework::EditorSettingsAPIBus::BroadcastResult( m_numberOfItemsDisplayed, &AzToolsFramework::EditorSettingsAPIBus::Handler::GetMaxNumberOfItemsShownInSearchView); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h index d80e2bd093..04559fbfbc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h @@ -30,12 +30,11 @@ namespace AzToolsFramework AZ_CLASS_ALLOCATOR(AssetBrowserTableModel, AZ::SystemAllocator, 0); explicit AssetBrowserTableModel(QObject* parent = nullptr); - void UpdateTableModelMaps(); - //////////////////////////////////////////////////////////////////// // QSortFilterProxyModel void setSourceModel(QAbstractItemModel* sourceModel) override; QModelIndex mapToSource(const QModelIndex& proxyIndex) const override; + QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QModelIndex parent(const QModelIndex& child) const override; @@ -45,16 +44,21 @@ namespace AzToolsFramework int rowCount(const QModelIndex& parent = QModelIndex()) const override; QVariant headerData(int section, Qt::Orientation orientation, int role /* = Qt::DisplayRole */) const override; //////////////////////////////////////////////////////////////////// - private: AssetBrowserEntry* GetAssetEntry(QModelIndex index) const; int BuildTableModelMap(const QAbstractItemModel* model, const QModelIndex& parent = QModelIndex(), int row = 0); + public slots: + void UpdateTableModelMaps(); + + private slots: + void SourceDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight); private: int m_numberOfItemsDisplayed = 50; int m_displayedItemsCounter = 0; QPointer m_filterModel; QMap m_indexMap; + QMap m_rowMap; }; } // namespace AssetBrowser } // namespace AzToolsFramework