diff --git a/src/models/categorizedsortproxymodel.cpp b/src/models/categorizedsortproxymodel.cpp index 9686010e..6daa71d0 100644 --- a/src/models/categorizedsortproxymodel.cpp +++ b/src/models/categorizedsortproxymodel.cpp @@ -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);