formular lesen (binär) und openspec für codex
This commit is contained in:
@@ -39,7 +39,12 @@ pub struct Cell {
|
||||
|
||||
impl Default for Cell {
|
||||
fn default() -> Self {
|
||||
Cell { ch: ' ', fg: 7, bg: 0, fortsetzung: false }
|
||||
Cell {
|
||||
ch: ' ',
|
||||
fg: 7,
|
||||
bg: 0,
|
||||
fortsetzung: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,8 +130,15 @@ impl TextScreen {
|
||||
if cols == self.cols && rows == self.rows {
|
||||
return;
|
||||
}
|
||||
let mut cells =
|
||||
vec![Cell { ch: ' ', fg: self.fg, bg: self.bg, fortsetzung: false }; cols * rows];
|
||||
let mut cells = vec![
|
||||
Cell {
|
||||
ch: ' ',
|
||||
fg: self.fg,
|
||||
bg: self.bg,
|
||||
fortsetzung: false
|
||||
};
|
||||
cols * rows
|
||||
];
|
||||
for row in 0..self.rows.min(rows) {
|
||||
for col in 0..self.cols.min(cols) {
|
||||
cells[row * cols + col] = self.cells[row * self.cols + col];
|
||||
@@ -158,7 +170,12 @@ impl TextScreen {
|
||||
/// Cursor an den Anfang des Bereichs.
|
||||
pub fn cls(&mut self) {
|
||||
self.veraendert = true;
|
||||
let blank = Cell { ch: ' ', fg: self.fg, bg: self.bg, fortsetzung: false };
|
||||
let blank = Cell {
|
||||
ch: ' ',
|
||||
fg: self.fg,
|
||||
bg: self.bg,
|
||||
fortsetzung: false,
|
||||
};
|
||||
for row in self.view_top..=self.view_bottom {
|
||||
self.cells[row * self.cols..(row + 1) * self.cols].fill(blank);
|
||||
}
|
||||
@@ -190,7 +207,11 @@ impl TextScreen {
|
||||
|
||||
/// Breite der belegten Zeile `z` (1-basiert); 0 für unberührte Zeilen.
|
||||
pub fn belegte_breite(&self, z: usize) -> usize {
|
||||
self.belegt.get(z - 1).copied().flatten().map_or(0, |c| c + 1)
|
||||
self.belegt
|
||||
.get(z - 1)
|
||||
.copied()
|
||||
.flatten()
|
||||
.map_or(0, |c| c + 1)
|
||||
}
|
||||
|
||||
/// `COLOR vg, hg` (vg 0–31, hg 0–7). Blinkende Vordergrundfarben
|
||||
@@ -273,10 +294,19 @@ impl TextScreen {
|
||||
let attr = (self.fg, self.bg);
|
||||
let start = self.cur_row * self.cols + self.cur_col;
|
||||
self.haelften_freimachen(self.cur_col, breite);
|
||||
self.cells[start] = Cell { ch, fg: attr.0, bg: attr.1, fortsetzung: false };
|
||||
self.cells[start] = Cell {
|
||||
ch,
|
||||
fg: attr.0,
|
||||
bg: attr.1,
|
||||
fortsetzung: false,
|
||||
};
|
||||
for i in 1..breite {
|
||||
self.cells[start + i] =
|
||||
Cell { ch: ' ', fg: attr.0, bg: attr.1, fortsetzung: true };
|
||||
self.cells[start + i] = Cell {
|
||||
ch: ' ',
|
||||
fg: attr.0,
|
||||
bg: attr.1,
|
||||
fortsetzung: true,
|
||||
};
|
||||
}
|
||||
let letzte = self.cur_col + breite - 1;
|
||||
let b = &mut self.belegt[self.cur_row];
|
||||
@@ -293,7 +323,12 @@ impl TextScreen {
|
||||
/// dessen Fortsetzung geleert. Sonst blieben Geisterzeichen stehen.
|
||||
fn haelften_freimachen(&mut self, col: usize, breite: usize) {
|
||||
let zeilenanfang = self.cur_row * self.cols;
|
||||
let leer = Cell { ch: ' ', fg: self.fg, bg: self.bg, fortsetzung: false };
|
||||
let leer = Cell {
|
||||
ch: ' ',
|
||||
fg: self.fg,
|
||||
bg: self.bg,
|
||||
fortsetzung: false,
|
||||
};
|
||||
if col > 0 && self.cells[zeilenanfang + col].fortsetzung {
|
||||
self.cells[zeilenanfang + col - 1] = leer;
|
||||
}
|
||||
@@ -323,12 +358,20 @@ impl TextScreen {
|
||||
self.cur_col -= 1;
|
||||
// War das gelöschte eine Fortsetzung, gehört die Hälfte davor dazu.
|
||||
if self.cells[self.cur_row * self.cols + self.cur_col].fortsetzung && self.cur_col > 0 {
|
||||
self.cells[self.cur_row * self.cols + self.cur_col] =
|
||||
Cell { ch: ' ', fg: self.fg, bg: self.bg, fortsetzung: false };
|
||||
self.cells[self.cur_row * self.cols + self.cur_col] = Cell {
|
||||
ch: ' ',
|
||||
fg: self.fg,
|
||||
bg: self.bg,
|
||||
fortsetzung: false,
|
||||
};
|
||||
self.cur_col -= 1;
|
||||
}
|
||||
self.cells[self.cur_row * self.cols + self.cur_col] =
|
||||
Cell { ch: ' ', fg: self.fg, bg: self.bg, fortsetzung: false };
|
||||
self.cells[self.cur_row * self.cols + self.cur_col] = Cell {
|
||||
ch: ' ',
|
||||
fg: self.fg,
|
||||
bg: self.bg,
|
||||
fortsetzung: false,
|
||||
};
|
||||
// Die gelöschte Zelle gilt nicht mehr als belegt.
|
||||
let b = &mut self.belegt[self.cur_row];
|
||||
*b = match (self.cur_col, *b) {
|
||||
@@ -342,13 +385,17 @@ impl TextScreen {
|
||||
/// Scrollbereich um eine Zeile nach oben schieben; unterste Zeile leeren.
|
||||
pub fn scroll_up(&mut self) {
|
||||
self.veraendert = true;
|
||||
let blank = Cell { ch: ' ', fg: self.fg, bg: self.bg, fortsetzung: false };
|
||||
let blank = Cell {
|
||||
ch: ' ',
|
||||
fg: self.fg,
|
||||
bg: self.bg,
|
||||
fortsetzung: false,
|
||||
};
|
||||
for row in self.view_top..self.view_bottom {
|
||||
let (a, b) = self.cells.split_at_mut((row + 1) * self.cols);
|
||||
a[row * self.cols..].copy_from_slice(&b[..self.cols]);
|
||||
}
|
||||
self.cells[self.view_bottom * self.cols..(self.view_bottom + 1) * self.cols]
|
||||
.fill(blank);
|
||||
self.cells[self.view_bottom * self.cols..(self.view_bottom + 1) * self.cols].fill(blank);
|
||||
for row in self.view_top..self.view_bottom {
|
||||
self.belegt[row] = self.belegt[row + 1];
|
||||
}
|
||||
@@ -553,5 +600,4 @@ mod tests {
|
||||
assert_eq!(s.cell(39, 1).ch, 'a');
|
||||
assert_eq!(s.cell(40, 1).ch, 'b');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user