use crate::theme::{ActiveTheme, Themeable};
use gpui::{div, prelude::*, rems, App, ElementId, ParentElement, Styled};
use super::super::inline_style::{InlinePalette, RichText};
use super::super::selectable_text::RunRole;
use super::super::style::TextStyle;
use super::paragraph::{rich_text_run, RunContext};
pub fn list_item(
text: impl Into<String>,
marker: String,
indent_level: usize,
style: &TextStyle,
cx: &App,
) -> impl IntoElement {
let text: String = text.into();
let indent = rems(indent_level as f32 * 1.5);
let theme = cx.theme();
let text_color = style.color.unwrap_or(theme.fg());
div()
.flex()
.flex_row()
.pl(indent)
.gap(rems(0.5))
.text_size(rems(style.size))
.line_height(rems(style.size * style.line_height))
.text_color(text_color)
.child(div().flex_none().child(marker))
.child(div().flex_1().min_w_0().child(text))
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) enum ItemMarker {
Shown(String),
Hidden(String),
}
impl ItemMarker {
pub(crate) fn text(&self) -> &str {
match self {
ItemMarker::Shown(marker) | ItemMarker::Hidden(marker) => marker,
}
}
fn run_role(&self) -> RunRole {
match self {
ItemMarker::Shown(_) => RunRole::ListItem,
ItemMarker::Hidden(_) => RunRole::Paragraph,
}
}
}
#[allow(clippy::too_many_arguments)]
pub(crate) fn rich_list_item(
id: impl Into<ElementId>,
rich_text: &RichText,
marker: ItemMarker,
indent_level: usize,
style: &TextStyle,
palette: &InlinePalette,
run_cx: RunContext,
cx: &App,
) -> impl IntoElement {
let indent = rems(indent_level as f32 * 1.5);
let theme = cx.theme();
let text_color = style.color.unwrap_or(theme.fg());
let role = marker.run_role();
let hidden = matches!(marker, ItemMarker::Hidden(_));
let marker_text = marker.text().to_string();
div()
.flex()
.flex_row()
.pl(indent)
.gap(rems(0.5))
.text_size(rems(style.size))
.line_height(rems(style.size * style.line_height))
.text_color(text_color)
.child(
div()
.flex_none()
.when(hidden, |el| el.opacity(0.))
.child(marker_text),
)
.child(
div()
.flex_1()
.min_w_0()
.child(rich_text_run(id, rich_text, palette, role, run_cx)),
)
}
pub fn unordered_marker() -> String {
"•".to_string()
}
pub fn ordered_marker(index: u64) -> String {
format!("{}.", index)
}