mirror of https://github.com/helix-editor/helix
Merge 26efba0dc3
into 4281228da3
commit
97161a32ca
|
@ -308,7 +308,10 @@ impl<T: 'static + Send + Sync, D: 'static + Send + Sync> Picker<T, D> {
|
||||||
F: Fn(&mut Context, &T, Action) + 'static,
|
F: Fn(&mut Context, &T, Action) + 'static,
|
||||||
{
|
{
|
||||||
let columns: Arc<[_]> = columns.into_iter().collect();
|
let columns: Arc<[_]> = columns.into_iter().collect();
|
||||||
let matcher_columns = columns.iter().filter(|col| col.filter).count() as u32;
|
let matcher_columns = columns
|
||||||
|
.iter()
|
||||||
|
.filter(|col: &&Column<T, D>| col.filter)
|
||||||
|
.count() as u32;
|
||||||
assert!(matcher_columns > 0);
|
assert!(matcher_columns > 0);
|
||||||
let matcher = Nucleo::new(
|
let matcher = Nucleo::new(
|
||||||
Config::DEFAULT,
|
Config::DEFAULT,
|
||||||
|
|
|
@ -374,6 +374,30 @@ impl<'a> Text<'a> {
|
||||||
self.lines.len()
|
self.lines.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Patch text with a new style. Only updates fields that are in the new style.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use helix_tui::text::Text;
|
||||||
|
/// # use helix_view::graphics::{Color, Style};
|
||||||
|
/// let style1 = Style::default().fg(Color::Yellow);
|
||||||
|
/// let style2 = Style::default().fg(Color::Yellow).bg(Color::Black);
|
||||||
|
/// let mut half_styled_text = Text::styled(String::from("The first line\nThe second line"), style1);
|
||||||
|
/// let full_styled_text = Text::styled(String::from("The first line\nThe second line"), style2);
|
||||||
|
/// assert_ne!(half_styled_text, full_styled_text);
|
||||||
|
///
|
||||||
|
/// half_styled_text.patch_style(Style::default().bg(Color::Black));
|
||||||
|
/// assert_eq!(half_styled_text, full_styled_text);
|
||||||
|
/// ```
|
||||||
|
pub fn patch_style(&mut self, style: Style) {
|
||||||
|
for line in &mut self.lines {
|
||||||
|
for span in &mut line.0 {
|
||||||
|
span.style = span.style.patch(style);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Apply a new style to existing text.
|
/// Apply a new style to existing text.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
|
@ -386,13 +410,13 @@ impl<'a> Text<'a> {
|
||||||
/// let styled_text = Text::styled(String::from("The first line\nThe second line"), style);
|
/// let styled_text = Text::styled(String::from("The first line\nThe second line"), style);
|
||||||
/// assert_ne!(raw_text, styled_text);
|
/// assert_ne!(raw_text, styled_text);
|
||||||
///
|
///
|
||||||
/// raw_text.patch_style(style);
|
/// raw_text.set_style(style);
|
||||||
/// assert_eq!(raw_text, styled_text);
|
/// assert_eq!(raw_text, styled_text);
|
||||||
/// ```
|
/// ```
|
||||||
pub fn patch_style(&mut self, style: Style) {
|
pub fn set_style(&mut self, style: Style) {
|
||||||
for line in &mut self.lines {
|
for line in &mut self.lines {
|
||||||
for span in &mut line.0 {
|
for span in &mut line.0 {
|
||||||
span.style = span.style.patch(style);
|
span.style = style;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,8 +38,15 @@ impl Cell<'_> {
|
||||||
/// Set the `Style` of this cell.
|
/// Set the `Style` of this cell.
|
||||||
pub fn style(mut self, style: Style) -> Self {
|
pub fn style(mut self, style: Style) -> Self {
|
||||||
self.style = style;
|
self.style = style;
|
||||||
|
self.content.set_style(style);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the `Style` of this cell.
|
||||||
|
pub fn set_style(&mut self, style: Style) {
|
||||||
|
self.style = style;
|
||||||
|
self.content.set_style(style);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T> From<T> for Cell<'a>
|
impl<'a, T> From<T> for Cell<'a>
|
||||||
|
@ -453,6 +460,9 @@ impl Table<'_> {
|
||||||
};
|
};
|
||||||
if is_selected {
|
if is_selected {
|
||||||
buf.set_style(table_row_area, self.highlight_style);
|
buf.set_style(table_row_area, self.highlight_style);
|
||||||
|
for cell in &mut table_row.cells {
|
||||||
|
cell.set_style(self.highlight_style);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let mut col = table_row_start_col;
|
let mut col = table_row_start_col;
|
||||||
for (width, cell) in columns_widths.iter().zip(table_row.cells.iter()) {
|
for (width, cell) in columns_widths.iter().zip(table_row.cells.iter()) {
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
use helix_tui::text::{Span, Spans, StyledGrapheme, Text};
|
||||||
|
use helix_view::graphics::{Color, Modifier, Style};
|
||||||
|
|
||||||
|
// Text
|
||||||
|
#[test]
|
||||||
|
fn text_width() {
|
||||||
|
let text = Text::from("The first line\nThe second line");
|
||||||
|
assert_eq!(15, text.width());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn text_height() {
|
||||||
|
let text = Text::from("The first line\nThe second line");
|
||||||
|
assert_eq!(2, text.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn patch_style() {
|
||||||
|
let style1 = Style::default().fg(Color::Yellow);
|
||||||
|
let style2 = Style::default().fg(Color::Yellow).bg(Color::Black);
|
||||||
|
let mut half_styled_text =
|
||||||
|
Text::styled(String::from("The first line\nThe second line"), style1);
|
||||||
|
let full_styled_text = Text::styled(String::from("The first line\nThe second line"), style2);
|
||||||
|
assert_ne!(half_styled_text, full_styled_text);
|
||||||
|
|
||||||
|
half_styled_text.patch_style(Style::default().bg(Color::Black));
|
||||||
|
assert_eq!(half_styled_text, full_styled_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn set_style() {
|
||||||
|
let style = Style::default()
|
||||||
|
.fg(Color::Yellow)
|
||||||
|
.add_modifier(Modifier::ITALIC);
|
||||||
|
let mut raw_text = Text::raw("The first line\nThe second line");
|
||||||
|
let styled_text = Text::styled(String::from("The first line\nThe second line"), style);
|
||||||
|
assert_ne!(raw_text, styled_text);
|
||||||
|
|
||||||
|
raw_text.set_style(style);
|
||||||
|
assert_eq!(raw_text, styled_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn text_extend() {
|
||||||
|
let style = Style::default()
|
||||||
|
.fg(Color::Yellow)
|
||||||
|
.add_modifier(Modifier::ITALIC);
|
||||||
|
let mut text = Text::from("The first line\nThe second line");
|
||||||
|
assert_eq!(2, text.height());
|
||||||
|
|
||||||
|
// Adding two more unstyled lines
|
||||||
|
text.extend(Text::raw("These are two\nmore lines!"));
|
||||||
|
assert_eq!(4, text.height());
|
||||||
|
|
||||||
|
// Adding a final two styled lines
|
||||||
|
text.extend(Text::styled("Some more lines\nnow with more style!", style));
|
||||||
|
assert_eq!(6, text.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Span
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn styled_graphemes() {
|
||||||
|
let style = Style::default().fg(Color::Yellow);
|
||||||
|
let span = Span::styled("Text", style);
|
||||||
|
let style = Style::default().fg(Color::Green).bg(Color::Black);
|
||||||
|
let styled_graphemes = span.styled_graphemes(style);
|
||||||
|
assert_eq!(
|
||||||
|
vec![
|
||||||
|
StyledGrapheme {
|
||||||
|
symbol: "T",
|
||||||
|
style: Style {
|
||||||
|
fg: Some(Color::Yellow),
|
||||||
|
bg: Some(Color::Black),
|
||||||
|
underline_color: None,
|
||||||
|
underline_style: None,
|
||||||
|
add_modifier: Modifier::empty(),
|
||||||
|
sub_modifier: Modifier::empty(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
StyledGrapheme {
|
||||||
|
symbol: "e",
|
||||||
|
style: Style {
|
||||||
|
fg: Some(Color::Yellow),
|
||||||
|
bg: Some(Color::Black),
|
||||||
|
underline_color: None,
|
||||||
|
underline_style: None,
|
||||||
|
add_modifier: Modifier::empty(),
|
||||||
|
sub_modifier: Modifier::empty(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
StyledGrapheme {
|
||||||
|
symbol: "x",
|
||||||
|
style: Style {
|
||||||
|
fg: Some(Color::Yellow),
|
||||||
|
bg: Some(Color::Black),
|
||||||
|
underline_color: None,
|
||||||
|
underline_style: None,
|
||||||
|
add_modifier: Modifier::empty(),
|
||||||
|
sub_modifier: Modifier::empty(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
StyledGrapheme {
|
||||||
|
symbol: "t",
|
||||||
|
style: Style {
|
||||||
|
fg: Some(Color::Yellow),
|
||||||
|
bg: Some(Color::Black),
|
||||||
|
underline_color: None,
|
||||||
|
underline_style: None,
|
||||||
|
add_modifier: Modifier::empty(),
|
||||||
|
sub_modifier: Modifier::empty(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
styled_graphemes.collect::<Vec<StyledGrapheme>>()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spans
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn spans_width() {
|
||||||
|
let spans = Spans::from(vec![
|
||||||
|
Span::styled("My", Style::default().fg(Color::Yellow)),
|
||||||
|
Span::raw(" text"),
|
||||||
|
]);
|
||||||
|
assert_eq!(7, spans.width());
|
||||||
|
}
|
Loading…
Reference in New Issue