Fixed mouse scroll events in opener
This commit is contained in:
parent
52b07bfc0b
commit
517c952606
4 changed files with 25 additions and 21 deletions
|
|
@ -480,26 +480,23 @@ impl RawEvent {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn to_mouse(&self, area: Area, drag_id_counter: &mut usize) -> Option<Action> {
|
||||
pub fn to_mouse(&self, drag_id_counter: &mut usize) -> Option<Action> {
|
||||
let TerminalEvent::Mouse(ev) = self.0 else {
|
||||
return None;
|
||||
};
|
||||
|
||||
if let Some(pos) = area.contains([ev.column as isize, ev.row as isize]) {
|
||||
let action = match ev.kind {
|
||||
MouseEventKind::ScrollUp => MouseAction::Scroll(Dir::Up),
|
||||
MouseEventKind::ScrollDown => MouseAction::Scroll(Dir::Down),
|
||||
MouseEventKind::Down(MouseButton::Left) => {
|
||||
*drag_id_counter += 1;
|
||||
MouseAction::Click
|
||||
}
|
||||
MouseEventKind::Drag(MouseButton::Left) => MouseAction::Drag,
|
||||
_ => return None,
|
||||
};
|
||||
let is_ctrl = ev.modifiers == KeyModifiers::CONTROL;
|
||||
Some(Action::Mouse(action, pos, is_ctrl, *drag_id_counter))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
let pos = [ev.column as isize, ev.row as isize];
|
||||
let action = match ev.kind {
|
||||
MouseEventKind::ScrollUp => MouseAction::Scroll(Dir::Up),
|
||||
MouseEventKind::ScrollDown => MouseAction::Scroll(Dir::Down),
|
||||
MouseEventKind::Down(MouseButton::Left) => {
|
||||
*drag_id_counter += 1;
|
||||
MouseAction::Click
|
||||
}
|
||||
MouseEventKind::Drag(MouseButton::Left) => MouseAction::Drag,
|
||||
_ => return None,
|
||||
};
|
||||
let is_ctrl = ev.modifiers == KeyModifiers::CONTROL;
|
||||
Some(Action::Mouse(action, pos, is_ctrl, *drag_id_counter))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,7 +97,9 @@ impl Input {
|
|||
self.refocus(buffer, cursor_id);
|
||||
Ok(Resp::handled(None))
|
||||
}
|
||||
Some(Action::Mouse(MouseAction::Scroll(dir), pos, _, _)) if is_doc => {
|
||||
Some(Action::Mouse(MouseAction::Scroll(dir), pos, _, _))
|
||||
if is_doc && self.last_area.contains(pos).is_some() =>
|
||||
{
|
||||
let dist = [1, 1];
|
||||
let dfocus = match dir {
|
||||
Dir::Up => [0, -1],
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ pub struct Panes {
|
|||
selected: usize,
|
||||
panes: Vec<Pane>,
|
||||
last_area: Area,
|
||||
drag_id_counter: usize,
|
||||
}
|
||||
|
||||
impl Panes {
|
||||
|
|
@ -30,7 +29,6 @@ impl Panes {
|
|||
})
|
||||
.collect(),
|
||||
last_area: Default::default(),
|
||||
drag_id_counter: 0,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -46,7 +44,6 @@ impl Element for Panes {
|
|||
.map(Action::PaneMove)
|
||||
.or_else(|| e.to_pane_open().map(Action::PaneOpen))
|
||||
.or_else(|| e.to_pane_close())
|
||||
.or_else(|| e.to_mouse(self.last_area, &mut self.drag_id_counter))
|
||||
}) {
|
||||
Some(Action::PaneMove(Dir::Left)) => {
|
||||
self.selected = (self.selected + self.panes.len() - 1) % self.panes.len();
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ pub struct Root {
|
|||
panes: Panes,
|
||||
status: Status,
|
||||
tasks: Vec<Task>,
|
||||
drag_id_counter: usize,
|
||||
}
|
||||
|
||||
pub enum Task {
|
||||
|
|
@ -35,12 +36,19 @@ impl Root {
|
|||
panes: Panes::new(state, buffers),
|
||||
status: Status,
|
||||
tasks: Vec::new(),
|
||||
drag_id_counter: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Element<()> for Root {
|
||||
fn handle(&mut self, state: &mut State, mut event: Event) -> Result<Resp<()>, Event> {
|
||||
// Perform any top-level conversion of raw events
|
||||
let mut event = event
|
||||
.to_action(|e| e.to_mouse(&mut self.drag_id_counter))
|
||||
.map(Event::Action)
|
||||
.unwrap_or(event);
|
||||
|
||||
// Pass the event down through the list of tasks until we meet one that can handle it
|
||||
let mut task_idx = self.tasks.len();
|
||||
let event = loop {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue