formular lesen (binär) und openspec für codex

This commit is contained in:
2026-09-05 08:36:40 +02:00
parent 05837cd846
commit 1cb6ae8fd9
34 changed files with 2211 additions and 149 deletions

View File

@@ -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 031, hg 07). 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');
}
}