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:
parent
5c95d2806b
commit
ed50dea042
1 changed files with 31 additions and 8 deletions
|
@ -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| {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue