Row-major or col-major, no need for exact grid
This commit is contained in:
		
							parent
							
								
									2e771773b6
								
							
						
					
					
						commit
						79f03b27bf
					
				
							
								
								
									
										75
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								src/lib.rs
									
									
									
									
									
								
							@ -36,18 +36,11 @@ struct Multiview<W: Write> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /// Last time when the rendering was performed.
 | 
					    /// Last time when the rendering was performed.
 | 
				
			||||||
    pub last_render: Instant,
 | 
					    pub last_render: Instant,
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// The size of the terminal.
 | 
					 | 
				
			||||||
    pub term_size: (u16, u16),
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl<W: Write> Multiview<W> {
 | 
					impl<W: Write> Multiview<W> {
 | 
				
			||||||
    /// Creates a new multiview.
 | 
					    /// Creates a new multiview.
 | 
				
			||||||
    pub fn new(
 | 
					    pub fn new(stdout: W, tiles: Vec<Vec<Tile>>) -> io::Result<Multiview<W>> {
 | 
				
			||||||
        stdout: W,
 | 
					 | 
				
			||||||
        tiles: Vec<Vec<Tile>>,
 | 
					 | 
				
			||||||
        term_size: (u16, u16),
 | 
					 | 
				
			||||||
    ) -> io::Result<Multiview<W>> {
 | 
					 | 
				
			||||||
        let mut multiview = Multiview {
 | 
					        let mut multiview = Multiview {
 | 
				
			||||||
            stdout,
 | 
					            stdout,
 | 
				
			||||||
            tiles,
 | 
					            tiles,
 | 
				
			||||||
@ -55,7 +48,6 @@ impl<W: Write> Multiview<W> {
 | 
				
			|||||||
            refresh_ui: true,
 | 
					            refresh_ui: true,
 | 
				
			||||||
            refresh_tiles: false,
 | 
					            refresh_tiles: false,
 | 
				
			||||||
            last_render: Instant::now(),
 | 
					            last_render: Instant::now(),
 | 
				
			||||||
            term_size,
 | 
					 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        write!(
 | 
					        write!(
 | 
				
			||||||
@ -82,11 +74,17 @@ impl<W: Write> Multiview<W> {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Sets the selected tile from (x, y) coordinates.
 | 
					    /// Sets the selected tile from (x, y) coordinates.
 | 
				
			||||||
    pub fn select_tile(&mut self, (x, y): (u16, u16), term_size: (u16, u16)) {
 | 
					    pub fn select_tile(&mut self, (x, y): (u16, u16)) {
 | 
				
			||||||
        let w = term_size.0 / self.tiles[0].len() as u16;
 | 
					        // Ugly but working
 | 
				
			||||||
        let h = term_size.1 / self.tiles.len() as u16;
 | 
					        for (i, row) in self.tiles.iter().enumerate() {
 | 
				
			||||||
 | 
					            for (j, tile) in row.iter().enumerate() {
 | 
				
			||||||
        self.selected = (y / h, x / w);
 | 
					                if tile.outer_position.0 <= x && x < tile.outer_position.0 + tile.outer_size.0 {
 | 
				
			||||||
 | 
					                    if tile.outer_position.1 <= y && y < tile.outer_position.1 + tile.outer_size.1 {
 | 
				
			||||||
 | 
					                        self.selected = (i as u16, j as u16);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        self.refresh_ui = true;
 | 
					        self.refresh_ui = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -118,7 +116,7 @@ impl<W: Write> Multiview<W> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        let mut buffer = vec![];
 | 
					        let mut buffer = vec![];
 | 
				
			||||||
        for i in 0..self.tiles.len() {
 | 
					        for i in 0..self.tiles.len() {
 | 
				
			||||||
            for j in 0..self.tiles[0].len() {
 | 
					            for j in 0..self.tiles[i].len() {
 | 
				
			||||||
                if self.refresh_ui {
 | 
					                if self.refresh_ui {
 | 
				
			||||||
                    buffer.push(self.render_tile_border((i as u16, j as u16)));
 | 
					                    buffer.push(self.render_tile_border((i as u16, j as u16)));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -232,7 +230,7 @@ impl<W: Write> Multiview<W> {
 | 
				
			|||||||
        match msg {
 | 
					        match msg {
 | 
				
			||||||
            Msg::Stdout(coords, line) => self.push_stdout(coords, line),
 | 
					            Msg::Stdout(coords, line) => self.push_stdout(coords, line),
 | 
				
			||||||
            Msg::Stderr(coords, line) => self.push_stderr(coords, line),
 | 
					            Msg::Stderr(coords, line) => self.push_stderr(coords, line),
 | 
				
			||||||
            Msg::Click(x, y) => self.select_tile((x, y), self.term_size),
 | 
					            Msg::Click(x, y) => self.select_tile((x, y)),
 | 
				
			||||||
            Msg::Restart => self.restart(),
 | 
					            Msg::Restart => self.restart(),
 | 
				
			||||||
            Msg::RestartAll => self.restart_all(),
 | 
					            Msg::RestartAll => self.restart_all(),
 | 
				
			||||||
            Msg::Kill => self.kill(),
 | 
					            Msg::Kill => self.kill(),
 | 
				
			||||||
@ -308,9 +306,33 @@ pub fn main() -> io::Result<()> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    let args = env::args().skip(1).collect::<Vec<_>>();
 | 
					    let args = env::args().skip(1).collect::<Vec<_>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut is_row_major = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for arg in &args {
 | 
				
			||||||
 | 
					        if arg == "//" {
 | 
				
			||||||
 | 
					            is_row_major = false;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if arg == "::" {
 | 
				
			||||||
 | 
					            is_row_major = true;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let (first_split, second_split) = if is_row_major {
 | 
				
			||||||
 | 
					        ("//", "::")
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        ("::", "//")
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let tiles = args
 | 
					    let tiles = args
 | 
				
			||||||
        .split(|x| x == "//")
 | 
					        .split(|x| x == first_split)
 | 
				
			||||||
        .map(|x| x.split(|y| y == "::").enumerate().collect::<Vec<_>>())
 | 
					        .map(|x| {
 | 
				
			||||||
 | 
					            x.split(|y| y == second_split)
 | 
				
			||||||
 | 
					                .enumerate()
 | 
				
			||||||
 | 
					                .collect::<Vec<_>>()
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
        .enumerate()
 | 
					        .enumerate()
 | 
				
			||||||
        .map(|(i, tiles)| {
 | 
					        .map(|(i, tiles)| {
 | 
				
			||||||
            tiles
 | 
					            tiles
 | 
				
			||||||
@ -322,16 +344,23 @@ pub fn main() -> io::Result<()> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    let term_size = terminal_size()?;
 | 
					    let term_size = terminal_size()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let tile_size = (
 | 
					    let col_len = tiles.len() as u16;
 | 
				
			||||||
        term_size.0 / tiles[0].len() as u16,
 | 
					 | 
				
			||||||
        term_size.1 / tiles.len() as u16,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let tiles = tiles
 | 
					    let tiles = tiles
 | 
				
			||||||
        .into_iter()
 | 
					        .into_iter()
 | 
				
			||||||
        .map(|row| {
 | 
					        .map(|row| {
 | 
				
			||||||
 | 
					            let row_len = row.len() as u16;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let tile_size = if is_row_major {
 | 
				
			||||||
 | 
					                (term_size.0 / row_len, term_size.1 / col_len)
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                (term_size.0 / col_len, term_size.1 / row_len)
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            row.into_iter()
 | 
					            row.into_iter()
 | 
				
			||||||
                .map(|((i, j), tile)| {
 | 
					                .map(|((i, j), tile)| {
 | 
				
			||||||
 | 
					                    let (i, j) = if is_row_major { (i, j) } else { (j, i) };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    TileBuilder::new()
 | 
					                    TileBuilder::new()
 | 
				
			||||||
                        .command(tile.into())
 | 
					                        .command(tile.into())
 | 
				
			||||||
                        .coords((i as u16, j as u16))
 | 
					                        .coords((i as u16, j as u16))
 | 
				
			||||||
@ -350,7 +379,7 @@ pub fn main() -> io::Result<()> {
 | 
				
			|||||||
    let stdout = stdout.into_alternate_screen()?;
 | 
					    let stdout = stdout.into_alternate_screen()?;
 | 
				
			||||||
    let stdout = MouseTerminal::from(stdout);
 | 
					    let stdout = MouseTerminal::from(stdout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut multiview = Multiview::new(stdout, tiles, term_size)?;
 | 
					    let mut multiview = Multiview::new(stdout, tiles)?;
 | 
				
			||||||
    multiview.render(true)?;
 | 
					    multiview.render(true)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for row in &mut multiview.tiles {
 | 
					    for row in &mut multiview.tiles {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										38
									
								
								src/tile.rs
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								src/tile.rs
									
									
									
									
									
								
							@ -165,12 +165,44 @@ impl Tile {
 | 
				
			|||||||
        let pty = Pty::new().unwrap();
 | 
					        let pty = Pty::new().unwrap();
 | 
				
			||||||
        pty.resize(pty_process::Size::new(size.1, size.0)).unwrap();
 | 
					        pty.resize(pty_process::Size::new(size.1, size.0)).unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let mut child = Command::new(&clone[0])
 | 
					        let child = Command::new(&clone[0])
 | 
				
			||||||
            .args(&clone[1..])
 | 
					            .args(&clone[1..])
 | 
				
			||||||
            .stdout(Stdio::piped())
 | 
					            .stdout(Stdio::piped())
 | 
				
			||||||
            .stderr(Stdio::piped())
 | 
					            .stderr(Stdio::piped())
 | 
				
			||||||
            .spawn(&pty.pts().unwrap())
 | 
					            .spawn(&pty.pts().unwrap());
 | 
				
			||||||
            .unwrap();
 | 
					
 | 
				
			||||||
 | 
					        let mut child = match child {
 | 
				
			||||||
 | 
					            Ok(c) => c,
 | 
				
			||||||
 | 
					            Err(e) => {
 | 
				
			||||||
 | 
					                let exit_string = format!(
 | 
				
			||||||
 | 
					                    "{}{}Couldn't run command: {}\r{}",
 | 
				
			||||||
 | 
					                    style::Bold,
 | 
				
			||||||
 | 
					                    color::Red.fg_str(),
 | 
				
			||||||
 | 
					                    e,
 | 
				
			||||||
 | 
					                    style::Reset,
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                sender.send(Msg::Stdout(coords, exit_string)).unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let mut line = String::new();
 | 
				
			||||||
 | 
					                for _ in 0..size.0 - 1 {
 | 
				
			||||||
 | 
					                    line.push('─');
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                sender
 | 
				
			||||||
 | 
					                    .send(Msg::Stdout(
 | 
				
			||||||
 | 
					                        coords,
 | 
				
			||||||
 | 
					                        format!(
 | 
				
			||||||
 | 
					                            "\n{}{}{}\n",
 | 
				
			||||||
 | 
					                            color::Red.fg_str(),
 | 
				
			||||||
 | 
					                            line,
 | 
				
			||||||
 | 
					                            color::Reset.fg_str()
 | 
				
			||||||
 | 
					                        ),
 | 
				
			||||||
 | 
					                    ))
 | 
				
			||||||
 | 
					                    .unwrap();
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let mut stdout = child.stdout.take().unwrap();
 | 
					        let mut stdout = child.stdout.take().unwrap();
 | 
				
			||||||
        let mut stderr = child.stderr.take().unwrap();
 | 
					        let mut stderr = child.stderr.take().unwrap();
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user