diff --git a/Cargo.toml b/Cargo.toml index 33a60122..01561d4a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ version = "0.0.1-pre-alpha-4" metadata.makepad-auto-version = "zqpv-Yj-K7WNVK2I8h5Okhho46Q=" [dependencies] -makepad-widgets = { git = "https://github.com/kevinaboos/makepad", branch = "serde_optional", features = ["serde"] } +makepad-widgets = { git = "https://github.com/alanpoon/makepad", branch = "serde_fold_header", features = ["serde"] } # makepad-widgets = { git = "https://github.com/makepad/makepad", branch = "dev", features = ["serde"] } ## Including this crate automatically configures all `robius-*` crates to work with Makepad. diff --git a/src/home/event_group.rs b/src/home/event_group.rs new file mode 100644 index 00000000..a6d79824 --- /dev/null +++ b/src/home/event_group.rs @@ -0,0 +1,885 @@ +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 =