Skip to content

Commit a5b63e5

Browse files
author
Stephan Dilly
committed
support common nav for syntax view (closes #725)
1 parent 0dd1afb commit a5b63e5

File tree

4 files changed

+76
-34
lines changed

4 files changed

+76
-34
lines changed

filetree/src/filetree.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ pub enum MoveSelection {
1313
Right,
1414
Top,
1515
End,
16+
PageDown,
17+
PageUp,
1618
}
1719

1820
#[derive(Debug, Clone, Copy)]
@@ -121,6 +123,9 @@ impl FileTree {
121123
Self::selection_start(selection)
122124
}
123125
MoveSelection::End => self.selection_end(selection),
126+
MoveSelection::PageDown | MoveSelection::PageUp => {
127+
None
128+
}
124129
};
125130

126131
let changed_index =

src/components/revision_files.rs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
keys::SharedKeyConfig,
77
queue::{InternalEvent, Queue},
88
strings::{self, order},
9-
ui::{self, style::SharedTheme},
9+
ui::{self, common_nav, style::SharedTheme},
1010
};
1111
use anyhow::Result;
1212
use asyncgit::{
@@ -15,7 +15,7 @@ use asyncgit::{
1515
};
1616
use crossbeam_channel::Sender;
1717
use crossterm::event::Event;
18-
use filetree::{FileTree, MoveSelection};
18+
use filetree::FileTree;
1919
use std::{
2020
cell::Cell, collections::BTreeSet, convert::From, path::Path,
2121
};
@@ -376,18 +376,8 @@ fn tree_nav(
376376
key_config: &SharedKeyConfig,
377377
key: crossterm::event::KeyEvent,
378378
) -> bool {
379-
if key == key_config.move_down {
380-
tree.move_selection(MoveSelection::Down)
381-
} else if key == key_config.move_up {
382-
tree.move_selection(MoveSelection::Up)
383-
} else if key == key_config.move_right {
384-
tree.move_selection(MoveSelection::Right)
385-
} else if key == key_config.move_left {
386-
tree.move_selection(MoveSelection::Left)
387-
} else if key == key_config.home || key == key_config.shift_up {
388-
tree.move_selection(MoveSelection::Top)
389-
} else if key == key_config.end || key == key_config.shift_down {
390-
tree.move_selection(MoveSelection::End)
379+
if let Some(common_nav) = common_nav(key, key_config) {
380+
tree.move_selection(common_nav)
391381
} else if key == key_config.tree_collapse_recursive {
392382
tree.collapse_recursive();
393383
true

src/components/syntax_text.rs

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use crate::{
66
keys::SharedKeyConfig,
77
strings,
88
ui::{
9-
self, style::SharedTheme, AsyncSyntaxJob, ParagraphState,
10-
ScrollPos, StatefulParagraph,
9+
self, common_nav, style::SharedTheme, AsyncSyntaxJob,
10+
ParagraphState, ScrollPos, StatefulParagraph,
1111
},
1212
};
1313
use anyhow::Result;
@@ -18,6 +18,7 @@ use asyncgit::{
1818
};
1919
use crossbeam_channel::Sender;
2020
use crossterm::event::Event;
21+
use filetree::MoveSelection;
2122
use itertools::Either;
2223
use std::{cell::Cell, convert::From, path::Path};
2324
use tui::{
@@ -120,34 +121,50 @@ impl SyntaxTextComponent {
120121
}
121122
}
122123

123-
fn scroll(&self, down: Option<bool>) {
124+
fn scroll(&self, nav: MoveSelection) -> bool {
125+
let state = self.paragraph_state.get();
126+
127+
let new_scroll_pos = match nav {
128+
MoveSelection::Down => state.scroll().y.saturating_add(1),
129+
MoveSelection::Up => state.scroll().y.saturating_sub(1),
130+
MoveSelection::Top => 0,
131+
MoveSelection::End => state
132+
.lines()
133+
.saturating_sub(state.height().saturating_sub(2)),
134+
MoveSelection::PageUp => state
135+
.scroll()
136+
.y
137+
.saturating_sub(state.height().saturating_sub(2)),
138+
MoveSelection::PageDown => state
139+
.scroll()
140+
.y
141+
.saturating_add(state.height().saturating_sub(2)),
142+
_ => state.scroll().y,
143+
};
144+
145+
self.set_scroll(new_scroll_pos)
146+
}
147+
148+
fn set_scroll(&self, pos: u16) -> bool {
124149
let mut state = self.paragraph_state.get();
125-
let new_scroll_pos = down.map_or_else(
126-
|| state.scroll().y,
127-
|down| {
128-
if down {
129-
state.scroll().y.saturating_add(1)
130-
} else {
131-
state.scroll().y.saturating_sub(1)
132-
}
133-
},
134-
);
135150

136-
let new_scroll_pos = new_scroll_pos.min(
151+
let new_scroll_pos = pos.min(
137152
state
138153
.lines()
139154
.saturating_sub(state.height().saturating_sub(2)),
140155
);
141156

142157
if new_scroll_pos == state.scroll().y {
143-
return;
158+
return false;
144159
}
145160

146161
state.set_scroll(ScrollPos {
147162
x: 0,
148163
y: new_scroll_pos,
149164
});
150165
self.paragraph_state.set(state);
166+
167+
true
151168
}
152169
}
153170

@@ -185,7 +202,7 @@ impl DrawableComponent for SyntaxTextComponent {
185202

186203
self.paragraph_state.set(state);
187204

188-
self.scroll(None);
205+
self.set_scroll(state.scroll().y);
189206

190207
if self.focused() {
191208
ui::draw_scrollbar(
@@ -227,10 +244,11 @@ impl Component for SyntaxTextComponent {
227244
event: crossterm::event::Event,
228245
) -> Result<EventState> {
229246
if let Event::Key(key) = event {
230-
if key == self.key_config.move_down {
231-
self.scroll(Some(true));
232-
} else if key == self.key_config.move_up {
233-
self.scroll(Some(false));
247+
if let Some(nav) = common_nav(key, &self.key_config) {
248+
return Ok(self
249+
.scroll(nav)
250+
.then(|| EventState::Consumed)
251+
.unwrap_or(EventState::NotConsumed));
234252
}
235253
}
236254

src/ui/mod.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod stateful_paragraph;
55
pub mod style;
66
mod syntax_text;
77

8+
use filetree::MoveSelection;
89
pub use scrollbar::draw_scrollbar;
910
pub use scrolllist::{draw_list, draw_list_block};
1011
pub use stateful_paragraph::{
@@ -13,6 +14,8 @@ pub use stateful_paragraph::{
1314
pub use syntax_text::{AsyncSyntaxJob, SyntaxText};
1415
use tui::layout::{Constraint, Direction, Layout, Rect};
1516

17+
use crate::keys::SharedKeyConfig;
18+
1619
/// return the scroll position (line) necessary to have the `selection` in view if it is not already
1720
pub const fn calc_scroll_top(
1821
current_top: usize,
@@ -109,3 +112,29 @@ pub fn centered_rect_absolute(
109112
height.min(r.height),
110113
)
111114
}
115+
116+
///
117+
pub fn common_nav(
118+
key: crossterm::event::KeyEvent,
119+
key_config: &SharedKeyConfig,
120+
) -> Option<MoveSelection> {
121+
if key == key_config.move_down {
122+
Some(MoveSelection::Down)
123+
} else if key == key_config.move_up {
124+
Some(MoveSelection::Up)
125+
} else if key == key_config.page_up {
126+
Some(MoveSelection::PageUp)
127+
} else if key == key_config.page_down {
128+
Some(MoveSelection::PageDown)
129+
} else if key == key_config.move_right {
130+
Some(MoveSelection::Right)
131+
} else if key == key_config.move_left {
132+
Some(MoveSelection::Left)
133+
} else if key == key_config.home || key == key_config.shift_up {
134+
Some(MoveSelection::Top)
135+
} else if key == key_config.end || key == key_config.shift_down {
136+
Some(MoveSelection::End)
137+
} else {
138+
None
139+
}
140+
}

0 commit comments

Comments
 (0)