grid.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. use std::io::{self, Write};
  2. use term_grid::{Direction, Filling, Grid, GridOptions};
  3. use crate::fs::filter::FileFilter;
  4. use crate::fs::File;
  5. use crate::output::file_name::Options as FileStyle;
  6. use crate::theme::Theme;
  7. #[derive(PartialEq, Eq, Debug, Copy, Clone)]
  8. pub struct Options {
  9. pub across: bool,
  10. }
  11. impl Options {
  12. pub fn direction(self) -> Direction {
  13. if self.across {
  14. Direction::LeftToRight
  15. } else {
  16. Direction::TopToBottom
  17. }
  18. }
  19. }
  20. pub struct Render<'a> {
  21. pub files: Vec<File<'a>>,
  22. pub theme: &'a Theme,
  23. pub file_style: &'a FileStyle,
  24. pub opts: &'a Options,
  25. pub console_width: usize,
  26. pub filter: &'a FileFilter,
  27. }
  28. impl<'a> Render<'a> {
  29. pub fn render<W: Write>(mut self, w: &mut W) -> io::Result<()> {
  30. self.filter.sort_files(&mut self.files);
  31. let cells = self
  32. .files
  33. .iter()
  34. .map(|file| {
  35. self.file_style
  36. .for_file(file, self.theme)
  37. .paint()
  38. .strings()
  39. .to_string()
  40. })
  41. .collect();
  42. let grid = Grid::new(
  43. cells,
  44. GridOptions {
  45. filling: Filling::Spaces(2),
  46. direction: self.opts.direction(),
  47. width: self.console_width,
  48. },
  49. );
  50. write!(w, "{grid}")
  51. }
  52. }