raekna-ui 0.2.1

This crate contains functionality to draw a plain text calculator using wgpu.
Documentation
use raekna_common::EditPosition;

#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
pub struct CaretPosition {
    pub line: usize,
    pub column: usize,
    pub actual_column: usize,
}

impl CaretPosition {
    pub fn new(line_widths: &[usize]) -> Self {
        let line = line_widths.len().saturating_sub(1);
        let column = if line_widths.is_empty() {
            0
        } else {
            line_widths[line]
        };
        let actual_column = column;
        Self {
            line,
            column,
            actual_column,
        }
    }

    pub fn set_position(&mut self, line: usize, column: usize) {
        self.line = line;
        self.column = column;
        self.actual_column = column;
    }

    pub fn move_up(&mut self, line_widths: &[usize]) -> bool {
        if self.line == 0 && self.column == 0 {
            false
        } else {
            if self.line == 0 {
                self.column = 0;
            } else {
                self.line = self.line.saturating_sub(1);
                let line_width = line_widths[self.line];
                if line_width < self.actual_column {
                    self.column = line_width;
                } else if self.column != self.actual_column {
                    self.column = self.actual_column;
                }
            }
            true
        }
    }
    pub fn move_down(&mut self, line_widths: &[usize]) -> bool {
        if self.line == line_widths.len().saturating_sub(1) && self.column == line_widths[self.line]
        {
            false
        } else {
            if self.line == line_widths.len().saturating_sub(1) {
                self.column = line_widths[self.line];
            } else {
                self.line += 1;
                let line_width = line_widths[self.line];
                if line_width < self.actual_column {
                    self.column = line_width;
                } else if self.column != self.actual_column {
                    self.column = self.actual_column;
                }
            }
            true
        }
    }

    pub fn move_left(&mut self, line_widths: &[usize]) -> bool {
        if self.line == 0 && self.column == 0 {
            false
        } else {
            if self.column == 0 {
                self.line -= 1;
                self.column = line_widths[self.line];
            } else {
                self.column -= 1;
            }
            self.actual_column = self.column;
            true
        }
    }
    pub fn move_right(&mut self, line_widths: &[usize]) -> bool {
        if self.line == line_widths.len() - 1 && self.column == line_widths[self.line] {
            false
        } else {
            if self.column == line_widths[self.line] {
                self.line += 1;
                self.column = 0;
            } else {
                self.column += 1;
            }
            self.actual_column = self.column;
            true
        }
    }

    pub fn home(&mut self) -> bool {
        if self.column == 0 {
            self.actual_column = self.column;
            false
        } else {
            self.column = 0;
            self.actual_column = self.column;
            true
        }
    }

    pub fn end(&mut self, line_widths: &[usize]) -> bool {
        if self.column == line_widths[self.line] {
            self.actual_column = self.column;
            false
        } else {
            self.column = line_widths[self.line];
            self.actual_column = self.column;
            true
        }
    }

    pub fn page_up(&mut self) -> bool {
        if self.line == 0 && self.column == 0 {
            false
        } else {
            self.line = 0;
            self.column = 0;
            self.actual_column = self.column;
            true
        }
    }

    pub fn page_down(&mut self, line_widths: &[usize]) -> bool {
        if self.line == line_widths.len() - 1 && self.column == line_widths[self.line] {
            false
        } else {
            self.line = line_widths.len() - 1;
            self.column = line_widths[self.line];
            self.actual_column = self.column;
            true
        }
    }
}

impl From<CaretPosition> for EditPosition {
    fn from(cp: CaretPosition) -> Self {
        Self {
            line: cp.line,
            column: cp.column,
        }
    }
}

impl From<EditPosition> for CaretPosition {
    fn from(ep: EditPosition) -> Self {
        Self {
            line: ep.line,
            column: ep.column,
            actual_column: ep.column,
        }
    }
}