From 596e4d76ab6eeb48ac2d58d2d50a69acfc7e1c43 Mon Sep 17 00:00:00 2001 From: Benjamin Gilbert Date: Tue, 11 Jun 2024 22:01:01 -0500 Subject: [PATCH] Support replacing angle brackets in SelectView popup button Allow a SelectView to be configured with custom decorators instead of the angle brackets around the current item label. --- cursive-core/src/views/select_view.rs | 32 ++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/cursive-core/src/views/select_view.rs b/cursive-core/src/views/select_view.rs index 5652b481..1a554d16 100644 --- a/cursive-core/src/views/select_view.rs +++ b/cursive-core/src/views/select_view.rs @@ -72,6 +72,8 @@ pub struct SelectView { // `true` if we show a one-line view, with popup on selection. popup: bool, + // Decorators to draw around the popup button. + decorators: [String; 2], // We need the last offset to place the popup window // We "cache" it during the draw, so we need interior mutability. @@ -102,6 +104,7 @@ impl SelectView { on_submit: None, align: Align::top_left(), popup: false, + decorators: ["<".to_string(), ">".to_string()], autojump: false, last_offset: Mutex::new(Vec2::zero()), last_size: Vec2::zero(), @@ -167,6 +170,19 @@ impl SelectView { self.last_required_size = None; } + /// Use custom decorators around the popup button instead of "<" and ">". + /// + /// Chainable variant. + #[must_use] + pub fn decorators>(self, start: S, end: S) -> Self { + self.with(|s| s.set_decorators(start, end)) + } + + /// Use custom decorators around the popup button instead of "<" and ">". + pub fn set_decorators>(&mut self, start: S, end: S) { + self.decorators = [start.into(), end.into()]; + } + /// Sets a callback to be used when an item is selected. #[crate::callback_helpers] pub fn set_on_select(&mut self, cb: F) @@ -965,13 +981,16 @@ impl View for SelectView { printer.with_style(style, |printer| { // Prepare the entire background printer.print_hline((1, 0), x, " "); - // Draw the borders - printer.print((0, 0), "<"); - printer.print((x, 0), ">"); + // Draw the decorators + printer.print((0, 0), &self.decorators[0]); + printer.print((x + 1 - self.decorators[1].len(), 0), &self.decorators[1]); if let Some(label) = self.items.get(focus).map(|item| &item.label) { // And center the text? - let offset = HAlign::Center.get_offset(label.width(), x + 1); + let offset = HAlign::Center.get_offset( + label.width(), + x + 1 - self.decorators.iter().map(|d| d.len()).sum::(), + ) + self.decorators[0].len(); printer.print_styled((offset, 0), label); } @@ -1027,7 +1046,10 @@ impl View for SelectView { .max() .unwrap_or(1); let size = if self.popup { - Vec2::new(w + 2, 1) + Vec2::new( + w + self.decorators.iter().map(|d| d.len()).sum::(), + 1, + ) } else { let h = self.items.len();