Allow segmented buttons to be indented

This commit is contained in:
Jeremy Soller 2023-11-16 08:00:33 -07:00
parent bad4400779
commit 2df8cb8862
3 changed files with 40 additions and 0 deletions

View file

@ -104,6 +104,12 @@ where
self.id
}
#[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
pub fn indent(self, indent: u16) -> Self {
self.model.indent_set(self.id, indent);
self
}
/// Define the position of the item.
#[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
pub fn position(self, position: u16) -> Self {

View file

@ -61,6 +61,9 @@ pub struct Model<SelectionMode: Default> {
/// Icons optionally-defined for each item.
pub(super) icons: SecondaryMap<Entity, Icon>,
/// Indent optionally-defined for each item.
pub(super) indents: SecondaryMap<Entity, u16>,
/// Text optionally-defined for each item.
pub(super) text: SecondaryMap<Entity, Cow<'static, str>>,
@ -293,6 +296,22 @@ where
self.order.iter().copied()
}
pub fn indent(&self, id: Entity) -> Option<u16> {
self.indents.get(id).map(|indent| *indent)
}
pub fn indent_set(&mut self, id: Entity, indent: u16) -> Option<u16> {
if !self.contains_item(id) {
return None;
}
self.indents.insert(id, indent)
}
pub fn indent_remove(&mut self, id: Entity) -> Option<u16> {
self.indents.remove(id)
}
/// The position of the item in the model.
///
/// ```ignore

View file

@ -82,6 +82,8 @@ where
pub(super) button_height: u16,
/// Spacing between icon and text in button.
pub(super) button_spacing: u16,
/// Spacing for each indent.
pub(super) indent_spacing: u16,
/// Desired font for active tabs.
pub(super) font_active: Option<crate::font::Font>,
/// Desired font for hovered tabs.
@ -127,6 +129,7 @@ where
button_padding: [4, 4, 4, 4],
button_height: 32,
button_spacing: 4,
indent_spacing: 16,
font_active: None,
font_hovered: None,
font_inactive: None,
@ -235,6 +238,11 @@ where
button_height = height;
}
// Add indent to measurement if found.
if let Some(indent) = self.model.indent(key) {
button_width += f32::from(indent) * f32::from(self.indent_spacing);
}
// Add icon to measurement if icon was given.
if let Some(icon) = self.model.icon(key) {
button_height = button_height.max(f32::from(icon.size));
@ -509,6 +517,13 @@ where
let y = bounds.center_y();
// Adjust bounds by indent
if let Some(indent) = self.model.indent(key) {
let adjustment = f32::from(indent) * f32::from(self.indent_spacing);
bounds.x += adjustment;
bounds.width -= adjustment;
}
// Draw the image beside the text.
let horizontal_alignment = if let Some(icon) = self.model.icon(key) {
bounds.x += f32::from(self.button_padding[0]);