@@ -82,6 +82,7 @@ use crate::base::{
8282
8383use self :: { room:: RoomState , welcome:: WelcomeState } ;
8484use crate :: message:: MessageTimeStamp ;
85+ use feruca:: Collator ;
8586
8687pub mod room;
8788pub mod welcome;
@@ -170,7 +171,12 @@ fn user_cmp(a: &MemberItem, b: &MemberItem, field: &SortFieldUser) -> Ordering {
170171 }
171172}
172173
173- fn room_cmp < T : RoomLikeItem > ( a : & T , b : & T , field : & SortFieldRoom ) -> Ordering {
174+ fn room_cmp < T : RoomLikeItem > (
175+ a : & T ,
176+ b : & T ,
177+ field : & SortFieldRoom ,
178+ collator : & mut Collator ,
179+ ) -> Ordering {
174180 match field {
175181 SortFieldRoom :: Favorite => {
176182 let fava = a. has_tag ( TagName :: Favorite ) ;
@@ -186,7 +192,7 @@ fn room_cmp<T: RoomLikeItem>(a: &T, b: &T, field: &SortFieldRoom) -> Ordering {
186192 // If a has LowPriority and b doesn't, it should sort later in room list.
187193 lowa. cmp ( & lowb)
188194 } ,
189- SortFieldRoom :: Name => a. name ( ) . cmp ( b. name ( ) ) ,
195+ SortFieldRoom :: Name => collator . collate ( a. name ( ) , b. name ( ) ) ,
190196 SortFieldRoom :: Alias => some_cmp ( a. alias ( ) , b. alias ( ) , Ord :: cmp) ,
191197 SortFieldRoom :: RoomId => a. room_id ( ) . cmp ( b. room_id ( ) ) ,
192198 SortFieldRoom :: Unread => {
@@ -209,17 +215,18 @@ fn room_fields_cmp<T: RoomLikeItem>(
209215 a : & T ,
210216 b : & T ,
211217 fields : & [ SortColumn < SortFieldRoom > ] ,
218+ collator : & mut Collator ,
212219) -> Ordering {
213220 for SortColumn ( field, order) in fields {
214- match ( room_cmp ( a, b, field) , order) {
221+ match ( room_cmp ( a, b, field, collator ) , order) {
215222 ( Ordering :: Equal , _) => continue ,
216223 ( o, SortOrder :: Ascending ) => return o,
217224 ( o, SortOrder :: Descending ) => return o. reverse ( ) ,
218225 }
219226 }
220227
221228 // Break ties on ascending room id.
222- room_cmp ( a, b, & SortFieldRoom :: RoomId )
229+ room_cmp ( a, b, & SortFieldRoom :: RoomId , collator )
223230}
224231
225232fn user_fields_cmp (
@@ -516,7 +523,8 @@ impl WindowOps<IambInfo> for IambWindow {
516523 . map ( |room_info| DirectItem :: new ( room_info, store) )
517524 . collect :: < Vec < _ > > ( ) ;
518525 let fields = & store. application . settings . tunables . sort . dms ;
519- items. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
526+ let collator = & mut store. application . collator ;
527+ items. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator) ) ;
520528
521529 state. set ( items) ;
522530
@@ -561,7 +569,8 @@ impl WindowOps<IambInfo> for IambWindow {
561569 . map ( |room_info| RoomItem :: new ( room_info, store) )
562570 . collect :: < Vec < _ > > ( ) ;
563571 let fields = & store. application . settings . tunables . sort . rooms ;
564- items. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
572+ let collator = & mut store. application . collator ;
573+ items. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator) ) ;
565574
566575 state. set ( items) ;
567576
@@ -592,7 +601,8 @@ impl WindowOps<IambInfo> for IambWindow {
592601 items. extend ( dms) ;
593602
594603 let fields = & store. application . settings . tunables . sort . chats ;
595- items. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
604+ let collator = & mut store. application . collator ;
605+ items. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator) ) ;
596606
597607 state. set ( items) ;
598608
@@ -625,7 +635,8 @@ impl WindowOps<IambInfo> for IambWindow {
625635 items. extend ( dms) ;
626636
627637 let fields = & store. application . settings . tunables . sort . chats ;
628- items. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
638+ let collator = & mut store. application . collator ;
639+ items. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator) ) ;
629640
630641 state. set ( items) ;
631642
@@ -645,7 +656,8 @@ impl WindowOps<IambInfo> for IambWindow {
645656 . map ( |room| SpaceItem :: new ( room, store) )
646657 . collect :: < Vec < _ > > ( ) ;
647658 let fields = & store. application . settings . tunables . sort . spaces ;
648- items. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
659+ let collator = & mut store. application . collator ;
660+ items. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator) ) ;
649661
650662 state. set ( items) ;
651663
@@ -1627,6 +1639,8 @@ mod tests {
16271639
16281640 #[ test]
16291641 fn test_sort_rooms ( ) {
1642+ let mut collator = Collator :: default ( ) ;
1643+ let collator = & mut collator;
16301644 let server = server_name ! ( "example.com" ) ;
16311645
16321646 let room1 = TestRoomItem {
@@ -1659,13 +1673,13 @@ mod tests {
16591673 // Sort by Name ascending.
16601674 let mut rooms = vec ! [ & room1, & room2, & room3] ;
16611675 let fields = & [ SortColumn ( SortFieldRoom :: Name , SortOrder :: Ascending ) ] ;
1662- rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1676+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator ) ) ;
16631677 assert_eq ! ( rooms, vec![ & room3, & room2, & room1] ) ;
16641678
16651679 // Sort by Name descending.
16661680 let mut rooms = vec ! [ & room1, & room2, & room3] ;
16671681 let fields = & [ SortColumn ( SortFieldRoom :: Name , SortOrder :: Descending ) ] ;
1668- rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1682+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator ) ) ;
16691683 assert_eq ! ( rooms, vec![ & room1, & room2, & room3] ) ;
16701684
16711685 // Sort by Favorite and Alias before Name to show order matters.
@@ -1675,7 +1689,7 @@ mod tests {
16751689 SortColumn ( SortFieldRoom :: Alias , SortOrder :: Ascending ) ,
16761690 SortColumn ( SortFieldRoom :: Name , SortOrder :: Ascending ) ,
16771691 ] ;
1678- rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1692+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator ) ) ;
16791693 assert_eq ! ( rooms, vec![ & room1, & room2, & room3] ) ;
16801694
16811695 // Now flip order of Favorite with Descending
@@ -1685,12 +1699,14 @@ mod tests {
16851699 SortColumn ( SortFieldRoom :: Alias , SortOrder :: Ascending ) ,
16861700 SortColumn ( SortFieldRoom :: Name , SortOrder :: Ascending ) ,
16871701 ] ;
1688- rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1702+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator ) ) ;
16891703 assert_eq ! ( rooms, vec![ & room2, & room3, & room1] ) ;
16901704 }
16911705
16921706 #[ test]
16931707 fn test_sort_room_recents ( ) {
1708+ let mut collator = Collator :: default ( ) ;
1709+ let collator = & mut collator;
16941710 let server = server_name ! ( "example.com" ) ;
16951711
16961712 let room1 = TestRoomItem {
@@ -1729,18 +1745,20 @@ mod tests {
17291745 // Sort by Recent ascending.
17301746 let mut rooms = vec ! [ & room1, & room2, & room3] ;
17311747 let fields = & [ SortColumn ( SortFieldRoom :: Recent , SortOrder :: Ascending ) ] ;
1732- rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1748+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator ) ) ;
17331749 assert_eq ! ( rooms, vec![ & room2, & room3, & room1] ) ;
17341750
17351751 // Sort by Recent descending.
17361752 let mut rooms = vec ! [ & room1, & room2, & room3] ;
17371753 let fields = & [ SortColumn ( SortFieldRoom :: Recent , SortOrder :: Descending ) ] ;
1738- rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1754+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator ) ) ;
17391755 assert_eq ! ( rooms, vec![ & room1, & room3, & room2] ) ;
17401756 }
17411757
17421758 #[ test]
17431759 fn test_sort_room_invites ( ) {
1760+ let mut collator = Collator :: default ( ) ;
1761+ let collator = & mut collator;
17441762 let server = server_name ! ( "example.com" ) ;
17451763
17461764 let room1 = TestRoomItem {
@@ -1776,7 +1794,7 @@ mod tests {
17761794 SortColumn ( SortFieldRoom :: Invite , SortOrder :: Ascending ) ,
17771795 SortColumn ( SortFieldRoom :: Name , SortOrder :: Ascending ) ,
17781796 ] ;
1779- rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1797+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator ) ) ;
17801798 assert_eq ! ( rooms, vec![ & room3, & room1, & room2] ) ;
17811799
17821800 // Sort invites after
@@ -1785,7 +1803,7 @@ mod tests {
17851803 SortColumn ( SortFieldRoom :: Invite , SortOrder :: Descending ) ,
17861804 SortColumn ( SortFieldRoom :: Name , SortOrder :: Ascending ) ,
17871805 ] ;
1788- rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields) ) ;
1806+ rooms. sort_by ( |a, b| room_fields_cmp ( a, b, fields, collator ) ) ;
17891807 assert_eq ! ( rooms, vec![ & room1, & room2, & room3] ) ;
17901808 }
17911809}
0 commit comments