Fix sorting of advanced attribute list (#10091)

Sort advanced attribute list using locale aware sort.

Fixes #6175
This commit is contained in:
Marco Langer 2025-02-01 17:59:53 +01:00 committed by GitHub
parent 811887e591
commit 8ca90a070a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 19 additions and 2 deletions

View File

@ -24,6 +24,7 @@ EntryAttributesModel::EntryAttributesModel(QObject* parent)
, m_entryAttributes(nullptr)
, m_nextRenameDataChange(false)
{
m_collator.setNumericMode(true);
}
void EntryAttributesModel::setEntryAttributes(EntryAttributes* entryAttributes)
@ -150,7 +151,7 @@ void EntryAttributesModel::attributeAboutToAdd(const QString& key)
{
QList<QString> rows = m_attributes;
rows.append(key);
std::sort(rows.begin(), rows.end());
std::sort(rows.begin(), rows.end(), m_collator);
int row = rows.indexOf(key);
beginInsertRows(QModelIndex(), row, row);
}
@ -180,7 +181,7 @@ void EntryAttributesModel::attributeAboutToRename(const QString& oldKey, const Q
QList<QString> rows = m_attributes;
rows.removeOne(oldKey);
rows.append(newKey);
std::sort(rows.begin(), rows.end());
std::sort(rows.begin(), rows.end(), m_collator);
int newRow = rows.indexOf(newKey);
if (newRow > oldRow) {
newRow++;
@ -232,4 +233,5 @@ void EntryAttributesModel::updateAttributes()
m_attributes.append(key);
}
}
std::sort(m_attributes.begin(), m_attributes.end(), m_collator);
}

View File

@ -19,6 +19,7 @@
#define KEEPASSX_ENTRYATTRIBUTESMODEL_H
#include <QAbstractListModel>
#include <QCollator>
class EntryAttributes;
@ -55,6 +56,7 @@ private:
EntryAttributes* m_entryAttributes;
QList<QString> m_attributes;
bool m_nextRenameDataChange;
QCollator m_collator;
};
#endif // KEEPASSX_ENTRYATTRIBUTESMODEL_H

View File

@ -201,6 +201,9 @@ void TestEntryModel::testAttributesModel()
// make sure these don't generate messages
entryAttributes->set("Title", "test");
entryAttributes->set("UserName", "test");
entryAttributes->set("Password", "test");
entryAttributes->set("URL", "test");
entryAttributes->set("Notes", "test");
QCOMPARE(spyDataChanged.count(), 1);
@ -214,6 +217,16 @@ void TestEntryModel::testAttributesModel()
entryAttributes->set("2nd", value, true);
QVERIFY(entryAttributes->isProtected("2nd"));
QCOMPARE(entryAttributes->value("2nd"), value);
entryAttributes->clear();
// test attribute sorting
entryAttributes->set("Test1", "1");
entryAttributes->set("Test11", "11");
entryAttributes->set("Test2", "2");
QCOMPARE(model->rowCount(), 3);
QCOMPARE(model->data(model->index(0, 0)).toString(), QString("Test1"));
QCOMPARE(model->data(model->index(1, 0)).toString(), QString("Test2"));
QCOMPARE(model->data(model->index(2, 0)).toString(), QString("Test11"));
QSignalSpy spyReset(model, SIGNAL(modelReset()));
entryAttributes->clear();