list editor: refactor cursor handling

This commit is contained in:
Michael Sippel 2021-08-23 05:00:57 +02:00
parent 9905a2376f
commit 2563e06000
Signed by: senvas
GPG key ID: F96CF119C34B64A6
5 changed files with 632 additions and 377 deletions

35
nested/src/list/cursor.rs Normal file
View file

@ -0,0 +1,35 @@
#[derive(Clone, Copy, Eq, PartialEq)]
pub enum ListCursorMode {
Insert,
Select,
Modify
}
#[derive(Clone, Copy, Eq, PartialEq)]
pub struct ListCursor {
pub mode: ListCursorMode,
pub idx: usize
}
impl Default for ListCursor {
fn default() -> Self {
ListCursor {
mode: ListCursorMode::Insert,
idx: 0
}
}
}
/*
pub trait ListNav {
fn pxev(&mut self) -> ListNavResult;
fn nexd(&mut self) -> ListNavResult;
fn pua(&mut self) -> ListNavResult;
fn end(&mut self) -> ListNavResult;
fn set_cursor(&mut self, new_cursor: Option<ListCursor>) -> ListNavResult;
fn get_cursor(&self) -> Option<ListCursor>;
}
*/

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,9 @@
pub mod editor;
pub mod sexpr; pub mod sexpr;
pub mod cursor;
pub mod editor;
pub use editor::{ListEditor, ListEditorStyle};
pub use sexpr::{SExprView, ListDecoration}; pub use sexpr::{SExprView, ListDecoration};
pub use cursor::{ListCursorMode, ListCursor};
pub use editor::{ListEditor, ListEditorStyle};

View file

@ -1,10 +1,18 @@
#[derive(Eq, PartialEq)] use crate::list::ListCursorMode;
#[derive(Clone, Copy, Eq, PartialEq)]
pub enum TreeNavResult { pub enum TreeNavResult {
Continue, Continue,
Exit Exit
} }
#[derive(Clone, Eq, PartialEq)]
pub struct TreeCursor {
pub leaf_mode: ListCursorMode,
pub tree_addr: Vec<usize>
}
pub trait TreeNav { pub trait TreeNav {
fn up(&mut self) -> TreeNavResult { fn up(&mut self) -> TreeNavResult {
TreeNavResult::Exit TreeNavResult::Exit
@ -30,11 +38,11 @@ pub trait TreeNav {
TreeNavResult::Exit TreeNavResult::Exit
} }
fn goto(&mut self, tree_addr: Vec<usize>) -> TreeNavResult { fn goto(&mut self, new_cursor: Option<TreeCursor>) -> TreeNavResult {
TreeNavResult::Exit TreeNavResult::Exit
} }
fn get_cursor(&self) -> Option<Vec<usize>> { fn get_cursor(&self) -> Option<TreeCursor> {
None None
} }
} }

View file

@ -29,7 +29,7 @@ use{
TerminalEditor}, TerminalEditor},
string_editor::{CharEditor}, string_editor::{CharEditor},
tree_nav::{TreeNav, TreeNavResult, TerminalTreeEditor}, tree_nav::{TreeNav, TreeNavResult, TerminalTreeEditor},
list::{SExprView, ListEditor, ListEditorStyle} list::{SExprView, ListCursorMode, ListEditor, ListEditorStyle}
} }
}; };
@ -261,17 +261,26 @@ write::
} }
status_chars.clear(); status_chars.clear();
match te.get_cursor() { if let Some(cur) = te.get_cursor() {
Some(addr) => {
status_chars.push(TerminalAtom::new('@', TerminalStyle::fg_color((120, 80, 80)).add(TerminalStyle::bold(true)))); status_chars.push(TerminalAtom::new('@', TerminalStyle::fg_color((120, 80, 80)).add(TerminalStyle::bold(true))));
for x in addr { for x in cur.tree_addr {
for c in format!("{}", x).chars() { for c in format!("{}", x).chars() {
status_chars.push(TerminalAtom::new(c, TerminalStyle::fg_color((0, 100, 20)))); status_chars.push(TerminalAtom::new(c, TerminalStyle::fg_color((0, 100, 20))));
} }
status_chars.push(TerminalAtom::new('.', TerminalStyle::fg_color((120, 80, 80)))); status_chars.push(TerminalAtom::new('.', TerminalStyle::fg_color((120, 80, 80))));
} }
status_chars.push(TerminalAtom::new(':', TerminalStyle::fg_color((120, 80, 80)).add(TerminalStyle::bold(true))));
for c in
match cur.leaf_mode {
ListCursorMode::Insert => "INSERT",
ListCursorMode::Select => "SELECT",
ListCursorMode::Modify => "MODIFY"
}.chars()
{
status_chars.push(TerminalAtom::new(c, TerminalStyle::fg_color((200, 200, 20))));
} }
None => {} status_chars.push(TerminalAtom::new(':', TerminalStyle::fg_color((120, 80, 80)).add(TerminalStyle::bold(true))));
} }
} }