update sidebar

This commit is contained in:
2026-09-23 20:19:42 +07:00
parent 273ddabde5
commit c61be4a139
6 changed files with 485 additions and 596 deletions
+31 -36
View File
@@ -1,36 +1,45 @@
use std::rc::Rc;
use chat::Room;
use community::Community;
use community::{ChannelId, Community};
use gpui::prelude::FluentBuilder;
use gpui::{
App, ClickEvent, ElementId, Entity, ImageSource, InteractiveElement, IntoElement,
ParentElement, RenderOnce, SharedString, StatefulInteractiveElement, Styled, Window, div, px,
};
use nostr_sdk::prelude::PublicKey;
use settings::AppSettings;
use theme::ActiveTheme;
use ui::avatar::{Avatar, PixelAvatar};
use ui::{Icon, IconName, Selectable, Sizable, StyledExt, h_flex};
use super::tab::SidebarTab;
pub enum SidebarRow {
Section {
label: SharedString,
count: usize,
Section { label: SharedString },
Room { room: Entity<Room> },
Community { community: Entity<Community> },
Hint { text: SharedString },
}
/// A collapsible group of rows in the sidebar's community view.
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum CommunitySection {
Channels,
Admins,
Members,
}
/// A row in the sidebar's community view.
pub enum CommunityRow {
Section(CommunitySection),
Channel {
id: ChannelId,
name: SharedString,
private: bool,
selected: bool,
},
Room {
room: Entity<Room>,
},
Community {
community: Entity<Community>,
},
Action {
label: SharedString,
tab: SidebarTab,
},
Hint {
text: SharedString,
Member {
prefix: &'static str,
public_key: PublicKey,
},
}
@@ -39,7 +48,6 @@ pub enum TreeRowKind {
Section,
Room,
Community,
Action,
Hint,
}
@@ -51,7 +59,6 @@ pub struct TreeRow {
avatar: Option<SharedString>,
picture: Option<ImageSource>,
icon: Option<IconName>,
count: Option<usize>,
created_at: Option<SharedString>,
selected: bool,
#[allow(clippy::type_complexity)]
@@ -71,7 +78,6 @@ impl TreeRow {
avatar: None,
picture: None,
icon: None,
count: None,
created_at: None,
selected: false,
on_click: None,
@@ -96,11 +102,6 @@ impl TreeRow {
self
}
pub fn count(mut self, count: usize) -> Self {
self.count = Some(count);
self
}
pub fn created_at(mut self, created_at: impl Into<SharedString>) -> Self {
self.created_at = Some(created_at.into());
self
@@ -133,7 +134,6 @@ impl RenderOnce for TreeRow {
let is_section = self.kind == TreeRowKind::Section;
let is_room = self.kind == TreeRowKind::Room;
let is_community = self.kind == TreeRowKind::Community;
let is_action = self.kind == TreeRowKind::Action;
let is_hint = self.kind == TreeRowKind::Hint;
let is_selected = self.selected;
@@ -172,7 +172,6 @@ impl RenderOnce for TreeRow {
h_flex()
.id(self.id)
.h_8()
.w_full()
.px_2()
.gap_2()
@@ -182,10 +181,8 @@ impl RenderOnce for TreeRow {
.text_color(cx.theme().text_placeholder)
.font_semibold()
})
.when(is_room || is_community, |this| this.text_sm())
.when(is_action, |this| {
this.text_sm().text_color(cx.theme().text_muted)
})
.when(is_room || is_community, |this| this.text_sm().h_10())
.h_8()
.when(is_hint, |this| {
this.text_xs()
.font_normal()
@@ -203,6 +200,7 @@ impl RenderOnce for TreeRow {
.when(is_room, |this| this.font_medium())
.child(self.label),
)
.child(div().flex_1())
.when(is_selected, |this| {
this.child(
Icon::new(IconName::CheckCircle)
@@ -211,11 +209,8 @@ impl RenderOnce for TreeRow {
.text_color(cx.theme().icon_accent),
)
})
.when_some(self.count, |this, count| {
this.child(div().flex_shrink_0().font_normal().child(count.to_string()))
})
.when_some(self.created_at, |this, created_at| {
this.child(div().flex_1()).child(
this.child(
div()
.flex_shrink_0()
.text_color(cx.theme().text_placeholder)