mod.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. use cell::Cell;
  2. use crate::utils::{position::Position, rectangle::Rectangle};
  3. use super::{colors::Colors, style::CharStyle};
  4. pub mod cell;
  5. pub struct ContentRenderBuffer {
  6. pub rectangle: Rectangle,
  7. pub cells: Vec<Option<Cell>>,
  8. }
  9. impl ContentRenderBuffer {
  10. pub fn new(rectangle: Rectangle) -> ContentRenderBuffer {
  11. let cells = vec![None; rectangle.height * rectangle.width];
  12. ContentRenderBuffer { rectangle, cells }
  13. }
  14. pub fn set_cell(&mut self, position: Position, cell: Option<Cell>) {
  15. let index = position.line * self.rectangle.width + position.offset;
  16. if index < self.cells.len() {
  17. self.cells[index] = cell;
  18. }
  19. }
  20. pub fn put_buffer(
  21. &mut self,
  22. position: Position,
  23. buffer: String,
  24. style: CharStyle,
  25. colors: Colors,
  26. ) {
  27. let mut line = position.line;
  28. let mut offset = position.offset;
  29. for c in buffer.chars() {
  30. let index = line * self.rectangle.width + offset;
  31. if index < self.cells.len() {
  32. let cell = Cell {
  33. content: c,
  34. colors,
  35. style,
  36. };
  37. self.cells[index] = Some(cell);
  38. offset += 1;
  39. if offset == self.rectangle.width {
  40. line += 1;
  41. offset = 0;
  42. }
  43. } else {
  44. break;
  45. }
  46. }
  47. }
  48. }