yoda: toolbar icon-only + clean visual (Control style, 32px squares)

User feedback: segmented visual was noisy; only want icons, no labels.

Changes:
- rebuild_toolbar_model no longer sets .text() on entities, so the
  segmented_button widget draws icon-only squares.
- toolbar renders with style(SegmentedButton::Control), button_height
  + min/max_button_width pinned at 32 px (square icon buttons),
  button_spacing = space_xs for clear separation (was space_xxs which
  looked conjoined), Alignment::Center.
- container width = Length::Shrink so the toolbar only takes the space
  it needs instead of stretching across the window.
This commit is contained in:
Lionel DARNIS 2026-04-24 11:12:26 +02:00
parent 94c3e6c551
commit f0538190d9

View file

@ -1827,14 +1827,17 @@ impl App {
/// Called on init and on every config update. Each entity carries the /// Called on init and on every config update. Each entity carries the
/// associated `ToolbarAction` as data so click/reorder handlers can /// associated `ToolbarAction` as data so click/reorder handlers can
/// round-trip Entity → ToolbarAction without maintaining a side map. /// round-trip Entity → ToolbarAction without maintaining a side map.
///
/// We insert ONLY the icon (no `.text()`) so the toolbar renders as a
/// clean icon row — user-visible labels stay in Settings/tooltips on
/// other surfaces.
fn rebuild_toolbar_model(&mut self) { fn rebuild_toolbar_model(&mut self) {
self.toolbar_model.clear(); self.toolbar_model.clear();
for action in self.config.toolbar.iter().copied() { for action in self.config.toolbar.iter().copied() {
let (icon_name, label, _msg) = toolbar_action_ui(action); let (icon_name, _label, _msg) = toolbar_action_ui(action);
self.toolbar_model self.toolbar_model
.insert() .insert()
.icon(widget::icon::from_name(icon_name).size(16).icon()) .icon(widget::icon::from_name(icon_name).size(16).icon())
.text(label)
.data::<ToolbarAction>(action); .data::<ToolbarAction>(action);
} }
} }
@ -6833,7 +6836,7 @@ impl Application for App {
/// Creates a view after each update. /// Creates a view after each update.
fn view(&self) -> Element<'_, Self::Message> { fn view(&self) -> Element<'_, Self::Message> {
let cosmic_theme::Spacing { let cosmic_theme::Spacing {
space_xxs, space_s, .. space_xxs, space_xs, space_s, ..
} = theme::active().cosmic().spacing; } = theme::active().cosmic().spacing;
let mut tab_column = widget::column::with_capacity(4); let mut tab_column = widget::column::with_capacity(4);
@ -6885,18 +6888,24 @@ impl Application for App {
// ToolbarAction's message). Drag past threshold = reorder // ToolbarAction's message). Drag past threshold = reorder
// (ToolbarTabReorder → model.reorder + sync to config). // (ToolbarTabReorder → model.reorder + sync to config).
if !self.config.toolbar.is_empty() { if !self.config.toolbar.is_empty() {
// Use Control style (no TabBar underline, no bottom border)
// and let each button shrink to its icon. Spacing = space_xs
// keeps the buttons visually separated so it looks like an
// icon toolbar rather than a conjoined segmented control.
let toolbar = widget::segmented_button::horizontal(&self.toolbar_model) let toolbar = widget::segmented_button::horizontal(&self.toolbar_model)
.style(theme::SegmentedButton::Control)
.button_height(32) .button_height(32)
.button_spacing(space_xxs) .button_spacing(space_xs)
.minimum_button_width(36) .button_alignment(Alignment::Center)
.maximum_button_width(36) .minimum_button_width(32)
.maximum_button_width(32)
.enable_tab_drag(String::from("x-cosmic-files/toolbar-dnd")) .enable_tab_drag(String::from("x-cosmic-files/toolbar-dnd"))
.on_reorder(Message::ToolbarTabReorder) .on_reorder(Message::ToolbarTabReorder)
.tab_drag_threshold(8.) .tab_drag_threshold(8.)
.on_activate(Message::ToolbarTabActivate); .on_activate(Message::ToolbarTabActivate);
tab_column = tab_column.push( tab_column = tab_column.push(
widget::container(toolbar) widget::container(toolbar)
.width(Length::Fill) .width(Length::Shrink)
.padding([space_xxs, space_s]), .padding([space_xxs, space_s]),
); );
} }