111 lines
3.5 KiB
Rust
111 lines
3.5 KiB
Rust
use egui_ratatui::RataguiBackend;
|
|
use ratatui::Terminal;
|
|
use soft_ratatui::embedded_graphics_unicodefonts::{
|
|
mono_10x20_atlas, mono_6x13_atlas, mono_6x13_bold_atlas, mono_6x13_italic_atlas,
|
|
mono_7x13_atlas, mono_7x13_bold_atlas, mono_7x13_italic_atlas, mono_8x13_atlas,
|
|
mono_8x13_bold_atlas, mono_8x13_italic_atlas, mono_9x15_atlas, mono_9x15_bold_atlas,
|
|
mono_9x18_atlas, mono_9x18_bold_atlas,
|
|
};
|
|
use soft_ratatui::{EmbeddedGraphics, SoftBackend};
|
|
|
|
use crate::block_renderer::BlockCharBackend;
|
|
|
|
pub type TerminalType = Terminal<RataguiBackend<BlockCharBackend>>;
|
|
|
|
#[derive(Clone, Copy, PartialEq)]
|
|
pub enum FontChoice {
|
|
Size6x13,
|
|
Size7x13,
|
|
Size8x13,
|
|
Size9x15,
|
|
Size9x18,
|
|
Size10x20,
|
|
}
|
|
|
|
impl FontChoice {
|
|
pub fn from_setting(s: &str) -> Self {
|
|
match s {
|
|
"6x13" => Self::Size6x13,
|
|
"7x13" => Self::Size7x13,
|
|
"9x15" => Self::Size9x15,
|
|
"9x18" => Self::Size9x18,
|
|
"10x20" => Self::Size10x20,
|
|
_ => Self::Size8x13,
|
|
}
|
|
}
|
|
|
|
pub fn to_setting(self) -> &'static str {
|
|
match self {
|
|
Self::Size6x13 => "6x13",
|
|
Self::Size7x13 => "7x13",
|
|
Self::Size8x13 => "8x13",
|
|
Self::Size9x15 => "9x15",
|
|
Self::Size9x18 => "9x18",
|
|
Self::Size10x20 => "10x20",
|
|
}
|
|
}
|
|
|
|
pub fn label(self) -> &'static str {
|
|
match self {
|
|
Self::Size6x13 => "6x13 (Compact)",
|
|
Self::Size7x13 => "7x13",
|
|
Self::Size8x13 => "8x13 (Default)",
|
|
Self::Size9x15 => "9x15",
|
|
Self::Size9x18 => "9x18",
|
|
Self::Size10x20 => "10x20 (Large)",
|
|
}
|
|
}
|
|
|
|
pub const ALL: [Self; 6] = [
|
|
Self::Size6x13,
|
|
Self::Size7x13,
|
|
Self::Size8x13,
|
|
Self::Size9x15,
|
|
Self::Size9x18,
|
|
Self::Size10x20,
|
|
];
|
|
}
|
|
|
|
pub fn create_terminal(font: FontChoice) -> TerminalType {
|
|
let (regular, bold, italic) = match font {
|
|
FontChoice::Size6x13 => (
|
|
mono_6x13_atlas(),
|
|
Some(mono_6x13_bold_atlas()),
|
|
Some(mono_6x13_italic_atlas()),
|
|
),
|
|
FontChoice::Size7x13 => (
|
|
mono_7x13_atlas(),
|
|
Some(mono_7x13_bold_atlas()),
|
|
Some(mono_7x13_italic_atlas()),
|
|
),
|
|
FontChoice::Size8x13 => (
|
|
mono_8x13_atlas(),
|
|
Some(mono_8x13_bold_atlas()),
|
|
Some(mono_8x13_italic_atlas()),
|
|
),
|
|
FontChoice::Size9x15 => (mono_9x15_atlas(), Some(mono_9x15_bold_atlas()), None),
|
|
FontChoice::Size9x18 => (mono_9x18_atlas(), Some(mono_9x18_bold_atlas()), None),
|
|
FontChoice::Size10x20 => (mono_10x20_atlas(), None, None),
|
|
};
|
|
|
|
// SoftBackend fields are copied individually to wrap raster_backend in BlockCharBackend.
|
|
// If soft_ratatui changes its field layout, this will fail to compile — that's intentional.
|
|
let eg = SoftBackend::<EmbeddedGraphics>::new(80, 24, regular, bold, italic);
|
|
let soft = SoftBackend {
|
|
buffer: eg.buffer,
|
|
cursor: eg.cursor,
|
|
cursor_pos: eg.cursor_pos,
|
|
char_width: eg.char_width,
|
|
char_height: eg.char_height,
|
|
blink_counter: eg.blink_counter,
|
|
blinking_fast: eg.blinking_fast,
|
|
blinking_slow: eg.blinking_slow,
|
|
rgb_pixmap: eg.rgb_pixmap,
|
|
always_redraw_list: eg.always_redraw_list,
|
|
raster_backend: BlockCharBackend {
|
|
inner: eg.raster_backend,
|
|
},
|
|
};
|
|
Terminal::new(RataguiBackend::new("cagire", soft)).expect("terminal")
|
|
}
|