on master help sign in
Refactor handling of mouse events (#2893)
3108a11Gokul Soumya
helix-term/src/ui/editor.rs+38−69
@@ -1051,22 +1051,33 @@ impl EditorView {
1051 cxt: &mut commands::Context,
1051 cxt: &mut commands::Context,
1052 ) -> EventResult {
1052 ) -> EventResult {
1053 let config = cxt.editor.config();
1053 let config = cxt.editor.config();
1054− match event {
1055− MouseEvent {
1054+ let MouseEvent {
1056− kind: MouseEventKind::Down(MouseButton::Left),
1055+ kind,
1057− row,
1056+ row,
1058− column,
1057+ column,
1059− modifiers,
1058+ modifiers,
1060− ..
1059+ ..
1061− } => {
1060+ } = event;
1062− let editor = &mut cxt.editor;
1061+
1062+ let pos_and_view = |editor: &Editor, row, column| {
1063+ editor.tree.views().find_map(|(view, _focus)| {
1064+ view.pos_at_screen_coords(&editor.documents[&view.doc], row, column)
1065+ .map(|pos| (pos, view.id))
1066+ })
1067+ };
1068+
1069+ let gutter_coords_and_view = |editor: &Editor, row, column| {
1070+ editor.tree.views().find_map(|(view, _focus)| {
1071+ view.gutter_coords_at_screen_coords(row, column)
1072+ .map(|coords| (coords, view.id))
1073+ })
1074+ };
1063
1075
1064− let result = editor.tree.views().find_map(|(view, _focus)| {
1076+ match kind {
1065− view.pos_at_screen_coords(&editor.documents[&view.doc], row, column)
1077+ MouseEventKind::Down(MouseButton::Left) => {
1066− .map(|pos| (pos, view.id))
1078+ let editor = &mut cxt.editor;
1067− });
1068
1079
1069− if let Some((pos, view_id)) = result {
1080+ if let Some((pos, view_id)) = pos_and_view(editor, row, column) {
1070 let doc = editor.document_mut(editor.tree.get(view_id).doc).unwrap();
1081 let doc = editor.document_mut(editor.tree.get(view_id).doc).unwrap();
1071
1082
1072 if modifiers == crossterm::event::KeyModifiers::ALT {
1083 if modifiers == crossterm::event::KeyModifiers::ALT {
@@ -1081,12 +1092,7 @@ impl EditorView {
1081 return EventResult::Consumed(None);
1092 return EventResult::Consumed(None);
1082 }
1093 }
1083
1094
1084− let result = editor.tree.views().find_map(|(view, _focus)| {
1085− view.gutter_coords_at_screen_coords(row, column)
1086− .map(|coords| (coords, view.id))
1087− });
1088−
1089− if let Some((coords, view_id)) = result {
1095+ if let Some((coords, view_id)) = gutter_coords_and_view(editor, row, column) {
1090 editor.tree.focus = view_id;
1096 editor.tree.focus = view_id;
1091
1097
1092 let view = editor.tree.get(view_id);
1098 let view = editor.tree.get(view_id);
@@ -1107,12 +1113,7 @@ impl EditorView {
1107 EventResult::Ignored(None)
1113 EventResult::Ignored(None)
1108 }
1114 }
1109
1115
1110− MouseEvent {
1111− kind: MouseEventKind::Drag(MouseButton::Left),
1116+ MouseEventKind::Drag(MouseButton::Left) => {
1112− row,
1113− column,
1114− ..
1115− } => {
1116 let (view, doc) = current!(cxt.editor);
1117 let (view, doc) = current!(cxt.editor);
1117
1118
1118 let pos = match view.pos_at_screen_coords(doc, row, column) {
1119 let pos = match view.pos_at_screen_coords(doc, row, column) {
@@ -1124,15 +1125,11 @@ impl EditorView {
1124 let primary = selection.primary_mut();
1125 let primary = selection.primary_mut();
1125 *primary = primary.put_cursor(doc.text().slice(..), pos, true);
1126 *primary = primary.put_cursor(doc.text().slice(..), pos, true);
1126 doc.set_selection(view.id, selection);
1127 doc.set_selection(view.id, selection);
1128+
1127 EventResult::Consumed(None)
1129 EventResult::Consumed(None)
1128 }
1130 }
1129
1131
1130− MouseEvent {
1131− kind: MouseEventKind::ScrollUp | MouseEventKind::ScrollDown,
1132+ MouseEventKind::ScrollUp | MouseEventKind::ScrollDown => {
1132− row,
1133− column,
1134− ..
1135− } => {
1136 let current_view = cxt.editor.tree.focus;
1133 let current_view = cxt.editor.tree.focus;
1137
1134
1138 let direction = match event.kind {
1135 let direction = match event.kind {
@@ -1141,13 +1138,8 @@ impl EditorView {
1141 _ => unreachable!(),
1138 _ => unreachable!(),
1142 };
1139 };
1143
1140
1144− let result = cxt.editor.tree.views().find_map(|(view, _focus)| {
1141+ match pos_and_view(cxt.editor, row, column) {
1145− view.pos_at_screen_coords(&cxt.editor.documents[&view.doc], row, column)
1146− .map(|_| view.id)
1147− });
1148−
1149− match result {
1150− Some(view_id) => cxt.editor.tree.focus = view_id,
1142+ Some((_, view_id)) => cxt.editor.tree.focus = view_id,
1151 None => return EventResult::Ignored(None),
1143 None => return EventResult::Ignored(None),
1152 }
1144 }
1153
1145
@@ -1159,10 +1151,7 @@ impl EditorView {
1159 EventResult::Consumed(None)
1151 EventResult::Consumed(None)
1160 }
1152 }
1161
1153
1162− MouseEvent {
1163− kind: MouseEventKind::Up(MouseButton::Left),
1154+ MouseEventKind::Up(MouseButton::Left) => {
1164− ..
1165− } => {
1166 if !config.middle_click_paste {
1155 if !config.middle_click_paste {
1167 return EventResult::Ignored(None);
1156 return EventResult::Ignored(None);
1168 }
1157 }
@@ -1184,19 +1173,8 @@ impl EditorView {
1184 EventResult::Consumed(None)
1173 EventResult::Consumed(None)
1185 }
1174 }
1186
1175
1187− MouseEvent {
1188− kind: MouseEventKind::Up(MouseButton::Right),
1176+ MouseEventKind::Up(MouseButton::Right) => {
1189− row,
1190− column,
1191− modifiers,
1192− ..
1193− } => {
1194− let result = cxt.editor.tree.views().find_map(|(view, _focus)| {
1195− view.gutter_coords_at_screen_coords(row, column)
1196− .map(|coords| (coords, view.id))
1197− });
1198−
1199− if let Some((coords, view_id)) = result {
1177+ if let Some((coords, view_id)) = gutter_coords_and_view(cxt.editor, row, column) {
1200 cxt.editor.tree.focus = view_id;
1178 cxt.editor.tree.focus = view_id;
1201
1179
1202 let view = cxt.editor.tree.get(view_id);
1180 let view = cxt.editor.tree.get(view_id);
@@ -1213,16 +1191,11 @@ impl EditorView {
1213 return EventResult::Consumed(None);
1191 return EventResult::Consumed(None);
1214 }
1192 }
1215 }
1193 }
1194+
1216 EventResult::Ignored(None)
1195 EventResult::Ignored(None)
1217 }
1196 }
1218
1197
1219− MouseEvent {
1220− kind: MouseEventKind::Up(MouseButton::Middle),
1198+ MouseEventKind::Up(MouseButton::Middle) => {
1221− row,
1222− column,
1223− modifiers,
1224− ..
1225− } => {
1226 let editor = &mut cxt.editor;
1199 let editor = &mut cxt.editor;
1227 if !config.middle_click_paste {
1200 if !config.middle_click_paste {
1228 return EventResult::Ignored(None);
1201 return EventResult::Ignored(None);
@@ -1235,16 +1208,12 @@ impl EditorView {
1235 return EventResult::Consumed(None);
1208 return EventResult::Consumed(None);
1236 }
1209 }
1237
1210
1238− let result = editor.tree.views().find_map(|(view, _focus)| {
1239− view.pos_at_screen_coords(&editor.documents[&view.doc], row, column)
1240− .map(|pos| (pos, view.id))
1241− });
1242−
1243− if let Some((pos, view_id)) = result {
1211+ if let Some((pos, view_id)) = pos_and_view(editor, row, column) {
1244 let doc = editor.document_mut(editor.tree.get(view_id).doc).unwrap();
1212 let doc = editor.document_mut(editor.tree.get(view_id).doc).unwrap();
1245 doc.set_selection(view_id, Selection::point(pos));
1213 doc.set_selection(view_id, Selection::point(pos));
1246 editor.tree.focus = view_id;
1214 editor.tree.focus = view_id;
1247 commands::MappableCommand::paste_primary_clipboard_before.execute(cxt);
1215 commands::MappableCommand::paste_primary_clipboard_before.execute(cxt);
1216+
1248 return EventResult::Consumed(None);
1217 return EventResult::Consumed(None);
1249 }
1218 }
1250
1219