Fix some lexical sorting of names with numbers

This commit is contained in:
GriffinR 2025-01-30 11:53:00 -05:00
parent 09694891f3
commit 9bdf396679
7 changed files with 54 additions and 25 deletions

View File

@ -3,15 +3,28 @@
#include <QSortFilterProxyModel>
class FilterChildrenProxyModel : public QSortFilterProxyModel
class NumericSortProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
explicit FilterChildrenProxyModel(QObject *parent = nullptr);
void setHideEmpty(bool hidden) { this->hideEmpty = hidden; }
explicit NumericSortProxyModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {};
protected:
bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const;
virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
};
class FilterChildrenProxyModel : public NumericSortProxyModel
{
Q_OBJECT
public:
explicit FilterChildrenProxyModel(QObject *parent = nullptr) : NumericSortProxyModel(parent) {};
void setHideEmpty(bool hidden) { this->hideEmpty = hidden; }
protected:
virtual bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const override;
private:
bool hideEmpty = false;
};

View File

@ -79,7 +79,6 @@ protected:
QString activeItemName;
QString folderTypeName;
bool sortingEnabled = false;
bool editable = false;
QIcon mapGrayIcon;

View File

@ -2,9 +2,24 @@
#define WILDMONSEARCH_H
#include <QDialog>
#include <QTableWidgetItem>
#include <QCollator>
class Project;
class NumericSortTableItem : public QTableWidgetItem
{
public:
explicit NumericSortTableItem(const QString &text) : QTableWidgetItem(text) {};
protected:
virtual bool operator<(const QTableWidgetItem &other) const override {
QCollator collator;
collator.setNumericMode(true);
return collator.compare(text(), other.text()) < 0;
}
};
namespace Ui {
class WildMonSearch;
}

View File

@ -1113,11 +1113,15 @@ bool MainWindow::setProjectUI() {
this->locationListProxyModel = new FilterChildrenProxyModel();
locationListProxyModel->setSourceModel(this->mapLocationModel);
ui->locationList->setModel(locationListProxyModel);
ui->locationList->setSortingEnabled(true);
ui->locationList->sortByColumn(0, Qt::SortOrder::AscendingOrder);
this->layoutTreeModel = new LayoutTreeModel(editor->project);
this->layoutListProxyModel = new FilterChildrenProxyModel();
this->layoutListProxyModel->setSourceModel(this->layoutTreeModel);
ui->layoutList->setModel(layoutListProxyModel);
ui->layoutList->setSortingEnabled(true);
ui->layoutList->sortByColumn(0, Qt::SortOrder::AscendingOrder);
return true;
}

View File

@ -1,10 +1,6 @@
#include "filterchildrenproxymodel.h"
FilterChildrenProxyModel::FilterChildrenProxyModel(QObject *parent) :
QSortFilterProxyModel(parent)
{
}
#include <QCollator>
bool FilterChildrenProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
@ -42,3 +38,16 @@ bool FilterChildrenProxyModel::filterAcceptsRow(int source_row, const QModelInde
// parent call for initial behaviour
return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
}
bool NumericSortProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const {
QVariant l = (source_left.model() ? source_left.model()->data(source_left, sortRole()) : QVariant());
QVariant r = (source_right.model() ? source_right.model()->data(source_right, sortRole()) : QVariant());
if (l.canConvert<QString>() && r.canConvert<QString>()) {
// We need to override lexical comparison of strings to do a numeric sort.
QCollator collator;
collator.setNumericMode(true);
return collator.compare(l.toString(), r.toString()) < 0;
}
return QSortFilterProxyModel::lessThan(source_left, source_right);
}

View File

@ -135,9 +135,6 @@ QStandardItem *MapListModel::insertMapItem(const QString &mapName, const QString
if (folder) {
folder->appendRow(map);
}
if (this->sortingEnabled)
this->sort(0, Qt::AscendingOrder);
return map;
}
@ -147,8 +144,6 @@ QStandardItem *MapListModel::insertMapFolderItem(const QString &folderName) {
QStandardItem *item = createMapFolderItem(folderName);
this->root->appendRow(item);
if (this->sortingEnabled)
this->sort(0, Qt::AscendingOrder);
return item;
}
@ -432,9 +427,6 @@ MapLocationModel::MapLocationModel(Project *project, QObject *parent) : MapListM
for (const auto &mapName : this->project->mapNames) {
insertMapItem(mapName, this->project->mapNameToMapSectionName.value(mapName));
}
this->sortingEnabled = true;
sort(0, Qt::AscendingOrder);
}
void MapLocationModel::removeItem(QStandardItem *item) {
@ -459,9 +451,6 @@ LayoutTreeModel::LayoutTreeModel(Project *project, QObject *parent) : MapListMod
for (const auto &mapName : this->project->mapNames) {
insertMapItem(mapName, this->project->mapNameToLayoutId.value(mapName));
}
this->sortingEnabled = true;
sort(0, Qt::AscendingOrder);
}
void LayoutTreeModel::removeItem(QStandardItem *) {

View File

@ -58,13 +58,13 @@ void WildMonSearch::addTableEntry(const RowData &rowData) {
int row = ui->table_Results->rowCount();
ui->table_Results->insertRow(row);
auto groupItem = new QTableWidgetItem(rowData.groupName);
auto groupItem = new NumericSortTableItem(rowData.groupName);
groupItem->setData(ResultsDataRole::MapName, rowData.mapName);
ui->table_Results->setItem(row, ResultsColumn::Group, groupItem);
ui->table_Results->setItem(row, ResultsColumn::Field, new QTableWidgetItem(rowData.fieldName));
ui->table_Results->setItem(row, ResultsColumn::Level, new QTableWidgetItem(rowData.levelRange));
ui->table_Results->setItem(row, ResultsColumn::Chance, new QTableWidgetItem(rowData.chance));
ui->table_Results->setItem(row, ResultsColumn::Field, new NumericSortTableItem(rowData.fieldName));
ui->table_Results->setItem(row, ResultsColumn::Level, new NumericSortTableItem(rowData.levelRange));
ui->table_Results->setItem(row, ResultsColumn::Chance, new NumericSortTableItem(rowData.chance));
}
QList<WildMonSearch::RowData> WildMonSearch::search(const QString &species) const {