mirror of
https://github.com/huderlem/porymap.git
synced 2026-07-19 08:53:52 -05:00
Fix some lexical sorting of names with numbers
This commit is contained in:
parent
09694891f3
commit
9bdf396679
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -79,7 +79,6 @@ protected:
|
|||
|
||||
QString activeItemName;
|
||||
QString folderTypeName;
|
||||
bool sortingEnabled = false;
|
||||
bool editable = false;
|
||||
|
||||
QIcon mapGrayIcon;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 *) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user