diff --git a/qrenderdoc/Code/QRDUtils.cpp b/qrenderdoc/Code/QRDUtils.cpp index 7f3d45b2e..adf169834 100644 --- a/qrenderdoc/Code/QRDUtils.cpp +++ b/qrenderdoc/Code/QRDUtils.cpp @@ -25,6 +25,7 @@ #include "QRDUtils.h" #include #include +#include #include #include #include @@ -1128,6 +1129,24 @@ bool QFileFilterModel::filterAcceptsRow(int source_row, const QModelIndex &sourc return true; } +QCollatorSortFilterProxyModel::QCollatorSortFilterProxyModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ + m_collator = new QCollator(); +} + +QCollatorSortFilterProxyModel::~QCollatorSortFilterProxyModel() +{ + delete m_collator; +} + +bool QCollatorSortFilterProxyModel::lessThan(const QModelIndex &source_left, + const QModelIndex &source_right) const +{ + return m_collator->compare(sourceModel()->data(source_left, sortRole()).toString(), + sourceModel()->data(source_right, sortRole()).toString()) < 0; +} + void addGridLines(QGridLayout *grid, QColor gridColor) { QString style = diff --git a/qrenderdoc/Code/QRDUtils.h b/qrenderdoc/Code/QRDUtils.h index 6a6dd6238..2b4a1a3d4 100644 --- a/qrenderdoc/Code/QRDUtils.h +++ b/qrenderdoc/Code/QRDUtils.h @@ -328,6 +328,25 @@ private: QDir::Filters m_requireMask, m_excludeMask; }; +class QCollator; + +class QCollatorSortFilterProxyModel : public QSortFilterProxyModel +{ + Q_OBJECT + +public: + explicit QCollatorSortFilterProxyModel(QObject *parent = Q_NULLPTR); + ~QCollatorSortFilterProxyModel(); + + QCollator *collator() { return m_collator; } +protected: + virtual bool lessThan(const QModelIndex &source_left, + const QModelIndex &source_right) const override; + +private: + QCollator *m_collator; +}; + // Simple QStyledItemDelegate child that will either forward to an external delegate (allowing // chaining) or to the base implementation. Delegates can derive from this and specialise a couple // of functions to still be able to chain diff --git a/qrenderdoc/Windows/ResourceInspector.cpp b/qrenderdoc/Windows/ResourceInspector.cpp index 383785540..9fc1f6f73 100644 --- a/qrenderdoc/Windows/ResourceInspector.cpp +++ b/qrenderdoc/Windows/ResourceInspector.cpp @@ -23,6 +23,7 @@ ******************************************************************************/ #include "ResourceInspector.h" +#include #include #include "3rdparty/toolwindowmanager/ToolWindowManagerArea.h" #include "Widgets/Extended/RDHeaderView.h" @@ -110,10 +111,13 @@ ResourceInspector::ResourceInspector(ICaptureContext &ctx, QWidget *parent) m_ResourceModel = new ResourceListItemModel(this, m_Ctx); - m_FilterModel = new QSortFilterProxyModel(this); + m_FilterModel = new QCollatorSortFilterProxyModel(this); m_FilterModel->setSourceModel(m_ResourceModel); m_FilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_FilterModel->setFilterRole(FilterRole); + m_FilterModel->sort(0); + m_FilterModel->collator()->setNumericMode(true); + m_FilterModel->collator()->setCaseSensitivity(Qt::CaseInsensitive); ui->resourceList->setModel(m_FilterModel); diff --git a/qrenderdoc/Windows/ResourceInspector.h b/qrenderdoc/Windows/ResourceInspector.h index f82c67958..d53951ffd 100644 --- a/qrenderdoc/Windows/ResourceInspector.h +++ b/qrenderdoc/Windows/ResourceInspector.h @@ -85,5 +85,5 @@ private: ResourceId m_Resource; ResourceListItemModel *m_ResourceModel; int m_ResourceCacheID = -1; - QSortFilterProxyModel *m_FilterModel; + QCollatorSortFilterProxyModel *m_FilterModel; };