diff --git a/include/ui/filterchildrenproxymodel.h b/include/ui/filterchildrenproxymodel.h index 507693b3..93934a7e 100644 --- a/include/ui/filterchildrenproxymodel.h +++ b/include/ui/filterchildrenproxymodel.h @@ -3,15 +3,28 @@ #include -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; }; diff --git a/include/ui/maplistmodels.h b/include/ui/maplistmodels.h index b973f438..681f0955 100644 --- a/include/ui/maplistmodels.h +++ b/include/ui/maplistmodels.h @@ -79,7 +79,6 @@ protected: QString activeItemName; QString folderTypeName; - bool sortingEnabled = false; bool editable = false; QIcon mapGrayIcon; diff --git a/include/ui/wildmonsearch.h b/include/ui/wildmonsearch.h index 49e04b57..ccf0fe94 100644 --- a/include/ui/wildmonsearch.h +++ b/include/ui/wildmonsearch.h @@ -2,9 +2,24 @@ #define WILDMONSEARCH_H #include +#include +#include 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; } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index bf9a91e8..3348796a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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; } diff --git a/src/ui/filterchildrenproxymodel.cpp b/src/ui/filterchildrenproxymodel.cpp index 99464ae6..06d7a184 100644 --- a/src/ui/filterchildrenproxymodel.cpp +++ b/src/ui/filterchildrenproxymodel.cpp @@ -1,10 +1,6 @@ #include "filterchildrenproxymodel.h" -FilterChildrenProxyModel::FilterChildrenProxyModel(QObject *parent) : - QSortFilterProxyModel(parent) -{ - -} +#include 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() && r.canConvert()) { + // 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); +} diff --git a/src/ui/maplistmodels.cpp b/src/ui/maplistmodels.cpp index d08bb2cf..0d42b896 100644 --- a/src/ui/maplistmodels.cpp +++ b/src/ui/maplistmodels.cpp @@ -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 *) { diff --git a/src/ui/wildmonsearch.cpp b/src/ui/wildmonsearch.cpp index 684d2947..71e5ceed 100644 --- a/src/ui/wildmonsearch.cpp +++ b/src/ui/wildmonsearch.cpp @@ -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::search(const QString &species) const {