use crate::core::component::ScrollbarVisibility;
use crate::style::{Rect, Span};
use crate::text::line_index::TextPosition;
use super::virtual_text;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum TextAreaLineNumberMode {
#[default]
Absolute,
Relative,
}
#[allow(missing_docs)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TextAreaMetrics {
pub rect: Rect,
pub inner_rect: Rect,
pub content_rect: Rect,
pub gutter_width: u16,
pub scroll_offset: usize,
pub h_scroll_offset: usize,
pub visible_logical_lines: std::ops::Range<usize>,
pub visible_visual_rows: std::ops::Range<usize>,
pub total_logical_lines: usize,
pub total_visual_lines: usize,
pub scrollbars: ScrollbarVisibility,
pub cursor: Option<TextAreaCursorMetrics>,
pub editor_cursor: Option<TextAreaCursorMetrics>,
}
#[allow(missing_docs)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TextAreaCursorMetrics {
pub byte_offset: usize,
pub position: TextPosition,
pub rect: Rect,
pub visible: bool,
}
#[allow(missing_docs)]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct TextAreaVirtualText {
pub anchor: usize,
pub content: Vec<Span>,
pub placement: VirtualTextPlacement,
pub priority: u16,
}
impl TextAreaVirtualText {
pub fn new(
anchor: usize,
content: impl Into<Vec<Span>>,
placement: VirtualTextPlacement,
) -> Self {
Self {
anchor,
content: virtual_text::sanitize_virtual_text_spans(content.into()),
placement,
priority: 0,
}
}
pub fn inline(anchor: usize, content: impl Into<Vec<Span>>) -> Self {
Self::new(anchor, content, VirtualTextPlacement::Inline)
}
pub fn eol(anchor: usize, content: impl Into<Vec<Span>>) -> Self {
Self::new(anchor, content, VirtualTextPlacement::Eol)
}
pub fn priority(mut self, priority: u16) -> Self {
self.priority = priority;
self
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum VirtualTextPlacement {
Inline,
Eol,
}