Skip to content

Commit 457f644

Browse files
authored
Support mouse scrolling (#306)
Linked to #226
1 parent 6c974ee commit 457f644

File tree

5 files changed

+95
-8
lines changed

5 files changed

+95
-8
lines changed

src/components/commit_details/details.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ use asyncgit::{
1212
sync::{self, CommitDetails, CommitId, CommitMessage},
1313
CWD,
1414
};
15-
use crossterm::event::Event;
15+
use crossterm::event::{
16+
Event,
17+
MouseEventKind::{ScrollDown, ScrollUp},
18+
};
1619
use itertools::Itertools;
1720
use std::clone::Clone;
1821
use std::{borrow::Cow, cell::Cell};
@@ -394,7 +397,15 @@ impl Component for DetailsComponent {
394397

395398
fn event(&mut self, event: Event) -> Result<bool> {
396399
if self.focused {
397-
if let Event::Key(e) = event {
400+
if let Event::Mouse(mouse_ev) = event {
401+
return Ok(match mouse_ev.kind {
402+
ScrollUp => self.move_scroll_top(ScrollType::Up),
403+
ScrollDown => {
404+
self.move_scroll_top(ScrollType::Down)
405+
}
406+
_ => false,
407+
});
408+
} else if let Event::Key(e) = event {
398409
return Ok(if e == self.key_config.move_up {
399410
self.move_scroll_top(ScrollType::Up)
400411
} else if e == self.key_config.move_down {

src/components/commitlist.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ use crate::{
1111
};
1212
use anyhow::Result;
1313
use asyncgit::sync::Tags;
14-
use crossterm::event::Event;
14+
use crossterm::event::{
15+
Event,
16+
MouseEventKind::{ScrollDown, ScrollUp},
17+
};
1518
use std::{
1619
borrow::Cow, cell::Cell, cmp, convert::TryFrom, time::Instant,
1720
};
@@ -346,7 +349,16 @@ impl DrawableComponent for CommitList {
346349

347350
impl Component for CommitList {
348351
fn event(&mut self, ev: Event) -> Result<bool> {
349-
if let Event::Key(k) = ev {
352+
if let Event::Mouse(mouse_ev) = ev {
353+
let selection_changed = match mouse_ev.kind {
354+
ScrollUp => self.move_selection(ScrollType::Up)?,
355+
ScrollDown => {
356+
self.move_selection(ScrollType::Down)?
357+
}
358+
_ => false,
359+
};
360+
return Ok(selection_changed);
361+
} else if let Event::Key(k) = ev {
350362
let selection_changed = if k == self.key_config.move_up {
351363
self.move_selection(ScrollType::Up)?
352364
} else if k == self.key_config.move_down {

src/components/diff.rs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ use crate::{
1111
use anyhow::Result;
1212
use asyncgit::{hash, sync, DiffLine, DiffLineType, FileDiff, CWD};
1313
use bytesize::ByteSize;
14-
use crossterm::event::Event;
14+
use crossterm::event::{
15+
Event, KeyModifiers,
16+
MouseEventKind::{ScrollDown, ScrollUp},
17+
};
1518
use std::{borrow::Cow, cell::Cell, cmp, path::Path};
1619
use tui::{
1720
backend::Backend,
@@ -629,9 +632,54 @@ impl Component for DiffComponent {
629632
CommandBlocking::PassingOn
630633
}
631634

635+
#[allow(clippy::too_many_lines)]
632636
fn event(&mut self, ev: Event) -> Result<bool> {
633637
if self.focused {
634-
if let Event::Key(e) = ev {
638+
if let Event::Mouse(mouse_ev) = ev {
639+
return match mouse_ev.kind {
640+
ScrollUp => {
641+
match mouse_ev.modifiers {
642+
KeyModifiers::SHIFT => {
643+
self.modify_selection(Direction::Up);
644+
}
645+
KeyModifiers::CONTROL => {
646+
self.modify_selection(Direction::Up);
647+
self.modify_selection(Direction::Up);
648+
self.modify_selection(Direction::Up);
649+
}
650+
KeyModifiers::NONE => {
651+
self.move_selection(ScrollType::Up);
652+
}
653+
_ => {}
654+
};
655+
Ok(true)
656+
}
657+
ScrollDown => {
658+
match mouse_ev.modifiers {
659+
KeyModifiers::SHIFT => {
660+
self.modify_selection(Direction::Down)
661+
}
662+
KeyModifiers::CONTROL => {
663+
self.modify_selection(
664+
Direction::Down,
665+
);
666+
self.modify_selection(
667+
Direction::Down,
668+
);
669+
self.modify_selection(
670+
Direction::Down,
671+
);
672+
}
673+
KeyModifiers::NONE => {
674+
self.move_selection(ScrollType::Down);
675+
}
676+
_ => {}
677+
};
678+
Ok(true)
679+
}
680+
_ => Ok(false),
681+
};
682+
} else if let Event::Key(e) = ev {
635683
return if e == self.key_config.move_down {
636684
self.move_selection(ScrollType::Down);
637685
Ok(true)

src/components/filetree.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ use crate::{
1515
};
1616
use anyhow::Result;
1717
use asyncgit::{hash, StatusItem, StatusItemType};
18-
use crossterm::event::Event;
18+
use crossterm::event::{
19+
Event,
20+
MouseEventKind::{ScrollDown, ScrollUp},
21+
};
1922
use std::{borrow::Cow, cell::Cell, convert::From, path::Path};
2023
use tui::{backend::Backend, layout::Rect, text::Span, Frame};
2124

@@ -395,7 +398,17 @@ impl Component for FileTreeComponent {
395398

396399
fn event(&mut self, ev: Event) -> Result<bool> {
397400
if self.focused {
398-
if let Event::Key(e) = ev {
401+
if let Event::Mouse(mouse_ev) = ev {
402+
return match mouse_ev.kind {
403+
ScrollUp => {
404+
Ok(self.move_selection(MoveSelection::Up))
405+
}
406+
ScrollDown => {
407+
Ok(self.move_selection(MoveSelection::Down))
408+
}
409+
_ => Ok(false),
410+
};
411+
} else if let Event::Key(e) = ev {
399412
return if e == self.key_config.move_down {
400413
Ok(self.move_selection(MoveSelection::Down))
401414
} else if e == self.key_config.move_up {

src/main.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ use clap::{
3535
};
3636
use crossbeam_channel::{tick, unbounded, Receiver, Select};
3737
use crossterm::{
38+
event::{DisableMouseCapture, EnableMouseCapture},
3839
terminal::{
3940
disable_raw_mode, enable_raw_mode, EnterAlternateScreen,
4041
LeaveAlternateScreen,
@@ -167,11 +168,13 @@ fn main() -> Result<()> {
167168
fn setup_terminal() -> Result<()> {
168169
enable_raw_mode()?;
169170
io::stdout().execute(EnterAlternateScreen)?;
171+
io::stdout().execute(EnableMouseCapture)?;
170172
Ok(())
171173
}
172174

173175
fn shutdown_terminal() -> Result<()> {
174176
io::stdout().execute(LeaveAlternateScreen)?;
177+
io::stdout().execute(DisableMouseCapture)?;
175178
disable_raw_mode()?;
176179
Ok(())
177180
}

0 commit comments

Comments
 (0)