Skip to content

Commit

Permalink
feat: alphabet sort order, non-ascii appears first
Browse files Browse the repository at this point in the history
字母排序顺序调整:

0. 读音首字母相同则在同一组内,否则按读音首字母排序
1. 同组内,显示名称首个字符为非字母的,优先显示
2. 上述前提下,按读音进行排序

Log:
  • Loading branch information
BLumia committed Nov 9, 2023
1 parent ca0c0f4 commit 97c4f8e
Showing 1 changed file with 19 additions and 5 deletions.
24 changes: 19 additions & 5 deletions src/models/categorizedsortproxymodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,25 @@ bool CategorizedSortProxyModel::lessThan(const QModelIndex &source_left, const Q
if (sortRole() == AppsModel::TransliteratedRole) {
QString l_transliterated = source_left.model()->data(source_left, sortRole()).toString();
QString r_transliterated = source_right.model()->data(source_right, sortRole()).toString();
QString l_prepend = l_transliterated.isEmpty() ? QString() : l_transliterated.constData()[0].toUpper();
QString r_prepend = r_transliterated.isEmpty() ? QString() : r_transliterated.constData()[0].toUpper();
QString l_concat = l_prepend + source_left.model()->data(source_left, Qt::DisplayRole).toString();
QString r_concat = r_prepend + source_right.model()->data(source_right, Qt::DisplayRole).toString();
return l_concat < r_concat;
QChar l_start = l_transliterated.isEmpty() ? QChar() : l_transliterated.constData()[0].toUpper();
QChar r_start = r_transliterated.isEmpty() ? QChar() : r_transliterated.constData()[0].toUpper();
if (l_start != r_start) {
return l_start < r_start;
} else {
QString l_display = source_left.model()->data(source_left, Qt::DisplayRole).toString();
QString r_display = source_right.model()->data(source_right, Qt::DisplayRole).toString();
QChar ld_start = l_display.isEmpty() ? QChar() : l_display.constData()[0].toUpper();
QChar rd_start = r_display.isEmpty() ? QChar() : r_display.constData()[0].toUpper();
if ((l_start == ld_start && ld_start == rd_start) || (l_start != ld_start && l_start != rd_start)) {
// display name both start with ascii letter, or both NOT start with ascii letter
// use their transliterated form for sorting
return l_transliterated < r_transliterated;
} else {
// one of them are ascii letter and another of them is non-ascii letter.
// the non-ascii one should be display on the front
return l_start != ld_start;
}
}
}

return QSortFilterProxyModel::lessThan(source_left, source_right);
Expand Down

0 comments on commit 97c4f8e

Please sign in to comment.