diff --git a/cursive-core/src/views/select_view.rs b/cursive-core/src/views/select_view.rs index 449b2f9b..8f78512c 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, + // `true` if we skip the angle brackets around the popup button + raw: bool, // 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, + raw: false, autojump: false, last_offset: Mutex::new(Vec2::zero()), last_size: Vec2::zero(), @@ -167,6 +170,19 @@ impl SelectView { self.last_required_size = None; } + /// Disable drawing angle brackets around the popup button. + /// + /// Chainable variant. + #[must_use] + pub fn raw(self) -> Self { + self.with(|s| s.set_raw(true)) + } + + /// Disable drawing angle brackets around the popup button. + pub fn set_raw(&mut self, raw: bool) { + self.raw = raw; + } + /// Sets a callback to be used when an item is selected. #[crate::callback_helpers] pub fn set_on_select(&mut self, cb: F) @@ -944,9 +960,11 @@ 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), ">"); + if !self.raw { + // Draw the borders + printer.print((0, 0), "<"); + printer.print((x, 0), ">"); + } if let Some(label) = self.items.get(focus).map(|item| &item.label) { // And center the text? @@ -1006,7 +1024,8 @@ impl View for SelectView { .max() .unwrap_or(1); let size = if self.popup { - Vec2::new(w + 2, 1) + let extra = if self.raw { 0 } else { 2 }; + Vec2::new(w + extra, 1) } else { let h = self.items.len();