use crate::{
style::is_plain_style,
text::{is_default_wrap_opts, Span, WrapOpts},
Style,
};
use serde::{Deserialize, Serialize};
fn is_default_charset(c: &BoxCharset) -> bool {
*c == BoxCharset::default()
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct Frame {
pub ops: Vec<RenderOp>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BlitCell {
pub glyph: String,
#[serde(default, skip_serializing_if = "is_plain_style")]
pub style: Style,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum BoxCharset {
Ascii,
#[default]
UnicodeSingle,
UnicodeDouble,
}
fn is_default_truncate_mode(m: &TruncateMode) -> bool {
*m == TruncateMode::default()
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum TruncateMode {
#[default]
Clip,
Ellipsis,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "op", rename_all = "snake_case")]
pub enum RenderOp {
Clear,
ClearLine { y: u16 },
ClearEol { x: u16, y: u16 },
ClearBol { x: u16, y: u16 },
ClearEos { x: u16, y: u16 },
ClearRect { x: u16, y: u16, w: u16, h: u16 },
Put {
x: u16,
y: u16,
text: String,
#[serde(default, skip_serializing_if = "is_plain_style")]
style: Style,
},
PutGlyph {
x: u16,
y: u16,
glyph: String,
#[serde(default, skip_serializing_if = "is_plain_style")]
style: Style,
},
Label {
x: u16,
y: u16,
w: u16,
text: String,
#[serde(default, skip_serializing_if = "is_plain_style")]
style: Style,
#[serde(default, skip_serializing_if = "is_default_truncate_mode")]
truncate: TruncateMode,
},
LabelStyled {
x: u16,
y: u16,
w: u16,
spans: Vec<Span>,
#[serde(default, skip_serializing_if = "is_default_truncate_mode")]
truncate: TruncateMode,
},
TextBlock {
x: u16,
y: u16,
w: u16,
h: u16,
text: String,
#[serde(default, skip_serializing_if = "is_plain_style")]
style: Style,
#[serde(default, skip_serializing_if = "is_default_wrap_opts")]
wrap: WrapOpts,
},
TextBlockStyled {
x: u16,
y: u16,
w: u16,
h: u16,
spans: Vec<Span>,
#[serde(default, skip_serializing_if = "is_default_wrap_opts")]
wrap: WrapOpts,
},
FillRect {
x: u16,
y: u16,
w: u16,
h: u16,
glyph: String,
#[serde(default, skip_serializing_if = "is_plain_style")]
style: Style,
},
Box {
x: u16,
y: u16,
w: u16,
h: u16,
#[serde(default, skip_serializing_if = "is_default_charset")]
charset: BoxCharset,
#[serde(default, skip_serializing_if = "is_plain_style")]
style: Style,
},
Blit {
x: u16,
y: u16,
w: u16,
h: u16,
cells: Vec<Option<BlitCell>>,
},
}