diff --git a/src/app/file_list.rs b/src/app/file_list.rs index 2d7f2fc..9bb51ce 100644 --- a/src/app/file_list.rs +++ b/src/app/file_list.rs @@ -415,13 +415,32 @@ impl App { + if show_tag { tag_w } else { 0.0 }; let name_w = (row_width - indent - trailing).max(0.0); + // `add_sized` centers a widget + // smaller than the box it's given + // — fine for a fixed-width badge, + // but it let a short folder name + // drift away from the indent that + // was just drawn for it, and + // further than its own deeper + // children whose names fill more + // of their (narrower) box. Pinning + // `main_align` to the start keeps + // the name anchored right after + // the indent regardless of length. let button_response = ui - .add_sized( - [name_w, 20.0], - egui::Button::new(text) - .frame(false) - .truncate(), + .allocate_ui_with_layout( + egui::vec2(name_w, 20.0), + egui::Layout::left_to_right(egui::Align::Center) + .with_main_align(egui::Align::Min), + |ui| { + ui.add( + egui::Button::new(text) + .frame(false) + .truncate(), + ) + }, ) + .inner .on_hover_text(&row.path); if button_response.clicked() { @@ -563,16 +582,29 @@ impl App { // file name simply spills out of the // panel. The wrap mode is what it // actually reads. + // + // `add_sized` also *centers* a + // widget narrower than the box + // it's given, which drifted short + // file names away from the indent + // just like folder names did — + // `with_main_align(Min)` pins it + // to the start instead. let mut label = ui .scope(|ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Truncate); - ui.add_sized( - [label_w, 20.0], - egui::SelectableLabel::new( - selected, text, - ), + ui.allocate_ui_with_layout( + egui::vec2(label_w, 20.0), + egui::Layout::left_to_right(egui::Align::Center) + .with_main_align(egui::Align::Min), + |ui| { + ui.add(egui::SelectableLabel::new( + selected, text, + )) + }, ) + .inner }) .inner; if let Some(tooltip) = &tooltip {