mirror of
https://github.com/extrawurst/gitui.git
synced 2024-11-23 11:42:56 +03:00
tree view commands (see #714)
This commit is contained in:
parent
0e31d57a33
commit
4591fbb965
@ -46,6 +46,11 @@ impl FileTree {
|
||||
Ok(new_self)
|
||||
}
|
||||
|
||||
///
|
||||
pub const fn is_empty(&self) -> bool {
|
||||
self.items.file_count() == 0
|
||||
}
|
||||
|
||||
///
|
||||
pub fn collapse_but_root(&mut self) {
|
||||
self.items.collapse(0, true);
|
||||
@ -67,46 +72,23 @@ impl FileTree {
|
||||
)
|
||||
}
|
||||
|
||||
fn visual_index_to_absolute(
|
||||
&self,
|
||||
visual_index: usize,
|
||||
) -> Option<usize> {
|
||||
self.items
|
||||
.iterate(0, self.items.len())
|
||||
.enumerate()
|
||||
.find_map(|(i, (abs, _))| {
|
||||
if i == visual_index {
|
||||
Some(abs)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
///
|
||||
pub const fn visual_selection(&self) -> Option<&VisualSelection> {
|
||||
self.visual_selection.as_ref()
|
||||
}
|
||||
|
||||
fn calc_visual_selection(&self) -> Option<VisualSelection> {
|
||||
self.selection.map(|selection_absolute| {
|
||||
let mut count = 0;
|
||||
let mut visual_index = 0;
|
||||
for (index, _item) in
|
||||
self.items.iterate(0, self.items.len())
|
||||
{
|
||||
if selection_absolute == index {
|
||||
visual_index = count;
|
||||
}
|
||||
///
|
||||
pub fn collapse_recursive(&mut self) {
|
||||
if let Some(selection) = self.selection {
|
||||
self.items.collapse(selection, true);
|
||||
}
|
||||
}
|
||||
|
||||
count += 1;
|
||||
}
|
||||
|
||||
VisualSelection {
|
||||
index: visual_index,
|
||||
count,
|
||||
}
|
||||
})
|
||||
///
|
||||
pub fn expand_recursive(&mut self) {
|
||||
if let Some(selection) = self.selection {
|
||||
self.items.expand(selection, true);
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
@ -141,16 +123,41 @@ impl FileTree {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn collapse_recursive(&mut self) {
|
||||
if let Some(selection) = self.selection {
|
||||
self.items.collapse(selection, true);
|
||||
}
|
||||
fn visual_index_to_absolute(
|
||||
&self,
|
||||
visual_index: usize,
|
||||
) -> Option<usize> {
|
||||
self.items
|
||||
.iterate(0, self.items.len())
|
||||
.enumerate()
|
||||
.find_map(|(i, (abs, _))| {
|
||||
if i == visual_index {
|
||||
Some(abs)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub fn expand_recursive(&mut self) {
|
||||
if let Some(selection) = self.selection {
|
||||
self.items.expand(selection, true);
|
||||
}
|
||||
fn calc_visual_selection(&self) -> Option<VisualSelection> {
|
||||
self.selection.map(|selection_absolute| {
|
||||
let mut count = 0;
|
||||
let mut visual_index = 0;
|
||||
for (index, _item) in
|
||||
self.items.iterate(0, self.items.len())
|
||||
{
|
||||
if selection_absolute == index {
|
||||
visual_index = count;
|
||||
}
|
||||
|
||||
count += 1;
|
||||
}
|
||||
|
||||
VisualSelection {
|
||||
index: visual_index,
|
||||
count,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const fn selection_start(current_index: usize) -> Option<usize> {
|
||||
|
@ -7,7 +7,7 @@ use super::{
|
||||
use crate::{
|
||||
keys::SharedKeyConfig,
|
||||
queue::Queue,
|
||||
strings,
|
||||
strings::{self, order},
|
||||
ui::{self, style::SharedTheme},
|
||||
};
|
||||
use anyhow::Result;
|
||||
@ -109,10 +109,6 @@ impl RevisionFilesComponent {
|
||||
let path = format!("{}{}{}", indent_str, path_arrow, path);
|
||||
Span::styled(path, theme.file_tree_item(is_path, selected))
|
||||
}
|
||||
|
||||
fn move_selection(&mut self, dir: MoveSelection) -> bool {
|
||||
self.tree.move_selection(dir)
|
||||
}
|
||||
}
|
||||
|
||||
impl DrawableComponent for RevisionFilesComponent {
|
||||
@ -154,13 +150,6 @@ impl DrawableComponent for RevisionFilesComponent {
|
||||
f,
|
||||
area,
|
||||
&self.title,
|
||||
// &format!(
|
||||
// "{}/{} (height: {}) (top: {})",
|
||||
// selection.index,
|
||||
// selection.count,
|
||||
// tree_height,
|
||||
// self.scroll_top.get()
|
||||
// ),
|
||||
items,
|
||||
true,
|
||||
&self.theme,
|
||||
@ -188,6 +177,8 @@ impl Component for RevisionFilesComponent {
|
||||
)
|
||||
.order(1),
|
||||
);
|
||||
|
||||
tree_nav_cmds(&self.tree, &self.key_config, out);
|
||||
}
|
||||
|
||||
visibility_blocking(self)
|
||||
@ -202,33 +193,8 @@ impl Component for RevisionFilesComponent {
|
||||
let consumed = if key == self.key_config.exit_popup {
|
||||
self.hide();
|
||||
true
|
||||
} else if key == self.key_config.move_down {
|
||||
self.move_selection(MoveSelection::Down)
|
||||
} else if key == self.key_config.move_up {
|
||||
self.move_selection(MoveSelection::Up)
|
||||
} else if key == self.key_config.move_right {
|
||||
self.move_selection(MoveSelection::Right)
|
||||
} else if key == self.key_config.move_left {
|
||||
self.move_selection(MoveSelection::Left)
|
||||
} else if key == self.key_config.home
|
||||
|| key == self.key_config.shift_up
|
||||
{
|
||||
self.move_selection(MoveSelection::Top)
|
||||
} else if key == self.key_config.end
|
||||
|| key == self.key_config.shift_down
|
||||
{
|
||||
self.move_selection(MoveSelection::End)
|
||||
} else if key
|
||||
== self.key_config.tree_collapse_recursive
|
||||
{
|
||||
self.tree.collapse_recursive();
|
||||
true
|
||||
} else if key == self.key_config.tree_expand_recursive
|
||||
{
|
||||
self.tree.expand_recursive();
|
||||
true
|
||||
} else {
|
||||
false
|
||||
tree_nav(&mut self.tree, &self.key_config, key)
|
||||
};
|
||||
|
||||
return Ok(consumed.into());
|
||||
@ -252,3 +218,48 @@ impl Component for RevisionFilesComponent {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: reuse for other tree usages
|
||||
fn tree_nav_cmds(
|
||||
tree: &FileTree,
|
||||
key_config: &SharedKeyConfig,
|
||||
out: &mut Vec<CommandInfo>,
|
||||
) {
|
||||
out.push(
|
||||
CommandInfo::new(
|
||||
strings::commands::navigate_tree(key_config),
|
||||
!tree.is_empty(),
|
||||
true,
|
||||
)
|
||||
.order(order::NAV),
|
||||
);
|
||||
}
|
||||
|
||||
//TODO: reuse for other tree usages
|
||||
fn tree_nav(
|
||||
tree: &mut FileTree,
|
||||
key_config: &SharedKeyConfig,
|
||||
key: crossterm::event::KeyEvent,
|
||||
) -> bool {
|
||||
if key == key_config.move_down {
|
||||
tree.move_selection(MoveSelection::Down)
|
||||
} else if key == key_config.move_up {
|
||||
tree.move_selection(MoveSelection::Up)
|
||||
} else if key == key_config.move_right {
|
||||
tree.move_selection(MoveSelection::Right)
|
||||
} else if key == key_config.move_left {
|
||||
tree.move_selection(MoveSelection::Left)
|
||||
} else if key == key_config.home || key == key_config.shift_up {
|
||||
tree.move_selection(MoveSelection::Top)
|
||||
} else if key == key_config.end || key == key_config.shift_down {
|
||||
tree.move_selection(MoveSelection::End)
|
||||
} else if key == key_config.tree_collapse_recursive {
|
||||
tree.collapse_recursive();
|
||||
true
|
||||
} else if key == key_config.tree_expand_recursive {
|
||||
tree.expand_recursive();
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
@ -351,7 +351,7 @@ pub mod commands {
|
||||
key_config.get_hint(key_config.move_right),
|
||||
key_config.get_hint(key_config.move_left)
|
||||
),
|
||||
"navigate tree view",
|
||||
"navigate tree view, collapse, expand",
|
||||
CMD_GROUP_GENERAL,
|
||||
)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user