[Experimental] Asset Picker Flatten View (#3589)

* Adding Asset Browser Table View to AssetPicker

Signed-off-by: igarri <igarri@amazon.com>

* Adding connections

Signed-off-by: igarri <igarri@amazon.com>

* Adding CVar to hide/show path column

Signed-off-by: igarri <igarri@amazon.com>

* Added Feedback from codereview

Signed-off-by: igarri <igarri@amazon.com>

* Changed m_showColumn name to m_ShownColumns

Signed-off-by: igarri <igarri@amazon.com>
monroegm-disable-blank-issue-2
AMZN-Igarri 4 years ago committed by GitHub
parent c1c6fa3615
commit 2d45a6b4cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -90,6 +90,7 @@ AzAssetBrowserWindow::AzAssetBrowserWindow(QWidget* parent)
m_tableModel->setFilterRole(Qt::DisplayRole); m_tableModel->setFilterRole(Qt::DisplayRole);
m_tableModel->setSourceModel(m_filterModel.data()); m_tableModel->setSourceModel(m_filterModel.data());
m_tableModel->setDynamicSortFilter(true);
m_ui->m_assetBrowserTableViewWidget->setModel(m_tableModel.data()); m_ui->m_assetBrowserTableViewWidget->setModel(m_tableModel.data());
connect( connect(

@ -31,10 +31,10 @@ namespace AzToolsFramework
AssetBrowserFilterModel::AssetBrowserFilterModel(QObject* parent) AssetBrowserFilterModel::AssetBrowserFilterModel(QObject* parent)
: QSortFilterProxyModel(parent) : QSortFilterProxyModel(parent)
{ {
m_showColumn.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::DisplayName)); m_shownColumns.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::DisplayName));
if (ed_useNewAssetBrowserTableView) if (ed_useNewAssetBrowserTableView)
{ {
m_showColumn.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::Path)); m_shownColumns.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::Path));
} }
m_collator.setNumericMode(true); m_collator.setNumericMode(true);
AssetBrowserComponentNotificationBus::Handler::BusConnect(); AssetBrowserComponentNotificationBus::Handler::BusConnect();
@ -96,7 +96,7 @@ namespace AzToolsFramework
bool AssetBrowserFilterModel::filterAcceptsColumn(int source_column, const QModelIndex&) const bool AssetBrowserFilterModel::filterAcceptsColumn(int source_column, const QModelIndex&) const
{ {
//if the column is in the set we want to show it //if the column is in the set we want to show it
return m_showColumn.find(source_column) != m_showColumn.end(); return m_shownColumns.find(source_column) != m_shownColumns.end();
} }
bool AssetBrowserFilterModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const bool AssetBrowserFilterModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const

@ -27,6 +27,8 @@ namespace AzToolsFramework
{ {
namespace AssetBrowser namespace AssetBrowser
{ {
using ShownColumnsSet = AZStd::fixed_unordered_set<int, 3, aznumeric_cast<int>(AssetBrowserEntry::Column::Count)>;
class AssetBrowserFilterModel class AssetBrowserFilterModel
: public QSortFilterProxyModel : public QSortFilterProxyModel
, public AssetBrowserComponentNotificationBus::Handler , public AssetBrowserComponentNotificationBus::Handler
@ -61,11 +63,11 @@ namespace AzToolsFramework
void filterUpdatedSlot(); void filterUpdatedSlot();
protected: protected:
//set for filtering columns // Set for filtering columns
//if the column is in the set the column is not filtered and is shown // If the column is in the set the column is not filtered and is shown
AZStd::fixed_unordered_set<int, 3, aznumeric_cast<int>(AssetBrowserEntry::Column::Count)> m_showColumn; ShownColumnsSet m_shownColumns;
bool m_alreadyRecomputingFilters = false; bool m_alreadyRecomputingFilters = false;
//asset source name match filter //Asset source name match filter
FilterConstType m_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 '...' AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // 4251: class '...' needs to have dll-interface to be used by clients of class '...'
QWeakPointer<const StringFilter> m_stringFilter; QWeakPointer<const StringFilter> m_stringFilter;

@ -16,7 +16,6 @@ namespace AzToolsFramework
AssetBrowserTableModel::AssetBrowserTableModel(QObject* parent /* = nullptr */) AssetBrowserTableModel::AssetBrowserTableModel(QObject* parent /* = nullptr */)
: QSortFilterProxyModel(parent) : QSortFilterProxyModel(parent)
{ {
setDynamicSortFilter(false);
} }
void AssetBrowserTableModel::setSourceModel(QAbstractItemModel* sourceModel) void AssetBrowserTableModel::setSourceModel(QAbstractItemModel* sourceModel)
@ -47,7 +46,7 @@ namespace AzToolsFramework
QModelIndex AssetBrowserTableModel::mapToSource(const QModelIndex& proxyIndex) const QModelIndex AssetBrowserTableModel::mapToSource(const QModelIndex& proxyIndex) const
{ {
Q_ASSERT(!proxyIndex.isValid() || proxyIndex.model() == this); Q_ASSERT(!proxyIndex.isValid() || proxyIndex.model() != this);
if (!proxyIndex.isValid() || !m_indexMap.contains(proxyIndex.row())) if (!proxyIndex.isValid() || !m_indexMap.contains(proxyIndex.row()))
{ {
return QModelIndex(); return QModelIndex();
@ -132,7 +131,7 @@ namespace AzToolsFramework
{ {
QModelIndex index = model->index(currentRow, 0, parent); QModelIndex index = model->index(currentRow, 0, parent);
AssetBrowserEntry* entry = GetAssetEntry(m_filterModel->mapToSource(index)); AssetBrowserEntry* entry = GetAssetEntry(m_filterModel->mapToSource(index));
// We only want to see the source assets. // We only want to see source and product assets.
if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source || if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source ||
entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Product) entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Product)
{ {

@ -21,8 +21,7 @@ namespace AzToolsFramework
class AssetBrowserFilterModel; class AssetBrowserFilterModel;
class AssetBrowserEntry; class AssetBrowserEntry;
class AssetBrowserTableModel class AssetBrowserTableModel : public QSortFilterProxyModel
: public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT

@ -9,9 +9,11 @@
#include <AzCore/UserSettings/UserSettings.h> #include <AzCore/UserSettings/UserSettings.h>
#include <AzQtComponents/Components/DockBar.h> #include <AzQtComponents/Components/DockBar.h>
#include <AzCore/Console/IConsole.h>
#include <AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h> #include <AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h> #include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserModel.h> #include <AzToolsFramework/AssetBrowser/AssetBrowserModel.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h> #include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
#include <AzToolsFramework/AssetBrowser/AssetSelectionModel.h> #include <AzToolsFramework/AssetBrowser/AssetSelectionModel.h>
@ -26,6 +28,11 @@ AZ_PUSH_DISABLE_WARNING(4251 4244, "-Wunknown-warning-option") // disable warnin
#include <QTimer> #include <QTimer>
AZ_POP_DISABLE_WARNING AZ_POP_DISABLE_WARNING
AZ_CVAR(
bool, ed_hideAssetPickerPathColumn, false, nullptr, AZ::ConsoleFunctorFlags::Null,
"Hide AssetPicker path column for a clearer view.");
AZ_CVAR_EXTERNED(bool, ed_useNewAssetBrowserTableView);
namespace AzToolsFramework namespace AzToolsFramework
{ {
namespace AssetBrowser namespace AssetBrowser
@ -34,6 +41,7 @@ namespace AzToolsFramework
: QDialog(parent) : QDialog(parent)
, m_ui(new Ui::AssetPickerDialogClass()) , m_ui(new Ui::AssetPickerDialogClass())
, m_filterModel(new AssetBrowserFilterModel(parent)) , m_filterModel(new AssetBrowserFilterModel(parent))
, m_tableModel(new AssetBrowserTableModel(parent))
, m_selection(selection) , m_selection(selection)
, m_hasFilter(false) , m_hasFilter(false)
{ {
@ -97,6 +105,56 @@ namespace AzToolsFramework
m_persistentState = AZ::UserSettings::CreateFind<AzToolsFramework::QWidgetSavedState>(AZ::Crc32(("AssetBrowserTreeView_Dialog_" + name).toUtf8().data()), AZ::UserSettings::CT_GLOBAL); m_persistentState = AZ::UserSettings::CreateFind<AzToolsFramework::QWidgetSavedState>(AZ::Crc32(("AssetBrowserTreeView_Dialog_" + name).toUtf8().data()), AZ::UserSettings::CT_GLOBAL);
m_ui->m_assetBrowserTableViewWidget->setVisible(false);
if (ed_useNewAssetBrowserTableView)
{
m_ui->m_assetBrowserTreeViewWidget->setVisible(false);
m_ui->m_assetBrowserTableViewWidget->setVisible(true);
m_tableModel->setSourceModel(m_filterModel.get());
m_ui->m_assetBrowserTableViewWidget->setModel(m_tableModel.get());
m_ui->m_assetBrowserTableViewWidget->SetName("AssetBrowserTableView_" + name);
m_ui->m_assetBrowserTableViewWidget->setDragEnabled(false);
m_ui->m_assetBrowserTableViewWidget->setSelectionMode(
selection.GetMultiselect() ? QAbstractItemView::SelectionMode::ExtendedSelection
: QAbstractItemView::SelectionMode::SingleSelection);
if (ed_hideAssetPickerPathColumn)
{
m_ui->m_assetBrowserTableViewWidget->hideColumn(1);
}
// if the current selection is invalid, disable the Ok button
m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(EvaluateSelection());
connect(
m_filterModel.data(), &AssetBrowserFilterModel::filterChanged, this,
[this]()
{
m_tableModel->UpdateTableModelMaps();
});
connect(
m_ui->m_assetBrowserTableViewWidget, &AssetBrowserTableView::selectionChangedSignal, this,
[this](const QItemSelection&, const QItemSelection&)
{
AssetPickerDialog::SelectionChangedSlot();
});
connect(m_ui->m_assetBrowserTableViewWidget, &QAbstractItemView::doubleClicked, this, &AssetPickerDialog::DoubleClickedSlot);
connect(
m_ui->m_assetBrowserTableViewWidget, &AssetBrowserTableView::ClearStringFilter, m_ui->m_searchWidget,
&SearchWidget::ClearStringFilter);
connect(
m_ui->m_assetBrowserTableViewWidget, &AssetBrowserTableView::ClearTypeFilter, m_ui->m_searchWidget,
&SearchWidget::ClearTypeFilter);
m_ui->m_assetBrowserTableViewWidget->SetName("AssetBrowserTableView_main");
m_tableModel->UpdateTableModelMaps();
}
QTimer::singleShot(0, this, &AssetPickerDialog::RestoreState); QTimer::singleShot(0, this, &AssetPickerDialog::RestoreState);
SelectionChangedSlot(); SelectionChangedSlot();
} }
@ -134,6 +192,7 @@ namespace AzToolsFramework
{ {
m_ui->m_assetBrowserTreeViewWidget->expandAll(); m_ui->m_assetBrowserTreeViewWidget->expandAll();
}); });
m_tableModel->UpdateTableModelMaps();
} }
if (m_hasFilter && !hasFilter) if (m_hasFilter && !hasFilter)
@ -166,7 +225,8 @@ namespace AzToolsFramework
bool AssetPickerDialog::EvaluateSelection() const bool AssetPickerDialog::EvaluateSelection() const
{ {
auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets(); auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->isVisible() ? m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets()
: m_ui->m_assetBrowserTableViewWidget->GetSelectedAssets();
// exactly one item must be selected, even if multi-select option is disabled, still good practice to check // exactly one item must be selected, even if multi-select option is disabled, still good practice to check
if (selectedAssets.empty()) if (selectedAssets.empty())
{ {
@ -197,7 +257,10 @@ namespace AzToolsFramework
void AssetPickerDialog::UpdatePreview() const void AssetPickerDialog::UpdatePreview() const
{ {
auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets(); auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->isVisible()
? m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets()
: m_ui->m_assetBrowserTableViewWidget->GetSelectedAssets();
;
if (selectedAssets.size() != 1) if (selectedAssets.size() != 1)
{ {
m_ui->m_previewerFrame->Clear(); m_ui->m_previewerFrame->Clear();

@ -33,6 +33,7 @@ namespace AzToolsFramework
{ {
class ProductAssetBrowserEntry; class ProductAssetBrowserEntry;
class AssetBrowserFilterModel; class AssetBrowserFilterModel;
class AssetBrowserTableModel;
class AssetBrowserModel; class AssetBrowserModel;
class AssetSelectionModel; class AssetSelectionModel;
@ -69,6 +70,7 @@ namespace AzToolsFramework
QScopedPointer<Ui::AssetPickerDialogClass> m_ui; QScopedPointer<Ui::AssetPickerDialogClass> m_ui;
AssetBrowserModel* m_assetBrowserModel = nullptr; AssetBrowserModel* m_assetBrowserModel = nullptr;
QScopedPointer<AssetBrowserFilterModel> m_filterModel; QScopedPointer<AssetBrowserFilterModel> m_filterModel;
QScopedPointer<AssetBrowserTableModel> m_tableModel;
AssetSelectionModel& m_selection; AssetSelectionModel& m_selection;
bool m_hasFilter; bool m_hasFilter;
AZStd::unique_ptr<TreeViewState> m_filterStateSaver; AZStd::unique_ptr<TreeViewState> m_filterStateSaver;

@ -142,6 +142,9 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="AzToolsFramework::AssetBrowser::AssetBrowserTableView" name="m_assetBrowserTableViewWidget"/>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="verticalLayoutWidget"> <widget class="QWidget" name="verticalLayoutWidget">
@ -197,6 +200,11 @@
<header>AzToolsFramework/AssetBrowser/Previewer/PreviewerFrame.h</header> <header>AzToolsFramework/AssetBrowser/Previewer/PreviewerFrame.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>AzToolsFramework::AssetBrowser::AssetBrowserTableView</class>
<extends>QTableView</extends>
<header>AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h</header>
</customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>
<connections/> <connections/>

@ -53,7 +53,6 @@ namespace AzToolsFramework
// AssetBrowserComponentNotificationBus // AssetBrowserComponentNotificationBus
void OnAssetBrowserComponentReady() override; void OnAssetBrowserComponentReady() override;
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
Q_SIGNALS: Q_SIGNALS:
void selectionChangedSignal(const QItemSelection& selected, const QItemSelection& deselected); void selectionChangedSignal(const QItemSelection& selected, const QItemSelection& deselected);
void ClearStringFilter(); void ClearStringFilter();

@ -28,7 +28,7 @@ namespace ScriptCanvasEditor
{ {
setDynamicSortFilter(true); setDynamicSortFilter(true);
m_showColumn.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::DisplayName)); m_shownColumns.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::DisplayName));
UnitTestWidgetNotificationBus::Handler::BusConnect(); UnitTestWidgetNotificationBus::Handler::BusConnect();

Loading…
Cancel
Save