Detailed changes
@@ -454,9 +454,9 @@ impl workspace::Item for ProjectDiagnosticsEditor {
None
}
- fn navigate(&mut self, data: Box<dyn Any>, cx: &mut ViewContext<Self>) {
+ fn navigate(&mut self, data: Box<dyn Any>, cx: &mut ViewContext<Self>) -> bool {
self.editor
- .update(cx, |editor, cx| editor.navigate(data, cx));
+ .update(cx, |editor, cx| editor.navigate(data, cx))
}
fn is_dirty(&self, cx: &AppContext) -> bool {
@@ -241,7 +241,7 @@ fn deserialize_selection(
}
impl Item for Editor {
- fn navigate(&mut self, data: Box<dyn std::any::Any>, cx: &mut ViewContext<Self>) {
+ fn navigate(&mut self, data: Box<dyn std::any::Any>, cx: &mut ViewContext<Self>) -> bool {
if let Some(data) = data.downcast_ref::<NavigationData>() {
let buffer = self.buffer.read(cx).read(cx);
let offset = if buffer.can_resolve(&data.anchor) {
@@ -249,11 +249,19 @@ impl Item for Editor {
} else {
buffer.clip_offset(data.offset, Bias::Left)
};
-
+ let newest_selection = self.newest_selection_with_snapshot::<usize>(&buffer);
drop(buffer);
- let nav_history = self.nav_history.take();
- self.select_ranges([offset..offset], Some(Autoscroll::Fit), cx);
- self.nav_history = nav_history;
+
+ if newest_selection.head() == offset {
+ false
+ } else {
+ let nav_history = self.nav_history.take();
+ self.select_ranges([offset..offset], Some(Autoscroll::Fit), cx);
+ self.nav_history = nav_history;
+ true
+ }
+ } else {
+ false
}
}
@@ -302,9 +302,9 @@ impl Item for ProjectSearchView {
});
}
- fn navigate(&mut self, data: Box<dyn Any>, cx: &mut ViewContext<Self>) {
+ fn navigate(&mut self, data: Box<dyn Any>, cx: &mut ViewContext<Self>) -> bool {
self.results_editor
- .update(cx, |editor, cx| editor.navigate(data, cx));
+ .update(cx, |editor, cx| editor.navigate(data, cx))
}
fn should_update_tab_on_event(event: &ViewEvent) -> bool {
@@ -212,40 +212,47 @@ impl Pane {
workspace.activate_pane(pane.clone(), cx);
let to_load = pane.update(cx, |pane, cx| {
- // Retrieve the weak item handle from the history.
- let entry = pane.nav_history.borrow_mut().pop(mode)?;
-
- // If the item is still present in this pane, then activate it.
- if let Some(index) = entry
- .item
- .upgrade(cx)
- .and_then(|v| pane.index_for_item(v.as_ref()))
- {
- if let Some(item) = pane.active_item() {
- pane.nav_history.borrow_mut().set_mode(mode);
- item.deactivated(cx);
- pane.nav_history
- .borrow_mut()
- .set_mode(NavigationMode::Normal);
- }
+ loop {
+ // Retrieve the weak item handle from the history.
+ let entry = pane.nav_history.borrow_mut().pop(mode)?;
+
+ // If the item is still present in this pane, then activate it.
+ if let Some(index) = entry
+ .item
+ .upgrade(cx)
+ .and_then(|v| pane.index_for_item(v.as_ref()))
+ {
+ if let Some(item) = pane.active_item() {
+ pane.nav_history.borrow_mut().set_mode(mode);
+ item.deactivated(cx);
+ pane.nav_history
+ .borrow_mut()
+ .set_mode(NavigationMode::Normal);
+ }
+
+ let prev_active_index = mem::replace(&mut pane.active_item_index, index);
+ pane.focus_active_item(cx);
+ let mut navigated = prev_active_index != pane.active_item_index;
+ if let Some(data) = entry.data {
+ navigated |= pane.active_item()?.navigate(data, cx);
+ }
- pane.active_item_index = index;
- pane.focus_active_item(cx);
- if let Some(data) = entry.data {
- pane.active_item()?.navigate(data, cx);
+ if navigated {
+ cx.notify();
+ break None;
+ }
+ }
+ // If the item is no longer present in this pane, then retrieve its
+ // project path in order to reopen it.
+ else {
+ break pane
+ .nav_history
+ .borrow_mut()
+ .paths_by_item
+ .get(&entry.item.id())
+ .cloned()
+ .map(|project_path| (project_path, entry));
}
- cx.notify();
- None
- }
- // If the item is no longer present in this pane, then retrieve its
- // project path in order to reopen it.
- else {
- pane.nav_history
- .borrow_mut()
- .paths_by_item
- .get(&entry.item.id())
- .cloned()
- .map(|project_path| (project_path, entry))
}
});
@@ -203,7 +203,9 @@ pub struct JoinProjectParams {
pub trait Item: View {
fn deactivated(&mut self, _: &mut ViewContext<Self>) {}
- fn navigate(&mut self, _: Box<dyn Any>, _: &mut ViewContext<Self>) {}
+ fn navigate(&mut self, _: Box<dyn Any>, _: &mut ViewContext<Self>) -> bool {
+ false
+ }
fn tab_content(&self, style: &theme::Tab, cx: &AppContext) -> ElementBox;
fn project_path(&self, cx: &AppContext) -> Option<ProjectPath>;
fn project_entry_id(&self, cx: &AppContext) -> Option<ProjectEntryId>;
@@ -362,7 +364,7 @@ pub trait ItemHandle: 'static + fmt::Debug {
cx: &mut ViewContext<Workspace>,
);
fn deactivated(&self, cx: &mut MutableAppContext);
- fn navigate(&self, data: Box<dyn Any>, cx: &mut MutableAppContext);
+ fn navigate(&self, data: Box<dyn Any>, cx: &mut MutableAppContext) -> bool;
fn id(&self) -> usize;
fn to_any(&self) -> AnyViewHandle;
fn is_dirty(&self, cx: &AppContext) -> bool;
@@ -510,8 +512,8 @@ impl<T: Item> ItemHandle for ViewHandle<T> {
self.update(cx, |this, cx| this.deactivated(cx));
}
- fn navigate(&self, data: Box<dyn Any>, cx: &mut MutableAppContext) {
- self.update(cx, |this, cx| this.navigate(data, cx));
+ fn navigate(&self, data: Box<dyn Any>, cx: &mut MutableAppContext) -> bool {
+ self.update(cx, |this, cx| this.navigate(data, cx))
}
fn save(&self, project: ModelHandle<Project>, cx: &mut MutableAppContext) -> Task<Result<()>> {