diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h index 6aa1a08e45..3fff43859f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h @@ -45,7 +45,7 @@ namespace AzToolsFramework //asset type filtering void SetFilter(FilterConstType filter); void FilterUpdatedSlotImmediate(); - + const FilterConstType& GetFilter() const { return m_filter; } ////////////////////////////////////////////////////////////////////////// // AssetBrowserComponentNotificationBus ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp index 7480d17d47..b75d3e9400 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp @@ -5,7 +5,7 @@ AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") #include -#include +#include #include #include @@ -29,10 +29,12 @@ namespace AzToolsFramework } void AssetBrowserTableModel::OnAssetBrowserComponentReady() { - BuildMap(sourceModel()); + //BuildMap(sourceModel()); } void AssetBrowserTableModel::setSourceModel(QAbstractItemModel* sourceModel) { + m_filterModel = qobject_cast(sourceModel); + AZ_Assert(m_filterModel, "Expecting AssetBrowserFilterModel"); QSortFilterProxyModel::setSourceModel(sourceModel); } @@ -60,6 +62,18 @@ namespace AzToolsFramework return createIndex(m_rowMap[sourceIndex], sourceIndex.column(), sourceIndex.internalPointer()); } + bool AssetBrowserTableModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const + { + AZ_UNUSED(source_row); + AZ_UNUSED(source_parent); + // no filter present, every entry is not visible + if (!m_filterModel->GetFilter()) + { + return false; + } + return true; + } + QModelIndex AssetBrowserTableModel::index(int row, int column, const QModelIndex& parent) const { /*AZ_UNUSED(row); @@ -159,158 +173,172 @@ namespace AzToolsFramework } void AssetBrowserTableModel::UpdateMap() { - m_indexMap.clear(); - m_rowMap.clear(); + //m_indexMap.clear(); + //m_rowMap.clear(); + + if (m_indexMap.size() > 0) + { + //beginRemoveRows(m_indexMap.first().parent(), m_indexMap.first().row(), m_indexMap.last().row()); + for (const auto& key : m_indexMap.keys()) + { + beginRemoveRows(m_indexMap[key], m_indexMap[key].row(), m_indexMap[key].row()); + m_rowMap.remove(m_indexMap[key]); + m_indexMap.remove(key); + endRemoveRows(); + } + //endRemoveRows(); + } + BuildMap(sourceModel()); } //---------------------------------------AssetBrowserTableFilterModel-------------------------------------------- - AssetBrowserTableFilterModel::AssetBrowserTableFilterModel(QObject* parent) - : QSortFilterProxyModel(parent) - { - m_showColumn.insert(static_cast(AssetBrowserEntry::Column::DisplayName)); - m_showColumn.insert(static_cast(AssetBrowserEntry::Column::Path)); - AssetBrowserComponentNotificationBus::Handler::BusConnect(); - } + //AssetBrowserTableFilterModel::AssetBrowserTableFilterModel(QObject* parent) + // : QSortFilterProxyModel(parent) + //{ + // m_showColumn.insert(static_cast(AssetBrowserEntry::Column::DisplayName)); + // m_showColumn.insert(static_cast(AssetBrowserEntry::Column::Path)); + // AssetBrowserComponentNotificationBus::Handler::BusConnect(); + //} - AssetBrowserTableFilterModel::~AssetBrowserTableFilterModel() - { - AssetBrowserComponentNotificationBus::Handler::BusDisconnect(); - } + //AssetBrowserTableFilterModel::~AssetBrowserTableFilterModel() + //{ + // AssetBrowserComponentNotificationBus::Handler::BusDisconnect(); + //} - void AssetBrowserTableFilterModel::setSourceModel(QAbstractItemModel* sourceModel) - { - QSortFilterProxyModel::setSourceModel(sourceModel); - } + //void AssetBrowserTableFilterModel::setSourceModel(QAbstractItemModel* sourceModel) + //{ + // QSortFilterProxyModel::setSourceModel(sourceModel); + //} - void AssetBrowserTableFilterModel::SetFilter(FilterConstType filter) - { - connect(filter.data(), &AssetBrowserEntryFilter::updatedSignal, this, &AssetBrowserTableFilterModel::filterUpdatedSlot); - m_filter = filter; - m_invalidateFilter = true; - // asset browser entries are not guaranteed to have populated when the filter is set, delay filtering until they are - bool isAssetBrowserComponentReady = false; - AssetBrowserComponentRequestBus::BroadcastResult(isAssetBrowserComponentReady, &AssetBrowserComponentRequests::AreEntriesReady); - if (isAssetBrowserComponentReady) - { - OnAssetBrowserComponentReady(); - } - } + //void AssetBrowserTableFilterModel::SetFilter(FilterConstType filter) + //{ + // connect(filter.data(), &AssetBrowserEntryFilter::updatedSignal, this, &AssetBrowserTableFilterModel::filterUpdatedSlot); + // m_filter = filter; + // m_invalidateFilter = true; + // // asset browser entries are not guaranteed to have populated when the filter is set, delay filtering until they are + // bool isAssetBrowserComponentReady = false; + // AssetBrowserComponentRequestBus::BroadcastResult(isAssetBrowserComponentReady, &AssetBrowserComponentRequests::AreEntriesReady); + // if (isAssetBrowserComponentReady) + // { + // OnAssetBrowserComponentReady(); + // } + //} - void AssetBrowserTableFilterModel::FilterUpdatedSlotImmediate() - { - auto compFilter = qobject_cast>(m_filter); - if (compFilter) - { - auto& subFilters = compFilter->GetSubFilters(); - auto it = AZStd::find_if(subFilters.begin(), subFilters.end(), [subFilters](FilterConstType filter) -> bool { - auto assetTypeFilter = qobject_cast>(filter); - return !assetTypeFilter.isNull(); - }); - if (it != subFilters.end()) - { - m_assetTypeFilter = qobject_cast>(*it); - } - it = AZStd::find_if(subFilters.begin(), subFilters.end(), [subFilters](FilterConstType filter) -> bool { - auto stringFilter = qobject_cast>(filter); - return !stringFilter.isNull(); - }); - if (it != subFilters.end()) - { - m_stringFilter = qobject_cast>(*it); - } - } - invalidateFilter(); - Q_EMIT filterChanged(); - } + //void AssetBrowserTableFilterModel::FilterUpdatedSlotImmediate() + //{ + // auto compFilter = qobject_cast>(m_filter); + // if (compFilter) + // { + // auto& subFilters = compFilter->GetSubFilters(); + // auto it = AZStd::find_if(subFilters.begin(), subFilters.end(), [subFilters](FilterConstType filter) -> bool { + // auto assetTypeFilter = qobject_cast>(filter); + // return !assetTypeFilter.isNull(); + // }); + // if (it != subFilters.end()) + // { + // m_assetTypeFilter = qobject_cast>(*it); + // } + // it = AZStd::find_if(subFilters.begin(), subFilters.end(), [subFilters](FilterConstType filter) -> bool { + // auto stringFilter = qobject_cast>(filter); + // return !stringFilter.isNull(); + // }); + // if (it != subFilters.end()) + // { + // m_stringFilter = qobject_cast>(*it); + // } + // } + // invalidateFilter(); + // Q_EMIT filterChanged(); + //} - void AssetBrowserTableFilterModel::OnAssetBrowserComponentReady() - { - if (m_invalidateFilter) - { - invalidateFilter(); - m_invalidateFilter = false; - } - Q_EMIT entriesUpdated(); - } + //void AssetBrowserTableFilterModel::OnAssetBrowserComponentReady() + //{ + // if (m_invalidateFilter) + // { + // invalidateFilter(); + // m_invalidateFilter = false; + // } + // Q_EMIT entriesUpdated(); + //} - bool AssetBrowserTableFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const - { - AZ_UNUSED(source_row); - AZ_UNUSED(source_parent); - QModelIndex idx = sourceModel()->index(source_row, 0, source_parent); - if (!idx.isValid()) - { - return false; - } - // no filter present, every entry is visible - if (!m_filter) - { - return true; - } + //bool AssetBrowserTableFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const + //{ + // AZ_UNUSED(source_row); + // AZ_UNUSED(source_parent); + // QModelIndex idx = sourceModel()->index(source_row, 0, source_parent); + // if (!idx.isValid()) + // { + // return false; + // } + // // no filter present, every entry is visible + // if (!m_filter) + // { + // return true; + // } - //// the entry is the internal pointer of the index - //auto entry = static_cast(idx.internalPointer()); + // //// the entry is the internal pointer of the index + // //auto entry = static_cast(idx.internalPointer()); - //if (entry) - //{ - // // root should return true even if its not displayed in the treeview - // if (entry && entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Root) - // { - // return true; - // } - // return m_filter->Match(entry); - //} - return true; - } + // //if (entry) + // //{ + // // // root should return true even if its not displayed in the treeview + // // if (entry && entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Root) + // // { + // // return true; + // // } + // // return m_filter->Match(entry); + // //} + // return true; + //} - bool AssetBrowserTableFilterModel::filterAcceptsColumn(int source_column, const QModelIndex&) const - { - return m_showColumn.find(source_column) != m_showColumn.end(); - } + //bool AssetBrowserTableFilterModel::filterAcceptsColumn(int source_column, const QModelIndex&) const + //{ + // return m_showColumn.find(source_column) != m_showColumn.end(); + //} - bool AssetBrowserTableFilterModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const - { - if (source_left.column() == source_right.column()) - { - QVariant leftData = sourceModel()->data(source_left, AssetBrowserModel::Roles::EntryRole); - QVariant rightData = sourceModel()->data(source_right, AssetBrowserModel::Roles::EntryRole); - if (leftData.canConvert() && rightData.canConvert()) - { - auto leftEntry = qvariant_cast(leftData); - auto rightEntry = qvariant_cast(rightData); + //bool AssetBrowserTableFilterModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const + //{ + // if (source_left.column() == source_right.column()) + // { + // QVariant leftData = sourceModel()->data(source_left, AssetBrowserModel::Roles::EntryRole); + // QVariant rightData = sourceModel()->data(source_right, AssetBrowserModel::Roles::EntryRole); + // if (leftData.canConvert() && rightData.canConvert()) + // { + // auto leftEntry = qvariant_cast(leftData); + // auto rightEntry = qvariant_cast(rightData); - // folders should always come first - if (azrtti_istypeof(leftEntry) && - azrtti_istypeof(rightEntry)) - { - return false; - } - if (azrtti_istypeof(leftEntry) && - azrtti_istypeof(rightEntry)) - { - return true; - } + // // folders should always come first + // if (azrtti_istypeof(leftEntry) && + // azrtti_istypeof(rightEntry)) + // { + // return false; + // } + // if (azrtti_istypeof(leftEntry) && + // azrtti_istypeof(rightEntry)) + // { + // return true; + // } - // if both entries are of same type, sort alphabetically - return m_collator.compare(leftEntry->GetDisplayName(), rightEntry->GetDisplayName()) > 0; - } - } - return QSortFilterProxyModel::lessThan(source_left, source_right); - } + // // if both entries are of same type, sort alphabetically + // return m_collator.compare(leftEntry->GetDisplayName(), rightEntry->GetDisplayName()) > 0; + // } + // } + // return QSortFilterProxyModel::lessThan(source_left, source_right); + //} - void AssetBrowserTableFilterModel::filterUpdatedSlot() - { - if (!m_alreadyRecomputingFilters) - { - m_alreadyRecomputingFilters = true; - // de-bounce it, since we may get many filter updates all at once. - QTimer::singleShot(0, this, [this]() { - m_alreadyRecomputingFilters = false; - FilterUpdatedSlotImmediate(); - }); - } - } + //void AssetBrowserTableFilterModel::filterUpdatedSlot() + //{ + // if (!m_alreadyRecomputingFilters) + // { + // m_alreadyRecomputingFilters = true; + // // de-bounce it, since we may get many filter updates all at once. + // QTimer::singleShot(0, this, [this]() { + // m_alreadyRecomputingFilters = false; + // FilterUpdatedSlotImmediate(); + // }); + // } + //} } // namespace AssetBrowser } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h index 8ffd1a469e..34cf8432ff 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h @@ -7,6 +7,8 @@ #include #include #include +//#include +#include AZ_PUSH_DISABLE_WARNING( 4251, "-Wunknown-warning-option") // 4251: class '...' needs to have dll-interface to be used by clients of class '...' @@ -19,6 +21,9 @@ namespace AzToolsFramework { namespace AssetBrowser { + class AssetBrowserFilterModel; + + class AssetBrowserTableModel : public QSortFilterProxyModel , public AssetBrowserComponentNotificationBus::Handler @@ -38,6 +43,7 @@ namespace AzToolsFramework // QSortFilterProxyModel QModelIndex mapToSource(const QModelIndex& proxyIndex) const override; QModelIndex mapFromSource(const QModelIndex& sourceIndex) const override; + bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; QModelIndex parent(const QModelIndex& child) 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; @@ -53,55 +59,56 @@ namespace AzToolsFramework AssetBrowserEntry* GetAssetEntry(QModelIndex index) const; int BuildMap(const QAbstractItemModel* model, const QModelIndex& parent = QModelIndex(), int row = 0); private: + QPointer m_filterModel; QMap m_indexMap; QMap m_rowMap; }; - class AssetBrowserTableFilterModel - : public QSortFilterProxyModel - , public AssetBrowserComponentNotificationBus::Handler - { - Q_OBJECT - public: - explicit AssetBrowserTableFilterModel(QObject* parent = nullptr); - ~AssetBrowserTableFilterModel(); + //class AssetBrowserTableFilterModel + // : public QSortFilterProxyModel + // , public AssetBrowserComponentNotificationBus::Handler + //{ + // Q_OBJECT + //public: + // explicit AssetBrowserTableFilterModel(QObject* parent = nullptr); + // ~AssetBrowserTableFilterModel(); - void setSourceModel(QAbstractItemModel* sourceModel) override; - // asset type filtering - void SetFilter(FilterConstType filter); - void FilterUpdatedSlotImmediate(); + // void setSourceModel(QAbstractItemModel* sourceModel) override; + // // asset type filtering + // void SetFilter(FilterConstType filter); + // void FilterUpdatedSlotImmediate(); - ////////////////////////////////////////////////////////////////////////// - // AssetBrowserComponentNotificationBus - ////////////////////////////////////////////////////////////////////////// - void OnAssetBrowserComponentReady() override; + // ////////////////////////////////////////////////////////////////////////// + // // AssetBrowserComponentNotificationBus + // ////////////////////////////////////////////////////////////////////////// + // void OnAssetBrowserComponentReady() override; - Q_SIGNALS: - void filterChanged(); - void entriesUpdated(); + //Q_SIGNALS: + // void filterChanged(); + // void entriesUpdated(); - ////////////////////////////////////////////////////////////////////////// - // QSortFilterProxyModel - protected: - bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; - bool filterAcceptsColumn(int source_column, const QModelIndex& /*source_parent*/) const override; - bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const override; - ////////////////////////////////////////////////////////////////////////// + // ////////////////////////////////////////////////////////////////////////// + // // QSortFilterProxyModel + //protected: + // bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; + // bool filterAcceptsColumn(int source_column, const QModelIndex& /*source_parent*/) const override; + // bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const override; + // ////////////////////////////////////////////////////////////////////////// - public Q_SLOTS: - void filterUpdatedSlot(); + //public Q_SLOTS: + // void filterUpdatedSlot(); - private: - AZStd::fixed_unordered_set(AssetBrowserEntry::Column::Count)> m_showColumn; - bool m_alreadyRecomputingFilters = false; - // asset source name match filter - FilterConstType m_filter; - AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // 4251: class '...' needs to have dll-interface to be used by clients of class '...' - QWeakPointer m_stringFilter; - QWeakPointer m_assetTypeFilter; - QCollator m_collator; // cache the collator as its somewhat expensive to constantly create and destroy one. - AZ_POP_DISABLE_WARNING - bool m_invalidateFilter = false; - }; + //private: + // AZStd::fixed_unordered_set(AssetBrowserEntry::Column::Count)> m_showColumn; + // bool m_alreadyRecomputingFilters = false; + // // asset source name match filter + // FilterConstType m_filter; + // AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // 4251: class '...' needs to have dll-interface to be used by clients of class '...' + // QWeakPointer m_stringFilter; + // QWeakPointer m_assetTypeFilter; + // QCollator m_collator; // cache the collator as its somewhat expensive to constantly create and destroy one. + // AZ_POP_DISABLE_WARNING + // bool m_invalidateFilter = false; + //}; } // namespace AssetBrowser } // namespace AzToolsFramework diff --git a/Code/Sandbox/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp b/Code/Sandbox/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp index fb850f4f26..dd4b3b0cad 100644 --- a/Code/Sandbox/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp +++ b/Code/Sandbox/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp @@ -68,7 +68,7 @@ AzAssetBrowserWindow::AzAssetBrowserWindow(QWidget* parent) , m_ui(new Ui::AzAssetBrowserWindowClass()) , m_filterModel(new AzToolsFramework::AssetBrowser::AssetBrowserFilterModel(parent)) , m_tableModel(new AzToolsFramework::AssetBrowser::AssetBrowserTableModel(parent)) - , m_tableFilterModel(new AzToolsFramework::AssetBrowser::AssetBrowserTableFilterModel(parent)) + /*, m_tableFilterModel(new AzToolsFramework::AssetBrowser::AssetBrowserTableFilterModel(parent))*/ { m_ui->setupUi(this); m_ui->m_searchWidget->Setup(true, true); @@ -83,8 +83,8 @@ AzAssetBrowserWindow::AzAssetBrowserWindow(QWidget* parent) m_tableModel->setSourceModel(m_filterModel.data()); //m_tableModel->setSourceModel(m_assetBrowserModel); - m_tableFilterModel->setSourceModel(m_tableModel.data()); - m_tableFilterModel->SetFilter(m_ui->m_searchWidget->GetFilter()); + //m_tableFilterModel->setSourceModel(m_tableModel.data()); + //m_tableFilterModel->SetFilter(m_ui->m_searchWidget->GetFilter()); m_ui->m_assetBrowserTreeViewWidget->setModel(m_filterModel.data()); diff --git a/Code/Sandbox/Editor/AzAssetBrowser/AzAssetBrowserWindow.h b/Code/Sandbox/Editor/AzAssetBrowser/AzAssetBrowserWindow.h index a8a8474ef8..801af3e2a8 100644 --- a/Code/Sandbox/Editor/AzAssetBrowser/AzAssetBrowserWindow.h +++ b/Code/Sandbox/Editor/AzAssetBrowser/AzAssetBrowserWindow.h @@ -56,7 +56,7 @@ private: QScopedPointer m_ui; QScopedPointer m_filterModel; QScopedPointer m_tableModel; - QScopedPointer m_tableFilterModel; + //QScopedPointer m_tableFilterModel; AzToolsFramework::AssetBrowser::AssetBrowserModel* m_assetBrowserModel; void UpdatePreview() const;