Align session titles in the sidebar

This commit is contained in:
Georg Bauer
2026-07-28 19:11:23 +02:00
parent 191ff0b2ce
commit 74c5948955

View File

@@ -31,7 +31,6 @@ use std::path::Path;
const ICON_FOLDER: &[u8] = include_bytes!("../../assets/icons/folder.svg"); const ICON_FOLDER: &[u8] = include_bytes!("../../assets/icons/folder.svg");
const ICON_FOLDER_PLUS: &[u8] = include_bytes!("../../assets/icons/folder-plus.svg"); const ICON_FOLDER_PLUS: &[u8] = include_bytes!("../../assets/icons/folder-plus.svg");
const ICON_NEW_SESSION: &[u8] = include_bytes!("../../assets/icons/new-session.svg"); const ICON_NEW_SESSION: &[u8] = include_bytes!("../../assets/icons/new-session.svg");
const ICON_CHAT: &[u8] = include_bytes!("../../assets/icons/chat.svg");
const ICON_SETTINGS: &[u8] = include_bytes!("../../assets/icons/settings.svg"); const ICON_SETTINGS: &[u8] = include_bytes!("../../assets/icons/settings.svg");
const ICON_TRASH: &[u8] = include_bytes!("../../assets/icons/trash.svg"); const ICON_TRASH: &[u8] = include_bytes!("../../assets/icons/trash.svg");
const ICON_MORE: &[u8] = include_bytes!("../../assets/icons/more.svg"); const ICON_MORE: &[u8] = include_bytes!("../../assets/icons/more.svg");
@@ -53,6 +52,11 @@ const TITLE_BAR_HEIGHT: f32 = 30.0;
const TITLE_BAR_CONTROL: f32 = 24.0; const TITLE_BAR_CONTROL: f32 = 24.0;
/// Space the macOS traffic lights need before our own controls start. /// Space the macOS traffic lights need before our own controls start.
const TRAFFIC_LIGHT_WIDTH: f32 = 78.0; const TRAFFIC_LIGHT_WIDTH: f32 = 78.0;
const PROJECT_DISCLOSURE_WIDTH: f32 = 12.0;
const PROJECT_ICON_WIDTH: u16 = 17;
const PROJECT_LABEL_SPACING: f32 = 9.0;
const SESSION_INDENT: f32 =
PROJECT_DISCLOSURE_WIDTH + PROJECT_ICON_WIDTH as f32 + PROJECT_LABEL_SPACING * 2.0;
impl App { impl App {
pub(crate) fn view(&self, id: window::Id) -> Element<'_, Message> { pub(crate) fn view(&self, id: window::Id) -> Element<'_, Message> {
@@ -328,11 +332,13 @@ impl App {
row![ row![
button( button(
row![ row![
text(if project.collapsed { "" } else { "" }).size(12), text(if project.collapsed { "" } else { "" })
icon(ICON_FOLDER, 17), .size(12)
.width(PROJECT_DISCLOSURE_WIDTH),
icon(ICON_FOLDER, PROJECT_ICON_WIDTH),
text(&project.name).size(14) text(&project.name).size(14)
] ]
.spacing(9) .spacing(PROJECT_LABEL_SPACING)
.align_y(Alignment::Center), .align_y(Alignment::Center),
) )
.width(Length::Fill) .width(Length::Fill)
@@ -353,6 +359,28 @@ impl App {
continue; continue;
} }
if let Some(title) = self.drafts.get(&project.id) {
let draft_selected = self.draft_selected(project.id);
projects = projects.push(
row![
Space::new().width(SESSION_INDENT),
button(text(title).size(13).color(muted_text()))
.width(Length::Fill)
.on_press(Message::CreateSession(project.id))
.style(if draft_selected {
button::secondary
} else {
button::text
}),
button(icon(ICON_TRASH, 14))
.on_press(Message::DiscardSession(project.id))
.style(button::text),
]
.spacing(3)
.align_y(Alignment::Center),
);
}
for session in item for session in item
.sessions .sessions
.iter() .iter()
@@ -392,35 +420,6 @@ impl App {
} }
} }
} }
if let Some(title) = self.drafts.get(&project.id) {
let draft_selected = self.draft_selected(project.id);
projects = projects.push(
row![
Space::new().width(26),
button(
row![
icon(ICON_CHAT, 15),
text(title).size(13).color(muted_text())
]
.spacing(8)
.align_y(Alignment::Center),
)
.width(Length::Fill)
.on_press(Message::CreateSession(project.id))
.style(if draft_selected {
button::secondary
} else {
button::text
}),
button(icon(ICON_TRASH, 14))
.on_press(Message::DiscardSession(project.id))
.style(button::text),
]
.spacing(3)
.align_y(Alignment::Center),
);
}
} }
container( container(
@@ -450,18 +449,14 @@ impl App {
project_selected: bool, project_selected: bool,
) -> Element<'a, Message> { ) -> Element<'a, Message> {
let session_selected = project_selected && self.selected_session == Some(session.id); let session_selected = project_selected && self.selected_session == Some(session.id);
let mut label = row![icon(ICON_CHAT, 15)] let mut label = row![text(&session.title).size(13)]
.spacing(8) .spacing(8)
.align_y(Alignment::Center); .align_y(Alignment::Center);
if session.state() == SessionState::Pinned {
label = label.push(icon(ICON_PIN, 12));
}
label = label.push(text(&session.title).size(13));
if self.session_is_active(session.id) { if self.session_is_active(session.id) {
label = label.push(text("").size(10).color(app_theme().palette().success)); label = label.push(text("").size(10).color(app_theme().palette().success));
} }
row![ row![
Space::new().width(26), Space::new().width(SESSION_INDENT),
button(label) button(label)
.width(Length::Fill) .width(Length::Fill)
.on_press(Message::SelectSession(project_id, session.id)) .on_press(Message::SelectSession(project_id, session.id))