From 0ac38ea73372479912f1aff171517a50a577ae04 Mon Sep 17 00:00:00 2001 From: alanpoon Date: Tue, 20 Jan 2026 21:35:46 +0800 Subject: [PATCH 1/3] Add Collapsible PortalList in RoomScreen --- src/home/event_group.rs | 896 ++++++++++++++++++++++++++++ src/home/mod.rs | 2 + src/home/room_screen.rs | 156 ++++- src/shared/fold_button_with_text.rs | 321 ++++++++++ src/shared/mod.rs | 4 + src/shared/view_list.rs | 55 ++ 6 files changed, 1431 insertions(+), 3 deletions(-) create mode 100644 src/home/event_group.rs create mode 100644 src/shared/fold_button_with_text.rs create mode 100644 src/shared/view_list.rs diff --git a/src/home/event_group.rs b/src/home/event_group.rs new file mode 100644 index 000000000..0d9c3df93 --- /dev/null +++ b/src/home/event_group.rs @@ -0,0 +1,896 @@ +use makepad_widgets::*; +use matrix_sdk::ruma::{OwnedEventId, OwnedUserId, UserId}; +use matrix_sdk_ui::timeline::{ + AnyOtherFullStateEventContent, EventTimelineItem, MembershipChange, MsgLikeContent, MsgLikeKind, TimelineItem, TimelineItemContent, TimelineItemKind +}; +use rangemap::RangeMap; +use std::{collections::HashMap, sync::Arc}; +use indexmap::IndexMap; + +use crate::home::room_read_receipt::{AvatarRowWidgetRefExt, MAX_VISIBLE_AVATARS_IN_READ_RECEIPT}; + +// Minimum number of sequential small state events to collapse +const MIN_GROUP_SIZE_FOR_COLLAPSE: usize = 3; +// Maximum number of user names to display before coalescing +const SUMMARY_LENGTH: usize = 4; + +live_design! { + use link::theme::*; + use link::shaders::*; + use link::widgets::*; + + use crate::shared::styles::*; + use crate::home::room_read_receipt::*; + use crate::shared::fold_button_with_text::FoldButtonWithText; + use crate::shared::view_list::ViewList; + + // FoldHeader for grouped small state events + // Follows the pattern from portal_list_auto_grouping skills doc + pub SmallStateGroupHeader = { + // Header: Always visible, shows summary and fold button + header: { + width: Fill, + height: Fit + padding: { left: 7.0, top: 2.0, bottom: 2.0 } + flow: Down, + spacing: 7.0 + + { + width: Fill, + height: Fit + user_event_avatar_row = { + margin: { left: 10.0 }, + } + + summary_text =