React on multibuffer scrolls again
This commit is contained in:
parent
a31d3eca45
commit
2f1a27631e
3 changed files with 59 additions and 23 deletions
|
@ -1196,6 +1196,7 @@ enum GotoDefinitionKind {
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
enum InlayRefreshReason {
|
enum InlayRefreshReason {
|
||||||
SettingsChange(editor_settings::InlayHints),
|
SettingsChange(editor_settings::InlayHints),
|
||||||
|
Scroll(ScrollAnchor),
|
||||||
VisibleExcerptsChange,
|
VisibleExcerptsChange,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2624,6 +2625,34 @@ impl Editor {
|
||||||
InlayRefreshReason::SettingsChange(new_settings) => self
|
InlayRefreshReason::SettingsChange(new_settings) => self
|
||||||
.inlay_hint_cache
|
.inlay_hint_cache
|
||||||
.spawn_settings_update(multi_buffer_handle, new_settings, current_inlays),
|
.spawn_settings_update(multi_buffer_handle, new_settings, current_inlays),
|
||||||
|
InlayRefreshReason::Scroll(scrolled_to) => {
|
||||||
|
if let Some(new_query) = self
|
||||||
|
.excerpt_visible_offsets(&multi_buffer_handle, cx)
|
||||||
|
.into_iter()
|
||||||
|
.find_map(|(buffer, _, excerpt_id)| {
|
||||||
|
let buffer_id = scrolled_to.anchor.buffer_id?;
|
||||||
|
if buffer_id == buffer.read(cx).remote_id()
|
||||||
|
&& scrolled_to.anchor.excerpt_id == excerpt_id
|
||||||
|
{
|
||||||
|
Some(InlayHintQuery {
|
||||||
|
buffer_id,
|
||||||
|
buffer_version: buffer.read(cx).version(),
|
||||||
|
excerpt_id,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
{
|
||||||
|
self.inlay_hint_cache.spawn_hints_update(
|
||||||
|
multi_buffer_handle,
|
||||||
|
vec![new_query],
|
||||||
|
current_inlays,
|
||||||
|
false,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
InlayRefreshReason::VisibleExcerptsChange => {
|
InlayRefreshReason::VisibleExcerptsChange => {
|
||||||
let replacement_queries = self
|
let replacement_queries = self
|
||||||
.excerpt_visible_offsets(&multi_buffer_handle, cx)
|
.excerpt_visible_offsets(&multi_buffer_handle, cx)
|
||||||
|
@ -2632,7 +2661,7 @@ impl Editor {
|
||||||
let buffer = buffer.read(cx);
|
let buffer = buffer.read(cx);
|
||||||
InlayHintQuery {
|
InlayHintQuery {
|
||||||
buffer_id: buffer.remote_id(),
|
buffer_id: buffer.remote_id(),
|
||||||
buffer_version: buffer.version.clone(),
|
buffer_version: buffer.version(),
|
||||||
excerpt_id,
|
excerpt_id,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -2641,6 +2670,7 @@ impl Editor {
|
||||||
multi_buffer_handle,
|
multi_buffer_handle,
|
||||||
replacement_queries,
|
replacement_queries,
|
||||||
current_inlays,
|
current_inlays,
|
||||||
|
true,
|
||||||
cx,
|
cx,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,27 +102,29 @@ impl InlayHintCache {
|
||||||
multi_buffer: ModelHandle<MultiBuffer>,
|
multi_buffer: ModelHandle<MultiBuffer>,
|
||||||
queries: Vec<InlayHintQuery>,
|
queries: Vec<InlayHintQuery>,
|
||||||
current_inlays: Vec<Inlay>,
|
current_inlays: Vec<Inlay>,
|
||||||
|
conflicts_invalidate_cache: bool,
|
||||||
cx: &mut ViewContext<Editor>,
|
cx: &mut ViewContext<Editor>,
|
||||||
) {
|
) {
|
||||||
let conflicts_with_cache = queries.iter().any(|update_query| {
|
let conflicts_with_cache = conflicts_invalidate_cache
|
||||||
let Some(cached_buffer_hints) = self.hints_in_buffers.get(&update_query.buffer_id)
|
&& queries.iter().any(|update_query| {
|
||||||
|
let Some(cached_buffer_hints) = self.hints_in_buffers.get(&update_query.buffer_id)
|
||||||
else { return false };
|
else { return false };
|
||||||
if cached_buffer_hints
|
if cached_buffer_hints
|
||||||
.buffer_version
|
.buffer_version
|
||||||
.changed_since(&update_query.buffer_version)
|
.changed_since(&update_query.buffer_version)
|
||||||
{
|
{
|
||||||
false
|
false
|
||||||
} else if update_query
|
} else if update_query
|
||||||
.buffer_version
|
.buffer_version
|
||||||
.changed_since(&cached_buffer_hints.buffer_version)
|
.changed_since(&cached_buffer_hints.buffer_version)
|
||||||
{
|
{
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
cached_buffer_hints
|
cached_buffer_hints
|
||||||
.hints_per_excerpt
|
.hints_per_excerpt
|
||||||
.contains_key(&update_query.excerpt_id)
|
.contains_key(&update_query.excerpt_id)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let queries_per_buffer = queries
|
let queries_per_buffer = queries
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -569,7 +571,6 @@ fn allowed_hint_types(
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO kb wrong, query and update the editor separately
|
// TODO kb wrong, query and update the editor separately
|
||||||
// TODO kb need to react on react on scrolling too, for multibuffer excerpts
|
|
||||||
fn fetch_queries(
|
fn fetch_queries(
|
||||||
multi_buffer: ModelHandle<MultiBuffer>,
|
multi_buffer: ModelHandle<MultiBuffer>,
|
||||||
queries: impl Iterator<Item = InlayHintQuery>,
|
queries: impl Iterator<Item = InlayHintQuery>,
|
||||||
|
|
|
@ -13,7 +13,7 @@ use gpui::{
|
||||||
};
|
};
|
||||||
use language::{Bias, Point};
|
use language::{Bias, Point};
|
||||||
use util::ResultExt;
|
use util::ResultExt;
|
||||||
use workspace::WorkspaceId;
|
use workspace::{item::Item, WorkspaceId};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
display_map::{DisplaySnapshot, ToDisplayPoint},
|
display_map::{DisplaySnapshot, ToDisplayPoint},
|
||||||
|
@ -176,7 +176,7 @@ impl ScrollManager {
|
||||||
autoscroll: bool,
|
autoscroll: bool,
|
||||||
workspace_id: Option<i64>,
|
workspace_id: Option<i64>,
|
||||||
cx: &mut ViewContext<Editor>,
|
cx: &mut ViewContext<Editor>,
|
||||||
) {
|
) -> ScrollAnchor {
|
||||||
let (new_anchor, top_row) = if scroll_position.y() <= 0. {
|
let (new_anchor, top_row) = if scroll_position.y() <= 0. {
|
||||||
(
|
(
|
||||||
ScrollAnchor {
|
ScrollAnchor {
|
||||||
|
@ -205,6 +205,7 @@ impl ScrollManager {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.set_anchor(new_anchor, top_row, local, autoscroll, workspace_id, cx);
|
self.set_anchor(new_anchor, top_row, local, autoscroll, workspace_id, cx);
|
||||||
|
new_anchor
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_anchor(
|
fn set_anchor(
|
||||||
|
@ -312,7 +313,7 @@ impl Editor {
|
||||||
|
|
||||||
hide_hover(self, cx);
|
hide_hover(self, cx);
|
||||||
let workspace_id = self.workspace.as_ref().map(|workspace| workspace.1);
|
let workspace_id = self.workspace.as_ref().map(|workspace| workspace.1);
|
||||||
self.scroll_manager.set_scroll_position(
|
let scroll_anchor = self.scroll_manager.set_scroll_position(
|
||||||
scroll_position,
|
scroll_position,
|
||||||
&map,
|
&map,
|
||||||
local,
|
local,
|
||||||
|
@ -320,6 +321,10 @@ impl Editor {
|
||||||
workspace_id,
|
workspace_id,
|
||||||
cx,
|
cx,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if !self.is_singleton(cx) {
|
||||||
|
self.refresh_inlays(crate::InlayRefreshReason::Scroll(scroll_anchor), cx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn scroll_position(&self, cx: &mut ViewContext<Self>) -> Vector2F {
|
pub fn scroll_position(&self, cx: &mut ViewContext<Self>) -> Vector2F {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue