From 30c80aaac54c812846af39dce1b84ee80b2c10ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norman=20Kerr=20=E6=9F=AF=E5=BF=B5=E5=8C=97?= Date: Sat, 31 Jan 2026 09:29:24 -0800 Subject: [PATCH] feat(tui-prompts): add disable status option --- tui-prompts/src/text_prompt.rs | 39 ++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/tui-prompts/src/text_prompt.rs b/tui-prompts/src/text_prompt.rs index 20d61b3..98c618c 100644 --- a/tui-prompts/src/text_prompt.rs +++ b/tui-prompts/src/text_prompt.rs @@ -29,6 +29,7 @@ pub struct TextPrompt<'a> { /// The block to wrap the prompt in. block: Option>, render_style: TextRenderStyle, + status_enabled: bool, } #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] @@ -57,6 +58,7 @@ impl<'a> TextPrompt<'a> { message, block: None, render_style: TextRenderStyle::Default, + status_enabled: true, } } @@ -71,6 +73,12 @@ impl<'a> TextPrompt<'a> { self.render_style = render_style; self } + + #[must_use] + pub const fn with_status_disabled(mut self) -> Self { + self.status_enabled = false; + self + } } impl Prompt for TextPrompt<'_> { @@ -97,13 +105,18 @@ impl<'a> StatefulWidget for TextPrompt<'a> { let value = Span::raw(self.render_style.render(state)); let value_width = value.width(); - let line = Line::from(vec![ - state.status().symbol(), - " ".into(), - self.message.bold(), - " › ".cyan().dim(), - value, - ]); + let line = { + let mut parts = vec![]; + if self.status_enabled { + parts.push(state.status().symbol()); + parts.push(" ".into()); + } + parts.push(self.message.bold()); + parts.push(" › ".cyan().dim()); + parts.push(value); + Line::from(parts) + }; + let prompt_width = line.width() - value_width; let lines = wrap(line, width).take(height).collect_vec(); @@ -290,6 +303,18 @@ mod tests { assert_eq!(buffer, Buffer::with_lines([line])); } + #[test] + fn render_with_disabled_status() { + let prompt = TextPrompt::from("prompt").with_status_disabled(); + let mut state = TextState::new().with_status(Status::Aborted); + let mut buffer = Buffer::empty(Rect::new(0, 0, 13, 1)); + + prompt.render(buffer.area, &mut buffer, &mut state); + + let line = line!["prompt".bold(), " › ".cyan().dim(), " "]; + assert_eq!(buffer, Buffer::with_lines([line])); + } + #[test] fn render_with_value() { let prompt = TextPrompt::from("prompt");