99use std:: collections:: { HashMap , HashSet } ;
1010use imbl:: Vector ;
1111use makepad_widgets:: * ;
12- use matrix_sdk:: ruma:: OwnedRoomId ;
12+ use matrix_sdk:: { RoomState , ruma:: OwnedRoomId } ;
1313use matrix_sdk_ui:: spaces:: SpaceRoom ;
14+ use ruma:: room:: JoinRuleSummary ;
1415use tokio:: sync:: mpsc:: UnboundedSender ;
1516use crate :: {
16- home:: rooms_list:: RoomsListRef ,
17- shared:: avatar:: { AvatarWidgetExt , AvatarWidgetRefExt } ,
18- space_service_sync:: { SpaceRequest , SpaceRoomExt , SpaceRoomListAction } ,
19- utils:: { self , RoomNameId } ,
17+ home:: rooms_list:: RoomsListRef , shared:: avatar:: { AvatarState , AvatarWidgetExt , AvatarWidgetRefExt } , space_service_sync:: { SpaceRequest , SpaceRoomExt , SpaceRoomListAction } , utils:: { self , RoomNameId }
2018} ;
2119
2220
@@ -618,15 +616,63 @@ impl Widget for RoomEntry {
618616 }
619617}
620618
619+ /// The subset of info in [`SpaceRoom`] that we display for each room/space.
620+ struct SpaceRoomInfo {
621+ id : OwnedRoomId ,
622+ name : String ,
623+ #[ allow( unused) ]
624+ topic : Option < String > ,
625+ #[ allow( unused) ]
626+ room_avatar : AvatarState ,
627+ num_joined_members : u64 ,
628+ #[ allow( unused) ]
629+ state : Option < RoomState > ,
630+ #[ allow( unused) ]
631+ join_rule : Option < JoinRuleSummary > ,
632+ /// If `Some`, this is a space. If `None`, it's a room.
633+ children_count : Option < u64 > ,
634+ }
635+ impl SpaceRoomInfo {
636+ fn is_space ( & self ) -> bool {
637+ self . children_count . is_some ( )
638+ }
639+ }
640+ impl From < & SpaceRoom > for SpaceRoomInfo {
641+ fn from ( space_room : & SpaceRoom ) -> Self {
642+ SpaceRoomInfo {
643+ id : space_room. room_id . clone ( ) ,
644+ name : space_room. display_name . clone ( ) ,
645+ topic : space_room. topic . clone ( ) ,
646+ room_avatar : AvatarState :: Known ( space_room. avatar_url . clone ( ) ) ,
647+ num_joined_members : space_room. num_joined_members ,
648+ state : space_room. state . clone ( ) ,
649+ join_rule : space_room. join_rule . clone ( ) ,
650+ children_count : space_room. is_space ( ) . then_some ( space_room. children_count ) ,
651+ }
652+ }
653+ }
654+ impl From < SpaceRoom > for SpaceRoomInfo {
655+ fn from ( space_room : SpaceRoom ) -> Self {
656+ SpaceRoomInfo {
657+ children_count : space_room. is_space ( ) . then_some ( space_room. children_count ) ,
658+ id : space_room. room_id ,
659+ name : space_room. display_name ,
660+ topic : space_room. topic ,
661+ room_avatar : AvatarState :: Known ( space_room. avatar_url ) ,
662+ num_joined_members : space_room. num_joined_members ,
663+ state : space_room. state ,
664+ join_rule : space_room. join_rule ,
665+ }
666+ }
667+ }
621668
622669/// An entry in the tree to be displayed.
623- #[ derive( Clone , Debug ) ]
624670#[ allow( clippy:: large_enum_variant) ]
625671enum TreeEntry {
626672 /// A regular space or room entry.
627673 Item {
628- /// The detailed info about this space or room.
629- info : SpaceRoom ,
674+ /// The info needed to display this space or room.
675+ info : SpaceRoomInfo ,
630676 /// The nesting level (0 = direct child of the displayed space).
631677 level : usize ,
632678 /// Whether this entry is the last child of its parent.
@@ -685,7 +731,7 @@ impl Widget for SpaceLobbyScreen {
685731 if let SubspaceEntryAction :: Clicked { space_id : room_id } = action. as_widget_action ( ) . cast ( ) {
686732 self . toggle_space_expansion ( cx, & room_id) ;
687733 }
688-
734+
689735 // Handle RoomEntry clicks
690736 if let RoomEntryAction :: Clicked { room_id : _ } = action. as_widget_action ( ) . cast ( ) {
691737 // TODO: Navigate to the room
@@ -728,7 +774,7 @@ impl Widget for SpaceLobbyScreen {
728774 if info. is_space ( ) {
729775 let item = list. item ( cx, item_id, id ! ( subspace_entry) ) ;
730776 if let Some ( mut inner) = item. borrow_mut :: < SubspaceEntry > ( ) {
731- inner. space_id = Some ( info. room_id . clone ( ) ) ;
777+ inner. space_id = Some ( info. id . clone ( ) ) ;
732778 }
733779
734780 // Configure tree lines
@@ -740,21 +786,21 @@ impl Widget for SpaceLobbyScreen {
740786 }
741787
742788 // Expand icon
743- let is_expanded = self . expanded_spaces . contains ( & info. room_id ) ;
789+ let is_expanded = self . expanded_spaces . contains ( & info. id ) ;
744790 let angle = if is_expanded { 180.0 } else { 90.0 } ;
745791 item. icon ( ids ! ( expand_icon) ) . apply_over ( cx, live ! {
746792 draw_icon: { rotation_angle: ( angle) }
747793 } ) ;
748794
749795 // Avatar
750796 let avatar_ref = item. avatar ( ids ! ( avatar) ) ;
751- let first_char = utils:: user_name_first_letter ( & info. display_name ) ;
797+ let first_char = utils:: user_name_first_letter ( & info. name ) ;
752798 avatar_ref. show_text ( cx, None , None , first_char. unwrap_or ( "#" ) ) ;
753799
754800 // Text
755- item. label ( ids ! ( content. name_label) ) . set_text ( cx, & info. display_name ) ;
756- let info_text = if info. children_count > 0 {
757- format ! ( "{} members · {} rooms" , info. num_joined_members, info . children_count )
801+ item. label ( ids ! ( content. name_label) ) . set_text ( cx, & info. name ) ;
802+ let info_text = if let Some ( c ) = info. children_count && c > 0 {
803+ format ! ( "{} members · {} rooms" , info. num_joined_members, c )
758804 } else {
759805 format ! ( "{} members" , info. num_joined_members)
760806 } ;
@@ -764,7 +810,7 @@ impl Widget for SpaceLobbyScreen {
764810 } else {
765811 let item = list. item ( cx, item_id, id ! ( room_entry) ) ;
766812 if let Some ( mut inner) = item. borrow_mut :: < RoomEntry > ( ) {
767- inner. room_id = Some ( info. room_id . clone ( ) ) ;
813+ inner. room_id = Some ( info. id . clone ( ) ) ;
768814 }
769815
770816 // Configure tree lines
@@ -777,11 +823,11 @@ impl Widget for SpaceLobbyScreen {
777823
778824 // Avatar
779825 let avatar_ref = item. avatar ( ids ! ( avatar) ) ;
780- let first_char = utils:: user_name_first_letter ( & info. display_name ) ;
826+ let first_char = utils:: user_name_first_letter ( & info. name ) ;
781827 avatar_ref. show_text ( cx, None , None , first_char. unwrap_or ( "#" ) ) ;
782828
783829 // Text
784- item. label ( ids ! ( content. name_label) ) . set_text ( cx, & info. display_name ) ;
830+ item. label ( ids ! ( content. name_label) ) . set_text ( cx, & info. name ) ;
785831 let info_text = format ! ( "{} members" , info. num_joined_members) ;
786832 item. label ( ids ! ( content. info_label) ) . set_text ( cx, & info_text) ;
787833
@@ -882,8 +928,8 @@ impl SpaceLobbyScreen {
882928 /// can be displayed in the SpaceLobbyScreen's PortalList.
883929 //
884930 // Note: this is intentionally *not* a method (it doesn't take &mut self),
885- // in order to make it possible to recursively call it while borrowing only select
886- // fields of `Self`.
931+ // in order to make it possible to recursively call it while immutably borrowing
932+ // only select fields of `Self`.
887933 fn build_tree_for_space (
888934 children_cache : & HashMap < OwnedRoomId , Vector < SpaceRoom > > ,
889935 expanded_spaces : & HashSet < OwnedRoomId > ,
@@ -907,11 +953,11 @@ impl SpaceLobbyScreen {
907953
908954
909955 let count = sorted_children. len ( ) ;
910- for ( i, child) in sorted_children. iter ( ) . enumerate ( ) {
956+ for ( i, child) in sorted_children. into_iter ( ) . enumerate ( ) {
911957 let is_last = i == count - 1 ;
912958
913959 tree_entries. push ( TreeEntry :: Item {
914- info : ( * child) . clone ( ) ,
960+ info : SpaceRoomInfo :: from ( child) ,
915961 level,
916962 is_last,
917963 parent_mask,
0 commit comments