[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>
This commit is contained in:
@@ -90,6 +90,7 @@ AzAssetBrowserWindow::AzAssetBrowserWindow(QWidget* parent)
|
||||
|
||||
m_tableModel->setFilterRole(Qt::DisplayRole);
|
||||
m_tableModel->setSourceModel(m_filterModel.data());
|
||||
m_tableModel->setDynamicSortFilter(true);
|
||||
m_ui->m_assetBrowserTableViewWidget->setModel(m_tableModel.data());
|
||||
|
||||
connect(
|
||||
|
||||
+3
-3
@@ -31,10 +31,10 @@ namespace AzToolsFramework
|
||||
AssetBrowserFilterModel::AssetBrowserFilterModel(QObject* parent)
|
||||
: QSortFilterProxyModel(parent)
|
||||
{
|
||||
m_showColumn.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::DisplayName));
|
||||
m_shownColumns.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::DisplayName));
|
||||
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);
|
||||
AssetBrowserComponentNotificationBus::Handler::BusConnect();
|
||||
@@ -96,7 +96,7 @@ namespace AzToolsFramework
|
||||
bool AssetBrowserFilterModel::filterAcceptsColumn(int source_column, const QModelIndex&) const
|
||||
{
|
||||
//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
|
||||
|
||||
+6
-4
@@ -27,6 +27,8 @@ namespace AzToolsFramework
|
||||
{
|
||||
namespace AssetBrowser
|
||||
{
|
||||
using ShownColumnsSet = AZStd::fixed_unordered_set<int, 3, aznumeric_cast<int>(AssetBrowserEntry::Column::Count)>;
|
||||
|
||||
class AssetBrowserFilterModel
|
||||
: public QSortFilterProxyModel
|
||||
, public AssetBrowserComponentNotificationBus::Handler
|
||||
@@ -61,11 +63,11 @@ namespace AzToolsFramework
|
||||
void filterUpdatedSlot();
|
||||
|
||||
protected:
|
||||
//set for filtering columns
|
||||
//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;
|
||||
// Set for filtering columns
|
||||
// If the column is in the set the column is not filtered and is shown
|
||||
ShownColumnsSet m_shownColumns;
|
||||
bool m_alreadyRecomputingFilters = false;
|
||||
//asset source name match filter
|
||||
//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<const StringFilter> m_stringFilter;
|
||||
|
||||
+2
-3
@@ -16,7 +16,6 @@ namespace AzToolsFramework
|
||||
AssetBrowserTableModel::AssetBrowserTableModel(QObject* parent /* = nullptr */)
|
||||
: QSortFilterProxyModel(parent)
|
||||
{
|
||||
setDynamicSortFilter(false);
|
||||
}
|
||||
|
||||
void AssetBrowserTableModel::setSourceModel(QAbstractItemModel* sourceModel)
|
||||
@@ -47,7 +46,7 @@ namespace AzToolsFramework
|
||||
|
||||
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()))
|
||||
{
|
||||
return QModelIndex();
|
||||
@@ -132,7 +131,7 @@ namespace AzToolsFramework
|
||||
{
|
||||
QModelIndex index = model->index(currentRow, 0, parent);
|
||||
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 ||
|
||||
entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Product)
|
||||
{
|
||||
|
||||
+1
-2
@@ -21,8 +21,7 @@ namespace AzToolsFramework
|
||||
class AssetBrowserFilterModel;
|
||||
class AssetBrowserEntry;
|
||||
|
||||
class AssetBrowserTableModel
|
||||
: public QSortFilterProxyModel
|
||||
class AssetBrowserTableModel : public QSortFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
+65
-2
@@ -9,9 +9,11 @@
|
||||
#include <AzCore/UserSettings/UserSettings.h>
|
||||
|
||||
#include <AzQtComponents/Components/DockBar.h>
|
||||
#include <AzCore/Console/IConsole.h>
|
||||
|
||||
#include <AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserModel.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetSelectionModel.h>
|
||||
@@ -26,6 +28,11 @@ AZ_PUSH_DISABLE_WARNING(4251 4244, "-Wunknown-warning-option") // disable warnin
|
||||
#include <QTimer>
|
||||
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 AssetBrowser
|
||||
@@ -34,6 +41,7 @@ namespace AzToolsFramework
|
||||
: QDialog(parent)
|
||||
, m_ui(new Ui::AssetPickerDialogClass())
|
||||
, m_filterModel(new AssetBrowserFilterModel(parent))
|
||||
, m_tableModel(new AssetBrowserTableModel(parent))
|
||||
, m_selection(selection)
|
||||
, 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_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);
|
||||
SelectionChangedSlot();
|
||||
}
|
||||
@@ -134,6 +192,7 @@ namespace AzToolsFramework
|
||||
{
|
||||
m_ui->m_assetBrowserTreeViewWidget->expandAll();
|
||||
});
|
||||
m_tableModel->UpdateTableModelMaps();
|
||||
}
|
||||
|
||||
if (m_hasFilter && !hasFilter)
|
||||
@@ -166,7 +225,8 @@ namespace AzToolsFramework
|
||||
|
||||
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
|
||||
if (selectedAssets.empty())
|
||||
{
|
||||
@@ -197,7 +257,10 @@ namespace AzToolsFramework
|
||||
|
||||
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)
|
||||
{
|
||||
m_ui->m_previewerFrame->Clear();
|
||||
|
||||
+2
@@ -33,6 +33,7 @@ namespace AzToolsFramework
|
||||
{
|
||||
class ProductAssetBrowserEntry;
|
||||
class AssetBrowserFilterModel;
|
||||
class AssetBrowserTableModel;
|
||||
class AssetBrowserModel;
|
||||
class AssetSelectionModel;
|
||||
|
||||
@@ -69,6 +70,7 @@ namespace AzToolsFramework
|
||||
QScopedPointer<Ui::AssetPickerDialogClass> m_ui;
|
||||
AssetBrowserModel* m_assetBrowserModel = nullptr;
|
||||
QScopedPointer<AssetBrowserFilterModel> m_filterModel;
|
||||
QScopedPointer<AssetBrowserTableModel> m_tableModel;
|
||||
AssetSelectionModel& m_selection;
|
||||
bool m_hasFilter;
|
||||
AZStd::unique_ptr<TreeViewState> m_filterStateSaver;
|
||||
|
||||
+8
@@ -142,6 +142,9 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="AzToolsFramework::AssetBrowser::AssetBrowserTableView" name="m_assetBrowserTableViewWidget"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="verticalLayoutWidget">
|
||||
@@ -197,6 +200,11 @@
|
||||
<header>AzToolsFramework/AssetBrowser/Previewer/PreviewerFrame.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>AzToolsFramework::AssetBrowser::AssetBrowserTableView</class>
|
||||
<extends>QTableView</extends>
|
||||
<header>AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
||||
-1
@@ -53,7 +53,6 @@ namespace AzToolsFramework
|
||||
// AssetBrowserComponentNotificationBus
|
||||
void OnAssetBrowserComponentReady() override;
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Q_SIGNALS:
|
||||
void selectionChangedSignal(const QItemSelection& selected, const QItemSelection& deselected);
|
||||
void ClearStringFilter();
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace ScriptCanvasEditor
|
||||
{
|
||||
setDynamicSortFilter(true);
|
||||
|
||||
m_showColumn.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::DisplayName));
|
||||
m_shownColumns.insert(aznumeric_cast<int>(AssetBrowserEntry::Column::DisplayName));
|
||||
|
||||
UnitTestWidgetNotificationBus::Handler::BusConnect();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user