lib-nested/nested/src/editors/product/nav.rs

248 lines
9.8 KiB
Rust
Raw Normal View History

use {
crate::{
type_system::Context,
tree::{TreeNav, TreeNavResult, TreeCursor},
2023-02-13 18:39:45 +01:00
editors::{
list::ListCursorMode,
product::{segment::ProductEditorSegment, ProductEditor},
}
},
2022-12-18 01:39:01 +01:00
cgmath::{Vector2},
std::{ops::{DerefMut}},
};
impl TreeNav for ProductEditor {
fn get_cursor(&self) -> TreeCursor {
if let Some(i) = self.cursor {
if let Some(e) = self.get_editor(i) {
2022-12-19 11:26:07 +01:00
let mut c = e.get_cursor();
if c.tree_addr.len() == 0 {
c.leaf_mode = ListCursorMode::Select;
}
c.tree_addr.insert(0, i);
c
} else {
TreeCursor {
leaf_mode: ListCursorMode::Select,
tree_addr: vec![ i ]
}
}
} else {
2022-06-24 15:54:05 +02:00
TreeCursor::none()
}
}
fn get_cursor_warp(&self) -> TreeCursor {
if let Some(i) = self.cursor {
if let Some(e) = self.get_editor(i) {
2022-12-19 11:26:07 +01:00
let mut c = e.get_cursor_warp();
2022-06-24 15:54:05 +02:00
if c.tree_addr.len() == 0 {
c.leaf_mode = ListCursorMode::Select;
}
c.tree_addr.insert(0, i as isize - self.n_indices.len() as isize);
c
} else {
TreeCursor {
leaf_mode: ListCursorMode::Select,
tree_addr: vec![ i as isize - self.n_indices.len() as isize ]
}
}
} else {
TreeCursor::none()
}
}
fn goto(&mut self, mut c: TreeCursor) -> TreeNavResult {
let old_cursor = self.cursor;
2022-06-26 00:49:35 +02:00
if let Some(mut segment) = self.get_cur_segment_mut() {
2022-12-18 01:39:01 +01:00
if let Some(ProductEditorSegment::N{ t: _t, editor, ed_depth: _, cur_depth: _, cur_dist:_ }) = segment.deref_mut() {
if let Some(e) = editor {
2022-06-24 15:54:05 +02:00
e.goto(TreeCursor::none());
}
}
}
if c.tree_addr.len() > 0 {
2023-01-02 18:49:32 +01:00
self.cursor = Some(crate::utils::modulo(c.tree_addr.remove(0), self.n_indices.len() as isize));
2022-06-26 00:49:35 +02:00
if let Some(mut element) = self.get_cur_segment_mut() {
2022-12-18 01:39:01 +01:00
if let Some(ProductEditorSegment::N{ t, editor, ed_depth, cur_depth: _, cur_dist:_ }) = element.deref_mut() {
if let Some(e) = editor {
2022-12-19 11:26:07 +01:00
e.goto(c.clone());
2022-08-12 18:57:40 +02:00
} else if c.tree_addr.len() > 0 {
// create editor
let mut e = Context::make_node(&self.ctx, t.clone(), r3vi::buffer::singleton::SingletonBuffer::new(*ed_depth+1).get_port()).unwrap();
2022-08-12 18:57:40 +02:00
*editor = Some(e.clone());
e.goto(c.clone());
}
}
}
if let Some(i) = old_cursor{
self.update_segment(i);
}
if let Some(i) = self.cursor {
self.update_segment(i);
}
TreeNavResult::Continue
} else {
2022-12-19 11:26:07 +01:00
if let Some(mut ed) = self.get_cur_editor() {
ed.goto(TreeCursor::none());
2022-11-18 00:21:29 +01:00
}
self.cursor = None;
if let Some(i) = old_cursor {
self.update_segment(i);
}
TreeNavResult::Exit
}
}
2022-06-19 23:13:21 +02:00
fn goby(&mut self, direction: Vector2<isize>) -> TreeNavResult {
2022-06-24 15:54:05 +02:00
let mut cur = self.get_cursor();
match cur.tree_addr.len() {
0 => {
if direction.y > 0 {
self.cursor = Some(0);
self.update_segment(0);
2022-06-24 15:54:05 +02:00
self.goby(Vector2::new(direction.x, direction.y-1));
TreeNavResult::Continue
} else if direction.y < 0 {
TreeNavResult::Exit
} else {
TreeNavResult::Continue
}
}
2022-06-24 15:54:05 +02:00
1 => {
if direction.y > 0 {
// dn
2022-06-26 00:49:35 +02:00
if let Some(mut element) = self.get_cur_segment_mut() {
2022-12-18 01:39:01 +01:00
if let Some(ProductEditorSegment::N{ t, editor, ed_depth, cur_depth: _, cur_dist:_ }) = element.deref_mut() {
2022-06-24 15:54:05 +02:00
if let Some(e) = editor {
e.goby(direction);
} else {
// create editor
2022-11-18 00:21:29 +01:00
let mut e = Context::make_node(&self.ctx, t.clone(), r3vi::buffer::singleton::SingletonBuffer::new(*ed_depth+1).get_port()).unwrap();
2022-06-24 15:54:05 +02:00
*editor = Some(e.clone());
e.goby(direction);
}
}
}
self.update_segment(cur.tree_addr[0]);
2022-06-24 15:54:05 +02:00
TreeNavResult::Continue
} else if direction.y < 0 {
// up
let old_cursor = self.cursor;
2022-06-24 15:54:05 +02:00
self.cursor = None;
if let Some(i) = old_cursor {
self.update_segment(i);
}
2022-06-24 15:54:05 +02:00
TreeNavResult::Exit
} else {
let old_cursor = self.cursor;
2022-08-12 18:57:40 +02:00
2022-06-24 15:54:05 +02:00
if (cur.tree_addr[0]+direction.x >= 0) &&
(cur.tree_addr[0]+direction.x < self.n_indices.len() as isize)
{
self.cursor = Some(cur.tree_addr[0] + direction.x);
self.update_cur_segment();
if let Some(i) = old_cursor {
self.update_segment(i);
2022-06-24 15:54:05 +02:00
}
TreeNavResult::Continue
} else {
self.cursor = None;
if let Some(i) = old_cursor {
self.update_segment(i);
}
2022-06-24 15:54:05 +02:00
TreeNavResult::Exit
}
}
}
2022-06-24 15:54:05 +02:00
depth => {
let old_cursor = self.cursor;
let nav_result =
if let Some(mut element) = self.get_cur_segment_mut() {
2022-12-18 01:39:01 +01:00
if let Some(ProductEditorSegment::N{ t: _, editor, ed_depth: _, cur_depth, cur_dist:_ }) = element.deref_mut() {
if let Some(e) = editor.as_mut() {
//\\//\\//\\//\\
// horizontal //
//\\//\\//\\//\\
2022-12-19 11:26:07 +01:00
match e.goby(direction) {
TreeNavResult::Exit => {
2022-10-15 03:52:38 +02:00
// *cur_depth = 1;
if direction.y < 0 {
if depth <= (1-direction.y) as usize {
// up
TreeNavResult::Continue
} else {
panic!("unplausible direction.y on exit");
}
} else if direction.y > 0 {
// dn
2022-06-24 15:54:05 +02:00
TreeNavResult::Continue
} else if direction.y == 0 {
// horizontal
if direction.x != 0 {
*cur_depth = 0;
}
2022-08-12 18:57:40 +02:00
if (cur.tree_addr[0]+direction.x >= 0) &&
(cur.tree_addr[0]+direction.x < self.n_indices.len() as isize)
{
if direction.x < 0 {
cur.tree_addr[0] -= 1;
for i in 1..depth {
cur.tree_addr[i] = -1;
}
} else {
cur.tree_addr[0] += 1;
for i in 1..depth {
cur.tree_addr[i] = 0;
}
2022-06-24 15:54:05 +02:00
}
self.goto(cur)
2022-06-24 15:54:05 +02:00
} else {
self.cursor = None;
TreeNavResult::Exit
2022-06-24 15:54:05 +02:00
}
} else {
TreeNavResult::Continue
2022-06-24 15:54:05 +02:00
}
}
TreeNavResult::Continue => {
2022-06-24 15:54:05 +02:00
TreeNavResult::Continue
}
2022-06-24 15:54:05 +02:00
}
} else {
TreeNavResult::Continue
}
2022-06-24 15:54:05 +02:00
} else {
TreeNavResult::Continue
}
} else {
TreeNavResult::Continue
};
if let Some(i) = old_cursor {
self.update_segment(i);
}
self.update_cur_segment();
return nav_result;
}
}
2022-06-24 15:54:05 +02:00
}
}