zellij/zellij-tile/src/ui_components/nested_list.rs
Zykino b10ccb8b6f
feat(plugins): format UI components API (#3193)
* feat: Add serialization methods to ui components

* Revert: do not modify the `print` method at all

---------

Co-authored-by: Zykino <3809938+Zykino@users.noreply.github.com>
2024-04-05 15:02:36 +02:00

111 lines
2.9 KiB
Rust

use super::Text;
use std::borrow::Borrow;
use std::ops::RangeBounds;
#[derive(Debug, Default, Clone)]
pub struct NestedListItem {
indentation_level: usize,
content: Text,
}
impl NestedListItem {
pub fn new<S: AsRef<str>>(text: S) -> Self
where
S: ToString,
{
NestedListItem {
content: Text::new(text),
..Default::default()
}
}
pub fn indent(mut self, indentation_level: usize) -> Self {
self.indentation_level = indentation_level;
self
}
pub fn selected(mut self) -> Self {
self.content = self.content.selected();
self
}
pub fn color_indices(mut self, index_level: usize, indices: Vec<usize>) -> Self {
self.content = self.content.color_indices(index_level, indices);
self
}
pub fn color_range<R: RangeBounds<usize>>(mut self, index_level: usize, indices: R) -> Self {
self.content = self.content.color_range(index_level, indices);
self
}
pub fn serialize(&self) -> String {
let mut serialized = String::new();
for _ in 0..self.indentation_level {
serialized.push('|');
}
format!("{}{}", serialized, self.content.serialize())
}
}
/// render a nested list with arbitrary data
pub fn print_nested_list(items: Vec<NestedListItem>) {
let items = items
.into_iter()
.map(|i| i.serialize())
.collect::<Vec<_>>()
.join(";");
print!("\u{1b}Pznested_list;{}\u{1b}\\", items)
}
pub fn print_nested_list_with_coordinates(
items: Vec<NestedListItem>,
x: usize,
y: usize,
width: Option<usize>,
height: Option<usize>,
) {
let width = width.map(|w| w.to_string()).unwrap_or_default();
let height = height.map(|h| h.to_string()).unwrap_or_default();
let items = items
.into_iter()
.map(|i| i.serialize())
.collect::<Vec<_>>()
.join(";");
print!(
"\u{1b}Pznested_list;{}/{}/{}/{};{}\u{1b}\\",
x, y, width, height, items
)
}
pub fn serialize_nested_list<I>(items: I) -> String
where
I: IntoIterator,
I::Item: Borrow<NestedListItem>,
{
let items = items
.into_iter()
.map(|i| i.borrow().serialize())
.collect::<Vec<_>>()
.join(";");
format!("\u{1b}Pznested_list;{}\u{1b}\\", items)
}
pub fn serialize_nested_list_with_coordinates<I>(
items: I,
x: usize,
y: usize,
width: Option<usize>,
height: Option<usize>,
) -> String
where
I: IntoIterator,
I::Item: Borrow<NestedListItem>,
{
let width = width.map(|w| w.to_string()).unwrap_or_default();
let height = height.map(|h| h.to_string()).unwrap_or_default();
let items = items
.into_iter()
.map(|i| i.borrow().serialize())
.collect::<Vec<_>>()
.join(";");
format!(
"\u{1b}Pznested_list;{}/{}/{}/{};{}\u{1b}\\",
x, y, width, height, items
)
}