Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## Unreleased

### Added
- `page_half_up` and `page_half_down` keybindings [@jyn514](https://github.com/jyn514) ([109](https://github.com/extrawurst/gitui/issues/109))

### Changed
* use [tombi](https://github.com/tombi-toml/tombi) for all toml file formatting

Expand Down
28 changes: 25 additions & 3 deletions filetreelist/src/filetree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ pub enum MoveSelection {
Top,
End,
PageDown,
PageHalfDown,
PageUp,
PageHalfUp,
}

#[derive(Clone, Copy, PartialEq)]
Expand Down Expand Up @@ -124,8 +126,12 @@ impl FileTree {
&self,
current_index: usize,
direction: Direction,
half_page: bool,
) -> Option<usize> {
let page_size = self.window_height.get().unwrap_or(0);
let mut page_size = self.window_height.get().unwrap_or(0);
if half_page {
page_size = page_size.div_ceil(2);
}

if direction == Direction::Up {
self.get_new_selection(
Expand Down Expand Up @@ -156,12 +162,28 @@ impl FileTree {
}
MoveSelection::Top => Some(0),
MoveSelection::End => self.selection_end(),
MoveSelection::PageUp => self
.selection_page_updown(selection, Direction::Up),
MoveSelection::PageUp => self.selection_page_updown(
selection,
Direction::Up,
false,
),
MoveSelection::PageHalfUp => self
.selection_page_updown(
selection,
Direction::Up,
true,
),
MoveSelection::PageDown => self
.selection_page_updown(
selection,
Direction::Down,
false,
),
MoveSelection::PageHalfDown => self
.selection_page_updown(
selection,
Direction::Down,
true,
),
};

Expand Down
12 changes: 12 additions & 0 deletions src/components/commit_details/details.rs
Original file line number Diff line number Diff line change
Expand Up @@ -375,12 +375,24 @@ impl Component for DetailsComponent {
) {
self.move_scroll_top(ScrollType::PageUp)
.into()
} else if key_match(
e,
self.key_config.keys.page_half_up,
) {
self.move_scroll_top(ScrollType::PageHalfUp)
.into()
} else if key_match(
e,
self.key_config.keys.page_down,
) {
self.move_scroll_top(ScrollType::PageDown)
.into()
} else if key_match(
e,
self.key_config.keys.page_half_down,
) {
self.move_scroll_top(ScrollType::PageHalfDown)
.into()
} else if key_match(e, self.key_config.keys.home)
|| key_match(e, self.key_config.keys.shift_up)
{
Expand Down
16 changes: 16 additions & 0 deletions src/components/commitlist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -371,9 +371,15 @@ impl CommitList {
ScrollType::PageUp => {
self.selection.saturating_sub(page_offset)
}
ScrollType::PageHalfUp => {
self.selection.saturating_sub(page_offset.div_ceil(2))
}
ScrollType::PageDown => {
self.selection.saturating_add(page_offset)
}
ScrollType::PageHalfDown => {
self.selection.saturating_add(page_offset.div_ceil(2))
}
ScrollType::Home => 0,
ScrollType::End => self.selection_max(),
};
Expand Down Expand Up @@ -848,9 +854,19 @@ impl Component for CommitList {
self.move_selection(ScrollType::End)?
} else if key_match(k, self.key_config.keys.page_up) {
self.move_selection(ScrollType::PageUp)?
} else if key_match(
k,
self.key_config.keys.page_half_up,
) {
self.move_selection(ScrollType::PageHalfUp)?
} else if key_match(k, self.key_config.keys.page_down)
{
self.move_selection(ScrollType::PageDown)?
} else if key_match(
k,
self.key_config.keys.page_half_down,
) {
self.move_selection(ScrollType::PageHalfDown)?
} else if key_match(
k,
self.key_config.keys.log_mark_commit,
Expand Down
24 changes: 24 additions & 0 deletions src/components/diff.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,12 +236,24 @@ impl DiffComponent {
as usize,
)
}
ScrollType::PageHalfDown => {
self.selection.get_bottom().saturating_add(
self.current_size.get().1.div_ceil(2)
as usize,
)
}
ScrollType::PageUp => {
self.selection.get_top().saturating_sub(
self.current_size.get().1.saturating_sub(1)
as usize,
)
}
ScrollType::PageHalfUp => {
self.selection.get_top().saturating_sub(
self.current_size.get().1.div_ceil(2)
as usize,
)
}
};

self.update_selection(new_start);
Expand Down Expand Up @@ -848,10 +860,22 @@ impl Component for DiffComponent {
} else if key_match(e, self.key_config.keys.page_up) {
self.move_selection(ScrollType::PageUp);
Ok(EventState::Consumed)
} else if key_match(
e,
self.key_config.keys.page_half_up,
) {
self.move_selection(ScrollType::PageHalfUp);
Ok(EventState::Consumed)
} else if key_match(e, self.key_config.keys.page_down)
{
self.move_selection(ScrollType::PageDown);
Ok(EventState::Consumed)
} else if key_match(
e,
self.key_config.keys.page_half_down,
) {
self.move_selection(ScrollType::PageHalfDown);
Ok(EventState::Consumed)
} else if key_match(
e,
self.key_config.keys.move_right,
Expand Down
2 changes: 2 additions & 0 deletions src/components/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,9 @@ pub enum ScrollType {
Home,
End,
PageUp,
PageHalfUp,
PageDown,
PageHalfDown,
}

#[derive(Copy, Clone)]
Expand Down
15 changes: 15 additions & 0 deletions src/components/status_tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ impl Component for StatusTreeComponent {
CommandBlocking::PassingOn
}

#[allow(clippy::too_many_lines)]
fn event(&mut self, ev: &Event) -> Result<EventState> {
if self.focused {
if let Event::Key(e) = ev {
Expand Down Expand Up @@ -539,11 +540,25 @@ impl Component for StatusTreeComponent {
Ok(self
.move_selection(MoveSelection::PageUp)
.into())
} else if key_match(
e,
self.key_config.keys.page_half_up,
) {
Ok(self
.move_selection(MoveSelection::PageHalfUp)
.into())
} else if key_match(e, self.key_config.keys.page_down)
{
Ok(self
.move_selection(MoveSelection::PageDown)
.into())
} else if key_match(
e,
self.key_config.keys.page_half_down,
) {
Ok(self
.move_selection(MoveSelection::PageHalfDown)
.into())
} else if key_match(e, self.key_config.keys.move_left)
{
Ok(self
Expand Down
22 changes: 22 additions & 0 deletions src/components/utils/scroll_vertical.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,13 @@ impl VerticalScroll {
ScrollType::PageDown => old
.saturating_sub(1)
.saturating_add(self.visual_height.get()),
ScrollType::PageHalfDown => old
.saturating_add(self.visual_height.get().div_ceil(2)),
ScrollType::PageUp => old
.saturating_add(1)
.saturating_sub(self.visual_height.get()),
ScrollType::PageHalfUp => old
.saturating_sub(self.visual_height.get().div_ceil(2)),
ScrollType::Home => 0,
ScrollType::End => max,
};
Expand Down Expand Up @@ -222,5 +226,23 @@ mod tests {

assert!(!scroll.move_top(ScrollType::PageUp));
assert_eq!(scroll.get_top(), 0);

assert!(!scroll.move_top(ScrollType::PageHalfUp));
assert_eq!(scroll.get_top(), 0);

assert!(scroll.move_top(ScrollType::PageHalfDown));
assert_eq!(scroll.get_top(), 4);

assert!(scroll.move_top(ScrollType::PageHalfDown));
assert_eq!(scroll.get_top(), 8);

assert!(scroll.move_top(ScrollType::PageHalfDown));
assert_eq!(scroll.get_top(), 10);

assert!(!scroll.move_top(ScrollType::PageHalfDown));
assert_eq!(scroll.get_top(), 10);

assert!(scroll.move_top(ScrollType::PageHalfUp));
assert_eq!(scroll.get_top(), 6);
}
}
22 changes: 21 additions & 1 deletion src/components/utils/statustree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ pub enum MoveSelection {
Home,
End,
PageDown,
PageHalfDown,
PageUp,
PageHalfUp,
}

#[derive(Copy, Clone, Debug)]
Expand Down Expand Up @@ -146,11 +148,25 @@ impl StatusTree {
MoveSelection::PageUp => self.selection_page_updown(
selection,
(0..=selection).rev(),
false,
),
MoveSelection::PageHalfUp => self
.selection_page_updown(
selection,
(0..=selection).rev(),
true,
),
MoveSelection::PageDown => self
.selection_page_updown(
selection,
selection..(self.tree.len()),
false,
),
MoveSelection::PageHalfDown => self
.selection_page_updown(
selection,
selection..(self.tree.len()),
true,
),
};

Expand Down Expand Up @@ -295,8 +311,12 @@ impl StatusTree {
&self,
current_index: usize,
range: impl Iterator<Item = usize>,
half_page: bool,
) -> SelectionChange {
let page_size = self.window_height.get().unwrap_or(0);
let mut page_size = self.window_height.get().unwrap_or(0);
if half_page {
page_size = page_size.div_ceil(2);
}

let new_index = range
.filter(|index| {
Expand Down
4 changes: 4 additions & 0 deletions src/keys/key_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ pub struct KeysList {
pub popup_up: GituiKeyEvent,
pub popup_down: GituiKeyEvent,
pub page_down: GituiKeyEvent,
pub page_half_down: GituiKeyEvent,
pub page_up: GituiKeyEvent,
pub page_half_up: GituiKeyEvent,
pub shift_up: GituiKeyEvent,
pub shift_down: GituiKeyEvent,
pub enter: GituiKeyEvent,
Expand Down Expand Up @@ -162,6 +164,8 @@ impl Default for KeysList {
popup_down: GituiKeyEvent::new(KeyCode::Down, KeyModifiers::empty()),
page_down: GituiKeyEvent::new(KeyCode::PageDown, KeyModifiers::empty()),
page_up: GituiKeyEvent::new(KeyCode::PageUp, KeyModifiers::empty()),
page_half_down: GituiKeyEvent::new(KeyCode::Char('d'), KeyModifiers::CONTROL),
page_half_up: GituiKeyEvent::new(KeyCode::Char('u'), KeyModifiers::CONTROL),
shift_up: GituiKeyEvent::new(KeyCode::Up, KeyModifiers::SHIFT),
shift_down: GituiKeyEvent::new(KeyCode::Down, KeyModifiers::SHIFT),
enter: GituiKeyEvent::new(KeyCode::Enter, KeyModifiers::empty()),
Expand Down
24 changes: 24 additions & 0 deletions src/popups/blame_file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,9 +286,19 @@ impl Component for BlameFilePopup {
self.key_config.keys.page_down,
) {
self.move_selection(ScrollType::PageDown);
} else if key_match(
key,
self.key_config.keys.page_half_down,
) {
self.move_selection(ScrollType::PageHalfDown);
} else if key_match(key, self.key_config.keys.page_up)
{
self.move_selection(ScrollType::PageUp);
} else if key_match(
key,
self.key_config.keys.page_half_up,
) {
self.move_selection(ScrollType::PageHalfUp);
} else if key_match(
key,
self.key_config.keys.move_right,
Expand Down Expand Up @@ -728,11 +738,25 @@ impl BlameFilePopup {
ScrollType::PageUp => old_selection.saturating_sub(
self.current_height.get().saturating_sub(2),
),
ScrollType::PageHalfUp => old_selection.saturating_sub(
self.current_height
.get()
.saturating_sub(2)
.div_ceil(2),
),
ScrollType::PageDown => old_selection
.saturating_add(
self.current_height.get().saturating_sub(2),
)
.min(max_selection),
ScrollType::PageHalfDown => old_selection
.saturating_add(
self.current_height
.get()
.saturating_sub(2)
.div_ceil(2),
)
.min(max_selection),
};

let needs_update = new_selection != old_selection;
Expand Down
Loading