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>; #[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::::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") }