Add status bar
This commit is contained in:
parent
a67f78680f
commit
3aa682fc5c
@ -4,6 +4,7 @@ use std::fs;
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct Document {
|
pub struct Document {
|
||||||
rows: Vec<Row>,
|
rows: Vec<Row>,
|
||||||
|
pub file_name: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Document {
|
impl Document {
|
||||||
@ -17,7 +18,8 @@ impl Document {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
rows
|
rows,
|
||||||
|
file_name: Some(filename.to_string()),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,8 +2,11 @@ use crate::Document;
|
|||||||
use crate::Row;
|
use crate::Row;
|
||||||
use crate::Terminal;
|
use crate::Terminal;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
use termion::color;
|
||||||
use termion::event::Key;
|
use termion::event::Key;
|
||||||
|
|
||||||
|
const STATUS_FG_COLOR: color::Rgb = color::Rgb(63, 63, 63);
|
||||||
|
const STATUS_BG_COLOR: color::Rgb = color::Rgb(239, 239, 239);
|
||||||
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
@ -61,6 +64,8 @@ impl Editor {
|
|||||||
println!("Goodbye.\r");
|
println!("Goodbye.\r");
|
||||||
} else {
|
} else {
|
||||||
self.draw_rows();
|
self.draw_rows();
|
||||||
|
self.draw_status_bar();
|
||||||
|
self.draw_message_bar();
|
||||||
Terminal::cursor_position(&Position {
|
Terminal::cursor_position(&Position {
|
||||||
x: self.cursor_position.x.saturating_sub(self.offset.x),
|
x: self.cursor_position.x.saturating_sub(self.offset.x),
|
||||||
y: self.cursor_position.y.saturating_sub(self.offset.y),
|
y: self.cursor_position.y.saturating_sub(self.offset.y),
|
||||||
@ -70,6 +75,41 @@ impl Editor {
|
|||||||
Terminal::flush()
|
Terminal::flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn draw_status_bar(&self) {
|
||||||
|
let mut status;
|
||||||
|
let width = self.terminal.size().width as usize;
|
||||||
|
let mut file_name = "[No Name]".to_string();
|
||||||
|
|
||||||
|
if let Some(name) = &self.document.file_name {
|
||||||
|
file_name = name.clone();
|
||||||
|
file_name.truncate(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
status = format!("{} - {} lines", file_name, self.document.len());
|
||||||
|
|
||||||
|
let line_indicator = format!(
|
||||||
|
"{}/{}",
|
||||||
|
self.cursor_position.y.saturating_add(1),
|
||||||
|
self.document.len()
|
||||||
|
);
|
||||||
|
let len = status.len() + line_indicator.len();
|
||||||
|
if width > len {
|
||||||
|
status.push_str(&" ".repeat(width - len));
|
||||||
|
}
|
||||||
|
status = format!("{}{}", status, line_indicator);
|
||||||
|
status.truncate(width);
|
||||||
|
|
||||||
|
Terminal::set_bg_color(STATUS_BG_COLOR);
|
||||||
|
Terminal::set_fg_color(STATUS_FG_COLOR);
|
||||||
|
println!("{}\r", status);
|
||||||
|
Terminal::reset_fg_color();
|
||||||
|
Terminal::reset_bg_color();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_message_bar(&self) {
|
||||||
|
Terminal::clear_current_line();
|
||||||
|
}
|
||||||
|
|
||||||
fn process_keypress(&mut self) -> Result<(), std::io::Error> {
|
fn process_keypress(&mut self) -> Result<(), std::io::Error> {
|
||||||
let pressed_key = Terminal::read_key()?;
|
let pressed_key = Terminal::read_key()?;
|
||||||
match pressed_key {
|
match pressed_key {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use crate::Position;
|
use crate::Position;
|
||||||
use std::io::{self, stdout, Write};
|
use std::io::{self, stdout, Write};
|
||||||
|
use termion::color;
|
||||||
use termion::event::Key;
|
use termion::event::Key;
|
||||||
use termion::input::TermRead;
|
use termion::input::TermRead;
|
||||||
use termion::raw::{IntoRawMode, RawTerminal};
|
use termion::raw::{IntoRawMode, RawTerminal};
|
||||||
@ -69,4 +70,20 @@ impl Terminal {
|
|||||||
pub fn clear_current_line() {
|
pub fn clear_current_line() {
|
||||||
print!("{}", termion::clear::CurrentLine);
|
print!("{}", termion::clear::CurrentLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_bg_color(color: color::Rgb) {
|
||||||
|
print!("{}", color::Bg(color));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reset_bg_color() {
|
||||||
|
print!("{}", color::Bg(color::Reset));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_fg_color(color: color::Rgb) {
|
||||||
|
print!("{}", color::Fg(color));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reset_fg_color() {
|
||||||
|
print!("{}", color::Fg(color::Reset));
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user