@@ -34,5 +34,91 @@ bool SearchFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &
3434
3535 QString searchPatternDelBlank = searchPattern.pattern ().toLower ().remove (" " );
3636
37- return displayName.contains (searchPatternDelBlank) || nameCopy.contains (searchPatternDelBlank) || transliterated.contains (searchPatternDelBlank) || jianpin.contains (searchPatternDelBlank);
37+ // Get first letters of each word in displayName
38+ QStringList words = displayName.split (" " , Qt::SkipEmptyParts);
39+ QString nameFirstLetters;
40+ for (const QString &word : words) {
41+ if (!word.isEmpty ()) {
42+ QChar firstChar = word[0 ];
43+ if (firstChar.isLetter ()) {
44+ nameFirstLetters += firstChar.toLower ();
45+ }
46+ }
47+ }
48+
49+ // Check for number or English prefix matches only
50+ QRegularExpression searchNumberCheck (" \\ d+$" );
51+ QRegularExpression searchEnglishCheck (" ^[a-zA-Z\\ s]+$" );
52+ bool isNumberSearch = searchNumberCheck.match (searchPatternDelBlank).hasMatch ();
53+ bool isEnglishSearch = searchEnglishCheck.match (searchPattern.pattern ()).hasMatch ();
54+
55+ if (isNumberSearch || isEnglishSearch) {
56+ bool hasMatch = false ;
57+
58+ // Handle number prefix matching
59+ if (isNumberSearch) {
60+ QRegularExpression numberRegex (" \\ d+" );
61+ QRegularExpressionMatchIterator matches = numberRegex.globalMatch (displayName);
62+
63+ while (matches.hasNext ()) {
64+ QRegularExpressionMatch match = matches.next ();
65+ QString numberInDisplayName = match.captured (0 );
66+ hasMatch = true ;
67+ if (numberInDisplayName.startsWith (searchPatternDelBlank)) {
68+ return true ;
69+ }
70+ }
71+ }
72+
73+ // Handle English prefix matching
74+ if (isEnglishSearch) {
75+ // Remove spaces and convert to lowercase for comparison
76+ QString displayNameLower = displayName.toLower ().remove (" " );
77+
78+ // Check prefix matching for various name formats
79+ if (displayNameLower.startsWith (searchPatternDelBlank) ||
80+ nameCopy.startsWith (searchPatternDelBlank) ||
81+ transliterated.startsWith (searchPatternDelBlank) ||
82+ jianpin.startsWith (searchPatternDelBlank) ||
83+ nameFirstLetters.startsWith (searchPatternDelBlank)) {
84+ return true ;
85+ }
86+
87+ // Also check if search pattern matches the prefix of any word in displayName
88+ for (const QString &word : words) {
89+ if (word.toLower ().startsWith (searchPatternDelBlank)) {
90+ return true ;
91+ }
92+ }
93+
94+ // Also check if search pattern matches the prefix of any word in name
95+ QStringList nameWords = name.split (" " , Qt::SkipEmptyParts);
96+ for (const QString &word : nameWords) {
97+ if (word.toLower ().startsWith (searchPatternDelBlank)) {
98+ return true ;
99+ }
100+ }
101+
102+ // Also check if search pattern matches the prefix of any word in transliterated
103+ QStringList transliteratedWords = transliterated.split (" " , Qt::SkipEmptyParts);
104+ for (const QString &word : transliteratedWords) {
105+ if (word.toLower ().startsWith (searchPatternDelBlank)) {
106+ return true ;
107+ }
108+ }
109+
110+ hasMatch = true ; // English content was found
111+ }
112+
113+ // If we had matches but none were prefix matches, return false
114+ if (hasMatch) {
115+ return false ;
116+ }
117+ }
118+
119+ return displayName.contains (searchPatternDelBlank) ||
120+ nameCopy.contains (searchPatternDelBlank) ||
121+ transliterated.contains (searchPatternDelBlank) ||
122+ jianpin.contains (searchPatternDelBlank) ||
123+ nameFirstLetters.contains (searchPatternDelBlank);
38124}
0 commit comments