Working base

This commit is contained in:
igarri
2021-04-28 09:38:43 +01:00
parent d6ed9d100e
commit b7c2495911
7 changed files with 184 additions and 26 deletions
@@ -62,6 +62,7 @@ namespace AzToolsFramework
invalidateFilter();
m_invalidateFilter = false;
}
Q_EMIT entriesUpdated();
}
bool AssetBrowserFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
@@ -162,6 +163,7 @@ namespace AzToolsFramework
{
m_alreadyRecomputingFilters = false;
FilterUpdatedSlotImmediate();
//beginInsertRows()
}
);
}
@@ -53,6 +53,7 @@ namespace AzToolsFramework
Q_SIGNALS:
void filterChanged();
void entriesUpdated();
//////////////////////////////////////////////////////////////////////////
//QSortFilterProxyModel
@@ -6,31 +6,97 @@ namespace AzToolsFramework
AssetBrowserTableModel::AssetBrowserTableModel(QObject* parent /* = nullptr */)
: QSortFilterProxyModel(parent)
{
m_showColumn.insert(static_cast<int>(AssetBrowserEntry::Column::DisplayName));
m_showColumn.insert(static_cast<int>(AssetBrowserEntry::Column::Path));
}
QModelIndex AssetBrowserTableModel::mapToSource(const QModelIndex& proxyIndex) const
{
AZ_UNUSED(proxyIndex);
return QModelIndex();
Q_ASSERT(!proxyIndex.isValid() || proxyIndex.model() == this);
if (!proxyIndex.isValid())
{
return QModelIndex();
}
return m_indexMap[proxyIndex.row()];
}
QModelIndex AssetBrowserTableModel::mapFromSource(const QModelIndex& sourceIndex) const
{
AZ_UNUSED(sourceIndex);
return QModelIndex();
Q_ASSERT(!sourceIndex.isValid() || sourceIndex.model() == sourceModel());
if (!sourceIndex.isValid())
{
return QModelIndex();
}
return createIndex(m_rowMap[sourceIndex], sourceIndex.column(), sourceIndex.internalPointer());
}
QModelIndex AssetBrowserTableModel::index(int row, int column, const QModelIndex& parent) const
{
AZ_UNUSED(row);
AZ_UNUSED(column);
AZ_UNUSED(parent);
//QModelIndex AssetBrowserTableModel::index(int row, int column, const QModelIndex& parent) const
//{
return QModelIndex();
}
// //return parent.isValid() ? QModelIndex() : createIndex(row, column , m_indexMap[row].internalPointer());
// if (!parent.isValid())
// {
// QModelIndex();
// }
// return createIndex(row, column, m_indexMap[row].internalPointer());
//}
QVariant AssetBrowserTableModel::data(const QModelIndex& index, int role) const
{
AZ_UNUSED(index);
AZ_UNUSED(role);
//AZ_UNUSED(role);
auto sourceIndex = mapToSource(index);
if (!sourceIndex.isValid())
return QVariant();
return QVariant();
AssetBrowserEntry* entry = GetAssetEntry(sourceIndex); // static_cast<AssetBrowserEntry*>(sourceIndex.internalPointer());
if (entry == nullptr)
{
AZ_Assert(false, "ERROR - index internal pointer not pointing to an AssetEntry. Tree provided by the AssetBrowser invalid?");
return Qt::PartiallyChecked;
}
return sourceIndex.data(role); //return entry->data(index.column());
//return QVariant::fromValue(entry);
}
bool AssetBrowserTableModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
{
AZ_UNUSED(source_row);
AZ_UNUSED(source_parent);
return true;
}
bool AssetBrowserTableModel::filterAcceptsColumn(int source_column, const QModelIndex&) const
{
return m_showColumn.find(source_column) != m_showColumn.end();
}
int AssetBrowserTableModel::BuildMap(const QAbstractItemModel* model, const QModelIndex& parent, int row)
{
int rows = model ? model->rowCount(parent) : 0;
for (int i = 0; i < rows; ++i)
{
auto index = model->index(i, 0, parent);
m_rowMap[index] = row;
m_indexMap[row] = index;
row = row + 1;
if (model->hasChildren(index))
{
row = BuildMap(model, index, row);
}
}
return row;
}
AssetBrowserEntry* AssetBrowserTableModel::GetAssetEntry(QModelIndex index) const
{
if (index.isValid())
{
return static_cast<AssetBrowserEntry*>(index.internalPointer());
}
else
{
AZ_Error("AssetBrowser", false, "Invalid Source Index provided to GetAssetEntry.");
return nullptr;
}
}
void AssetBrowserTableModel::UpdateMap()
{
BuildMap(sourceModel());
}
} // namespace AssetBrowser
} // namespace AzToolsFramework
@@ -29,8 +29,24 @@ namespace AzToolsFramework
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;
//QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
public Q_SLOTS:
void UpdateMap();
protected:
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override;
bool filterAcceptsColumn(int source_column, const QModelIndex& /*source_parent*/) const override;
private:
int BuildMap(const QAbstractItemModel* model, const QModelIndex& parent = QModelIndex(), int row = 0);
AssetBrowserEntry* GetAssetEntry(QModelIndex index) const;
private:
AZStd::fixed_unordered_set<int, 3, static_cast<int>(AssetBrowserEntry::Column::Count)> m_showColumn;
QMap<int, QModelIndex> m_indexMap;
QMap<QModelIndex, int> m_rowMap;
};
}
}
@@ -1,5 +1,34 @@
#include "AssetBrowserTableView.h"
#include <API/EditorAssetSystemAPI.h>
#include <AzCore/Asset/AssetManagerBus.h>
#include <AzCore/Math/Crc.h>
#include <AzCore/std/containers/vector.h>
#include <AzFramework/StringFunc/StringFunc.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserModel.h>
#include <AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntryCache.h>
#include <AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.h>
#include <AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.h>
#include <AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h>
#include <AzToolsFramework/AssetBrowser/Views/EntryDelegate.h>
#include <AzToolsFramework/Thumbnails/SourceControlThumbnail.h>
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
AZ_PUSH_DISABLE_WARNING(
4244 4251 4800, "-Wunknown-warning-option") // conversion from 'int' to 'float', possible loss of data, needs to have dll-interface to
// be used by clients of class 'QFlags<QPainter::RenderHint>::Int': forcing value to bool
// 'true' or 'false' (performance warning)
#include <QCoreApplication>
#include <QHeaderView>
#include <QMenu>
#include <QMouseEvent>
#include <QPainter>
#include <QPen>
#include <QTimer>
AZ_POP_DISABLE_WARNING
#pragma optimize("", off)
namespace AzToolsFramework
{
@@ -7,7 +36,19 @@ namespace AzToolsFramework
{
AssetBrowserTableView::AssetBrowserTableView(QWidget* parent)
: QTableView(parent)
, m_delegate(new EntryDelegate(this))
{
setSortingEnabled(true);
setItemDelegate(m_delegate);
// header()->hide();
setContextMenuPolicy(Qt::CustomContextMenu);
setMouseTracking(true);
connect(this, &QTableView::customContextMenuRequested, this, &AssetBrowserTableView::OnContextMenu);
//connect(m_scTimer, &QTimer::timeout, this, &AssetBrowserTreeView::OnUpdateSCThumbnailsList);
AssetBrowserViewRequestBus::Handler::BusConnect();
AssetBrowserComponentNotificationBus::Handler::BusConnect();
}
@@ -18,9 +59,9 @@ namespace AzToolsFramework
}
void AssetBrowserTableView::setModel(QAbstractItemModel* model)
{
//m_assetBrowserSortFilterProxyModel = qobject_cast<AssetBrowserTableFilterModel*>(model);
//AZ_Assert(m_assetBrowserSortFilterProxyModel, "Expecting AssetBrowserTableFilterModel");
//m_assetBrowserModel = qobject_cast<AssetBrowserModel*>(m_assetBrowserSortFilterProxyModel->sourceModel());
m_sourceModel = qobject_cast<AssetBrowserTableModel*>(model);
AZ_Assert(m_sourceModel, "Expecting AssetBrowserTableModel");
m_sourceFilterModel = qobject_cast<AssetBrowserFilterModel*>(m_sourceModel->sourceModel());
QTableView::setModel(model);
}
void AssetBrowserTableView::SetName(const QString& name)
@@ -54,11 +95,30 @@ namespace AzToolsFramework
void AssetBrowserTableView::Update()
{
update();
}
//void AssetBrowserTableView::OnAssetBrowserComponentReady()
//{
//}
void AssetBrowserTableView::OnAssetBrowserComponentReady()
{
}
void AssetBrowserTableView::OnContextMenu(const QPoint& point)
{
AZ_UNUSED(point);
auto selectedAssets = GetSelectedAssets();
if (selectedAssets.size() != 1)
{
return;
}
QMenu menu(this);
AssetBrowserInteractionNotificationBus::Broadcast(&AssetBrowserInteractionNotificationBus::Events::AddContextMenuActions, this, &menu, selectedAssets);
if (!menu.isEmpty())
{
menu.exec(QCursor::pos());
}
}
} // namespace AssetBrowser
} // namespace AzToolsFramework
#pragma optimize("", on)
@@ -5,7 +5,7 @@
#include <AzCore/std/containers/vector.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
//#include <AzToolsFramework/AssetBrowser/AssetBrowserTableFilterModel.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h>
#include <QModelIndex>
#include <QPointer>
@@ -17,7 +17,7 @@ namespace AzToolsFramework
namespace AssetBrowser
{
class AssetBrowserEntry;
class AssetBrowserModel;
class AssetBrowserTableModel;
class AssetBrowserFilterModel;
class EntryDelegate;
@@ -45,11 +45,20 @@ namespace AzToolsFramework
//////////////////////////////////////////////////////////////////////////
// AssetBrowserComponentNotificationBus
//void OnAssetBrowserComponentReady() override;
void OnAssetBrowserComponentReady() override;
//////////////////////////////////////////////////////////////////////////
private Q_SLOTS:
void OnContextMenu(const QPoint& point);
//! Get all visible source entries and place them in a queue to update their source control status
//void OnUpdateSCThumbnailsList();
private:
QString m_name;
QPointer<AssetBrowserFilterModel> m_sourceFilterModel = nullptr;
QPointer<AssetBrowserTableModel> m_sourceModel = nullptr;
EntryDelegate* m_delegate = nullptr;
};
} // namespace AssetBrowser
@@ -78,13 +78,17 @@ AzAssetBrowserWindow::AzAssetBrowserWindow(QWidget* parent)
m_filterModel->setSourceModel(m_assetBrowserModel);
m_filterModel->SetFilter(m_ui->m_searchWidget->GetFilter());
m_tableModel->setFilterRole(Qt::DisplayRole);
m_tableModel->setSourceModel(m_filterModel.data());
//m_tableModel->setSourceModel(m_assetBrowserModel);
m_ui->m_assetBrowserTreeViewWidget->setModel(m_filterModel.data());
m_ui->m_assetBrowserTableViewWidget->setModel(m_tableModel.data());
m_ui->m_assetBrowserTableViewWidget->setVisible(false);
connect(m_filterModel.data(), &AssetBrowserFilterModel::entriesUpdated, m_tableModel.data(), &AssetBrowserTableModel::UpdateMap);
connect(m_ui->m_searchWidget->GetFilter().data(), &AssetBrowserEntryFilter::updatedSignal,
m_filterModel.data(), &AssetBrowserFilterModel::filterUpdatedSlot);
connect(m_filterModel.data(), &AssetBrowserFilterModel::filterChanged, this, [this]()