From a7b0e56b677615de71295caa17896928441b0994 Mon Sep 17 00:00:00 2001 From: greg Date: Wed, 16 Oct 2024 08:07:27 +0200 Subject: [PATCH] feat: confirm component customization --- yazi-config/preset/theme.toml | 16 ++++++++++++++ yazi-config/src/theme/theme.rs | 14 ++++++++++++ yazi-fm/src/confirm/buttons.rs | 17 ++++++++++++--- yazi-fm/src/confirm/confirm.rs | 25 ++++++++++++++++----- yazi-fm/src/confirm/content.rs | 24 ++++++++++++++++---- yazi-fm/src/confirm/list.rs | 40 ++++++++++++++++++++++++---------- 6 files changed, 112 insertions(+), 24 deletions(-) diff --git a/yazi-config/preset/theme.toml b/yazi-config/preset/theme.toml index a5001a2d..74bf59c3 100644 --- a/yazi-config/preset/theme.toml +++ b/yazi-config/preset/theme.toml @@ -98,6 +98,22 @@ selected = { reversed = true } # : }}} +# : Confirm {{{ + +[confirm] +show_separators = true +show_scrollbar = true +button_yes = " [Y]es " +button_no = " (N)o " +border = { fg = "blue" } +title = { fg = "blue" } +content = { } +list = { } +buttons = { reversed = true } + +# : }}} + + # : Completion {{{ [completion] diff --git a/yazi-config/src/theme/theme.rs b/yazi-config/src/theme/theme.rs index 6f872bf1..33831865 100644 --- a/yazi-config/src/theme/theme.rs +++ b/yazi-config/src/theme/theme.rs @@ -12,6 +12,7 @@ pub struct Theme { pub manager: Manager, status: Status, pub input: Input, + pub confirm: Confirm, pub pick: Pick, pub completion: Completion, pub tasks: Tasks, @@ -114,6 +115,19 @@ pub struct Input { pub selected: Style, } +#[derive(Deserialize, Serialize)] +pub struct Confirm { + pub show_separators: bool, + pub show_scrollbar: bool, + pub button_yes: String, + pub button_no: String, + pub border: Style, + pub title: Style, + pub content: Style, + pub list: Style, + pub buttons: Style, +} + #[derive(Deserialize, Serialize)] pub struct Pick { pub border: Style, diff --git a/yazi-fm/src/confirm/buttons.rs b/yazi-fm/src/confirm/buttons.rs index 13997eaf..cf140e1a 100644 --- a/yazi-fm/src/confirm/buttons.rs +++ b/yazi-fm/src/confirm/buttons.rs @@ -1,4 +1,11 @@ -use ratatui::{buffer::Buffer, layout::{Constraint, Rect}, style::Stylize, text::Span, widgets::{Paragraph, Widget}}; +use ratatui::{ + buffer::Buffer, + layout::{Constraint, Rect}, + text::Span, + widgets::{Paragraph, Widget}, +}; + +use yazi_config::THEME; pub(crate) struct Buttons; @@ -7,7 +14,11 @@ impl Widget for Buttons { let chunks = ratatui::layout::Layout::horizontal([Constraint::Fill(1), Constraint::Fill(1)]).split(area); - Paragraph::new(Span::raw(" [Y]es ").reversed()).centered().render(chunks[0], buf); - Paragraph::new(Span::raw(" (N)o ")).centered().render(chunks[1], buf); + Paragraph::new(Span::raw(&THEME.confirm.button_yes).style(THEME.confirm.buttons)) + .centered() + .render(chunks[0], buf); + Paragraph::new(Span::raw(&THEME.confirm.button_no).style(THEME.confirm.buttons)) + .centered() + .render(chunks[1], buf); } } diff --git a/yazi-fm/src/confirm/confirm.rs b/yazi-fm/src/confirm/confirm.rs index 450a3f20..9efb7d0d 100644 --- a/yazi-fm/src/confirm/confirm.rs +++ b/yazi-fm/src/confirm/confirm.rs @@ -1,4 +1,11 @@ -use ratatui::{buffer::Buffer, layout::{Alignment, Constraint, Layout, Margin, Rect}, style::{Style, Stylize}, text::Line, widgets::{Block, BorderType, Widget}}; +use ratatui::{ + buffer::Buffer, + layout::{Alignment, Constraint, Layout, Margin, Rect}, + text::Line, + widgets::{Block, BorderType, Widget}, +}; + +use yazi_config::THEME; use crate::Ctx; @@ -7,7 +14,9 @@ pub(crate) struct Confirm<'a> { } impl<'a> Confirm<'a> { - pub(crate) fn new(cx: &'a Ctx) -> Self { Self { cx } } + pub(crate) fn new(cx: &'a Ctx) -> Self { + Self { cx } + } } impl<'a> Widget for Confirm<'a> { @@ -19,16 +28,20 @@ impl<'a> Widget for Confirm<'a> { Block::bordered() .border_type(BorderType::Rounded) - .border_style(Style::new().blue()) - .title(Line::styled(&confirm.title, Style::new().blue())) + .border_style(THEME.confirm.border) + .title(Line::styled(&confirm.title, THEME.confirm.title)) .title_alignment(Alignment::Center) .render(area, buf); let content = confirm.content.clone(); - let content_height = content.line_count(area.width).saturating_add(1) as u16; + let mut content_height = content.line_count(area.width) as u16; + + if THEME.confirm.show_separators && content_height > 0 { + content_height = content_height.saturating_add(1); + } let chunks = Layout::vertical([ - Constraint::Length(if content_height == 1 { 0 } else { content_height }), + Constraint::Length(content_height), Constraint::Fill(1), Constraint::Length(1), ]) diff --git a/yazi-fm/src/confirm/content.rs b/yazi-fm/src/confirm/content.rs index c1a553d4..2675f015 100644 --- a/yazi-fm/src/confirm/content.rs +++ b/yazi-fm/src/confirm/content.rs @@ -1,11 +1,19 @@ -use ratatui::{buffer::Buffer, layout::{Margin, Rect}, style::{Style, Stylize}, widgets::{Block, Borders, Paragraph, Widget}}; +use ratatui::{ + buffer::Buffer, + layout::{Margin, Rect}, + widgets::{Block, Borders, Paragraph, Widget}, +}; + +use yazi_config::THEME; pub(crate) struct Content<'a> { p: Paragraph<'a>, } impl<'a> Content<'a> { - pub(crate) fn new(p: Paragraph<'a>) -> Self { Self { p } } + pub(crate) fn new(p: Paragraph<'a>) -> Self { + Self { p } + } } impl<'a> Widget for Content<'a> { @@ -14,9 +22,17 @@ impl<'a> Widget for Content<'a> { let inner = area.inner(Margin::new(1, 0)); // Bottom border - let block = Block::new().borders(Borders::BOTTOM).border_style(Style::new().blue()); + let mut block = Block::new(); + if THEME.confirm.show_separators { + block = block.borders(Borders::BOTTOM).border_style(THEME.confirm.border); + } block.clone().render(area.inner(Margin::new(1, 0)), buf); - self.p.alignment(ratatui::layout::Alignment::Center).block(block).render(inner, buf); + self + .p + .alignment(ratatui::layout::Alignment::Center) + .block(block) + .style(THEME.confirm.content) + .render(inner, buf); } } diff --git a/yazi-fm/src/confirm/list.rs b/yazi-fm/src/confirm/list.rs index 22709c05..4f01796c 100644 --- a/yazi-fm/src/confirm/list.rs +++ b/yazi-fm/src/confirm/list.rs @@ -1,4 +1,12 @@ -use ratatui::{buffer::Buffer, layout::{Margin, Rect}, style::{Style, Stylize}, widgets::{Block, Borders, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget, Widget, Wrap}}; +use ratatui::{ + buffer::Buffer, + layout::{Margin, Rect}, + widgets::{ + Block, Borders, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget, Widget, Wrap, + }, +}; + +use yazi_config::THEME; use crate::Ctx; @@ -7,7 +15,9 @@ pub(crate) struct List<'a> { } impl<'a> List<'a> { - pub(crate) fn new(cx: &'a Ctx) -> Self { Self { cx } } + pub(crate) fn new(cx: &'a Ctx) -> Self { + Self { cx } + } } impl<'a> Widget for List<'a> { @@ -16,7 +26,10 @@ impl<'a> Widget for List<'a> { let inner = area.inner(Margin::new(2, 0)); // Bottom border - let block = Block::new().borders(Borders::BOTTOM).border_style(Style::new().blue()); + let mut block = Block::new(); + if THEME.confirm.show_separators { + block = block.borders(Borders::BOTTOM).border_style(THEME.confirm.border); + } block.clone().render(area.inner(Margin::new(1, 0)), buf); let list = self @@ -26,17 +39,22 @@ impl<'a> Widget for List<'a> { .clone() .scroll((self.cx.confirm.offset as u16, 0)) .block(block) + .style(THEME.confirm.list) .wrap(Wrap { trim: false }); // Vertical scrollbar - let lines = list.line_count(inner.width); - if lines >= inner.height as usize { - area.height = area.height.saturating_sub(1); - Scrollbar::new(ScrollbarOrientation::VerticalRight).render( - area, - buf, - &mut ScrollbarState::new(lines).position(self.cx.confirm.offset), - ); + if THEME.confirm.show_scrollbar { + let lines = list.line_count(inner.width); + if lines >= inner.height as usize { + if THEME.confirm.show_separators { + area.height = area.height.saturating_sub(1); + } + Scrollbar::new(ScrollbarOrientation::VerticalRight).render( + area, + buf, + &mut ScrollbarState::new(lines).position(self.cx.confirm.offset), + ); + } } list.render(inner, buf);