Only clear selections when right click was performed outside of selection (#13701)

Release Notes:

- Fixed selections being cleared when right-click was performed outside
of a selection
([#4267](https://github.com/zed-industries/zed/pull/13701)).

<img width="1136" alt="Screenshot 2024-07-01 at 16 53 58"
src="https://github.com/zed-industries/zed/assets/43210583/082bfb0a-c679-4e87-a4e8-7dd751d8f4a2">
This commit is contained in:
Stanislav Alekseev 2024-07-09 07:07:09 +03:00 committed by GitHub
parent 5c95d2806b
commit ed50dea042
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,7 +1,10 @@
use std::ops::Range;
use crate::{ use crate::{
Copy, CopyPermalinkToLine, Cut, DisplayPoint, Editor, EditorMode, FindAllReferences, selections_collection::SelectionsCollection, Copy, CopyPermalinkToLine, Cut, DisplayPoint,
GoToDefinition, GoToImplementation, GoToTypeDefinition, Paste, Rename, RevealInFinder, DisplaySnapshot, Editor, EditorMode, FindAllReferences, GoToDefinition, GoToImplementation,
SelectMode, ToggleCodeActions, GoToTypeDefinition, Paste, Rename, RevealInFinder, SelectMode, ToDisplayPoint,
ToggleCodeActions,
}; };
use gpui::{DismissEvent, Pixels, Point, Subscription, View, ViewContext}; use gpui::{DismissEvent, Pixels, Point, Subscription, View, ViewContext};
use workspace::OpenInTerminal; use workspace::OpenInTerminal;
@ -37,6 +40,23 @@ impl MouseContextMenu {
} }
} }
fn display_ranges<'a>(
display_map: &'a DisplaySnapshot,
selections: &'a SelectionsCollection,
) -> impl Iterator<Item = Range<DisplayPoint>> + 'a {
let pending = selections
.pending
.as_ref()
.map(|pending| &pending.selection);
selections.disjoint.iter().chain(pending).map(move |s| {
if s.reversed {
s.end.to_display_point(&display_map)..s.start.to_display_point(&display_map)
} else {
s.start.to_display_point(&display_map)..s.end.to_display_point(&display_map)
}
})
}
pub fn deploy_context_menu( pub fn deploy_context_menu(
editor: &mut Editor, editor: &mut Editor,
position: Point<Pixels>, position: Point<Pixels>,
@ -65,11 +85,14 @@ pub fn deploy_context_menu(
return; return;
} }
let display_map = editor.selections.display_map(cx);
if !display_ranges(&display_map, &editor.selections).any(|r| r.contains(&point)) {
// Move the cursor to the clicked location so that dispatched actions make sense // Move the cursor to the clicked location so that dispatched actions make sense
editor.change_selections(None, cx, |s| { editor.change_selections(None, cx, |s| {
s.clear_disjoint(); s.clear_disjoint();
s.set_pending_display_range(point..point, SelectMode::Character); s.set_pending_display_range(point..point, SelectMode::Character);
}); });
}
let focus = cx.focused(); let focus = cx.focused();
ui::ContextMenu::build(cx, |menu, _cx| { ui::ContextMenu::build(cx, |menu, _cx| {