diff --git a/qrenderdoc/Windows/ResourceInspector.cpp b/qrenderdoc/Windows/ResourceInspector.cpp index 120ed87e5..1f965fc93 100644 --- a/qrenderdoc/Windows/ResourceInspector.cpp +++ b/qrenderdoc/Windows/ResourceInspector.cpp @@ -33,6 +33,7 @@ static const int ResourceIdRole = Qt::UserRole; static const int FilterRole = Qt::UserRole + 1; +static const int LastAccessSortRole = Qt::UserRole + 2; class ResourceListItemModel : public QAbstractItemModel { @@ -48,6 +49,13 @@ public: emit endResetModel(); } + void bumpLastUse(ResourceId id) { m_LastUse[id] = ++m_LastUseIdx; } + void resetLastUse() + { + m_LastUseIdx = 1; + m_LastUse.clear(); + } + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override { if(row < 0 || row >= rowCount()) @@ -88,6 +96,9 @@ public: if(role == FilterRole) return ToQStr(desc.type) + lit(" ") + m_Ctx.GetResourceName(desc.resourceId); + + if(role == LastAccessSortRole) + return m_LastUse[desc.resourceId]; } } @@ -96,8 +107,34 @@ public: private: ICaptureContext &m_Ctx; + + QMap m_LastUse; + uint32_t m_LastUseIdx = 1; }; +bool ResourceSorterModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const +{ + if(m_Sort == SortType::Creation) + { + return source_left.data(ResourceIdRole).value() < + source_right.data(ResourceIdRole).value(); + } + else if(m_Sort == SortType::LastAccess) + { + uint a = source_left.data(LastAccessSortRole).toUInt(); + uint b = source_right.data(LastAccessSortRole).toUInt(); + + // if they're different, sort by access. Otherwise fall through to alphabetical + // we invert the reason, so that high values (recent access) are first + if(a != b) + return a > b; + + return QCollatorSortFilterProxyModel::lessThan(source_left, source_right); + } + + return QCollatorSortFilterProxyModel::lessThan(source_left, source_right); +} + ResourceInspector::ResourceInspector(ICaptureContext &ctx, QWidget *parent) : QFrame(parent), ui(new Ui::ResourceInspector), m_Ctx(ctx) { @@ -113,7 +150,7 @@ ResourceInspector::ResourceInspector(ICaptureContext &ctx, QWidget *parent) m_ResourceModel = new ResourceListItemModel(this, m_Ctx); - m_FilterModel = new QCollatorSortFilterProxyModel(this); + m_FilterModel = new ResourceSorterModel(this); m_FilterModel->setSourceModel(m_ResourceModel); m_FilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_FilterModel->setFilterRole(FilterRole); @@ -121,6 +158,10 @@ ResourceInspector::ResourceInspector(ICaptureContext &ctx, QWidget *parent) m_FilterModel->collator()->setNumericMode(true); m_FilterModel->collator()->setCaseSensitivity(Qt::CaseInsensitive); + ui->sortType->addItems( + {tr("Sort alphabetically"), tr("Sort by creation time"), tr("Sort by recently viewed")}); + ui->sortType->adjustSize(); + ui->resourceList->setModel(m_FilterModel); m_ChunksModel = new StructuredDataItemModel(this); @@ -193,6 +234,8 @@ ResourceInspector::ResourceInspector(ICaptureContext &ctx, QWidget *parent) vertical->addWidget(ui->titleWidget); vertical->addWidget(ui->dockarea); + ui->resourceListFilter->setPlaceholderText(tr("Filter...")); + Inspect(ResourceId()); m_Ctx.AddCaptureViewer(this); @@ -229,6 +272,11 @@ void ResourceInspector::Inspect(ResourceId id) m_ResourceModel->reset(); } + m_ResourceModel->bumpLastUse(id); + + m_FilterModel->invalidate(); + m_FilterModel->sort(0); + if(m_Ctx.HasResourceCustomName(id)) ui->resetName->show(); else @@ -420,6 +468,7 @@ void ResourceInspector::OnCaptureClosed() ui->viewContents->hide(); m_ResourceModel->reset(); + m_ResourceModel->resetLastUse(); m_ChunksModel->setObjects({}); ui->initChunks->clearInternalExpansions(); @@ -493,6 +542,11 @@ void ResourceInspector::on_resetName_clicked() Inspect(id); } +void ResourceInspector::on_sortType_currentIndexChanged(int index) +{ + m_FilterModel->setSortType((ResourceSorterModel::SortType)index); +} + void ResourceInspector::on_cancelResourceListFilter_clicked() { ui->resourceListFilter->setText(QString()); diff --git a/qrenderdoc/Windows/ResourceInspector.h b/qrenderdoc/Windows/ResourceInspector.h index 3d8d0adcf..bffd4155d 100644 --- a/qrenderdoc/Windows/ResourceInspector.h +++ b/qrenderdoc/Windows/ResourceInspector.h @@ -26,6 +26,7 @@ #include #include "Code/Interface/QRDInterface.h" +#include "Code/QRDUtils.h" namespace Ui { @@ -39,6 +40,39 @@ class ResourceListItemModel; class StructuredDataItemModel; class RichTextViewDelegate; +class ResourceSorterModel : public QCollatorSortFilterProxyModel +{ + Q_OBJECT + +public: + enum SortType + { + Alphabetical = 0, + Creation, + LastAccess, + }; + explicit ResourceSorterModel(QObject *parent = Q_NULLPTR) : QCollatorSortFilterProxyModel(parent) + { + } + virtual ~ResourceSorterModel() {} + void setSortType(SortType type) + { + if(m_Sort != type) + { + m_Sort = type; + invalidate(); + sort(0); + } + } + +protected: + virtual bool lessThan(const QModelIndex &source_left, + const QModelIndex &source_right) const override; + +private: + SortType m_Sort = SortType::Alphabetical; +}; + class ResourceInspector : public QFrame, public IResourceInspector, public ICaptureViewer { Q_OBJECT @@ -62,6 +96,7 @@ public slots: void on_renameResource_clicked(); void on_resourceNameEdit_keyPress(QKeyEvent *event); void on_resetName_clicked(); + void on_sortType_currentIndexChanged(int index); void on_cancelResourceListFilter_clicked(); void on_resourceListFilter_textChanged(const QString &text); @@ -89,7 +124,7 @@ private: ResourceId m_Resource; ResourceListItemModel *m_ResourceModel; int m_ResourceCacheID = -1; - QCollatorSortFilterProxyModel *m_FilterModel; + ResourceSorterModel *m_FilterModel; StructuredDataItemModel *m_ChunksModel; RichTextViewDelegate *m_delegate; }; diff --git a/qrenderdoc/Windows/ResourceInspector.ui b/qrenderdoc/Windows/ResourceInspector.ui index 8d4826dd1..a61f8c01f 100644 --- a/qrenderdoc/Windows/ResourceInspector.ui +++ b/qrenderdoc/Windows/ResourceInspector.ui @@ -75,6 +75,9 @@ + + +