diff --git a/src/editor.rs b/src/editor.rs index 7f71a57..991e274 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -2,12 +2,24 @@ use crate::helpers::*; use std::cmp::PartialEq; +use std::fs::File; use std::io; use std::io::prelude::*; use std::io::BufReader; +use self::EditorKey::*; + +#[derive(Debug, Default)] pub struct EditorRow { - row_chars: String, + chars: String, +} + +impl EditorRow { + pub fn new(str: &str) -> Self { + EditorRow { + chars: str.to_owned(), + } + } } /// Main structure for the editor @@ -48,8 +60,6 @@ impl EditorKey { } } -use self::EditorKey::*; - // init impl Editor { pub fn new() -> Self { @@ -57,6 +67,7 @@ impl Editor { let size = instance.get_window_size(); instance.cursor_x = 0; instance.cursor_y = 0; + instance.num_rows = 0; instance.screen_cols = size.cols as usize; instance.screen_rows = size.rows as usize; @@ -233,26 +244,35 @@ impl Editor { fn draw_rows(&mut self) { for y in 0..self.screen_rows { - if y == (self.screen_rows / 3) { - let mut welcome = format!("Kilo editor -- version {}", env!("CARGO_PKG_VERSION")); - if welcome.len() > self.screen_cols { - welcome.truncate(self.screen_cols) - } + if y >= self.num_rows { + if y == (self.screen_rows / 3) { + let mut welcome = + format!("Kilo editor -- version {}", env!("CARGO_PKG_VERSION")); + if welcome.len() > self.screen_cols { + welcome.truncate(self.screen_cols) + } - // Center welcome message - let mut padding = (self.screen_cols - welcome.len()) / 2; - if padding > 0 { + // Center welcome message + let mut padding = (self.screen_cols - welcome.len()) / 2; + if padding > 0 { + self.append_out("~"); + padding -= 1; + } + while padding > 0 { + self.append_out(" "); + padding -= 1; + } + + self.append_out(&welcome); + } else { self.append_out("~"); - padding -= 1; } - while padding > 0 { - self.append_out(" "); - padding -= 1; - } - - self.append_out(&welcome); } else { - self.append_out("~"); + let mut output = self.row.chars.clone(); + if output.len() > self.screen_cols { + output.truncate(self.screen_cols); + } + self.append_out(&output); } self.append_out("\x1b[K"); @@ -286,5 +306,22 @@ impl Editor { // File I/O impl Editor { - pub fn open(&mut self) {} + pub fn open(&mut self, filename: &str) -> io::Result<()> { + let file = File::open(filename)?; + let buf_reader = BufReader::new(file); + + let mut lines = buf_reader.lines().map(|l| l.unwrap()); + + let line = lines.next().unwrap(); + self.row = EditorRow::new(&line); + self.num_rows = 1; + + /*for line in lines { + let + }*/ + // let line_res = buf_reader.read_line() + // self.row = EditorRow::new("Hello, world!"); + // self.num_rows += 1; + Ok(()) + } } diff --git a/src/main.rs b/src/main.rs index 7c9adb6..878b86e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,10 +4,13 @@ mod helpers; use crate::editor::Editor; use crate::helpers::*; use libc::STDIN_FILENO; +use std::env; use std::io::Error; use std::result::Result; fn main() -> Result<(), Error> { + let args: Vec = env::args().collect(); + // Save original terminal flags let original_termios = get_termios(STDIN_FILENO); @@ -17,6 +20,11 @@ fn main() -> Result<(), Error> { // Initialize the editor let mut editor = Editor::new(); + // Open the file if specified, from the command line + if args.len() >= 2 { + editor.open(&args[1])?; + } + // Main input loop. Editor::process_keypress uses an Option Enum as a sentinel. // `None` is returned on a quit action, in other cases, `Some(())` is returned, // continuing the loop