use std::io::Write;
use crate::{
CURSOR_MOVEMENT_POLICY_KEY, DISPLAY_COLS_KEY, DISPLAY_HEIGHT_SLICE_KEY, DISPLAY_ROWS_KEY,
DISPLAY_START_X_KEY, DISPLAY_START_Y_KEY, DISPLAY_WIDTH_SLICE_KEY, ImageId, PARENT_ID_KEY,
PARENT_PLACEMENT_KEY, PIXEL_X_OFFSET_KEY, PIXEL_Y_OFFSET_KEY, RELATIVE_HORIZ_CELL_OFFSET_KEY,
RELATIVE_VERT_CELL_OFFSET_KEY, VIRTUAL_PLACEMENT_KEY, WriteUint as _, Z_INDEX_KEY
};
#[derive(Default, PartialEq, Clone, Copy, Debug)]
#[repr(u8)]
pub enum CursorMovementPolicy {
#[default]
MoveToAfterImage = 0,
DontMove = 1
}
#[derive(Default, Debug, PartialEq, Clone)]
pub struct DisplayConfig {
pub location: DisplayLocation,
pub cursor_movement: CursorMovementPolicy,
pub create_virtual_placement: bool,
pub parent_id: Option<ImageId>,
pub parent_placement: Option<ImageId>
}
impl DisplayConfig {
pub(crate) fn write_to<W: Write>(&self, mut writer: W) -> std::io::Result<W> {
writer = self.location.write_to(writer)?;
if self.cursor_movement != CursorMovementPolicy::default() {
write!(
writer,
",{CURSOR_MOVEMENT_POLICY_KEY}={}",
self.cursor_movement as u8
)?;
}
if self.create_virtual_placement {
write!(writer, ",{VIRTUAL_PLACEMENT_KEY}=1")?;
}
if let Some(parent_id) = self.parent_id {
writer = writer.write_uint::<PARENT_ID_KEY, _>(parent_id.get())?;
}
if let Some(parent_placement) = self.parent_placement {
writer = writer.write_uint::<PARENT_PLACEMENT_KEY, _>(parent_placement.get())?;
}
Ok(writer)
}
}
#[derive(Default, Debug, PartialEq, Clone)]
pub struct DisplayLocation {
pub x: u32,
pub y: u32,
pub width: u32,
pub height: u32,
pub x_offset: usize,
pub y_offset: usize,
pub columns: u16,
pub rows: u16,
pub z_index: i32,
pub horizontal_offset: i32,
pub vertical_offset: i32
}
impl DisplayLocation {
fn write_to<W: Write>(&self, w: W) -> std::io::Result<W> {
w.write_uint::<DISPLAY_START_X_KEY, _>(self.x)?
.write_uint::<DISPLAY_START_Y_KEY, _>(self.y)?
.write_uint::<DISPLAY_WIDTH_SLICE_KEY, _>(self.width)?
.write_uint::<DISPLAY_HEIGHT_SLICE_KEY, _>(self.height)?
.write_uint::<PIXEL_X_OFFSET_KEY, _>(self.x_offset)?
.write_uint::<PIXEL_Y_OFFSET_KEY, _>(self.y_offset)?
.write_uint::<DISPLAY_COLS_KEY, _>(self.columns)?
.write_uint::<DISPLAY_ROWS_KEY, _>(self.rows)?
.write_uint::<Z_INDEX_KEY, _>(self.z_index)?
.write_uint::<RELATIVE_HORIZ_CELL_OFFSET_KEY, _>(self.horizontal_offset)?
.write_uint::<RELATIVE_VERT_CELL_OFFSET_KEY, _>(self.vertical_offset)
}
}