Position IME input according to where the selection is rendered
This commit is contained in:
@@ -11,7 +11,7 @@ use gpui::{
|
||||
fonts::{FontId, HighlightStyle},
|
||||
Entity, ModelContext, ModelHandle,
|
||||
};
|
||||
use language::{Point, Subscription as BufferSubscription};
|
||||
use language::{OffsetUtf16, Point, Subscription as BufferSubscription};
|
||||
use settings::Settings;
|
||||
use std::{any::TypeId, fmt::Debug, num::NonZeroU32, ops::Range, sync::Arc};
|
||||
use sum_tree::{Bias, TreeMap};
|
||||
@@ -549,6 +549,12 @@ impl ToDisplayPoint for usize {
|
||||
}
|
||||
}
|
||||
|
||||
impl ToDisplayPoint for OffsetUtf16 {
|
||||
fn to_display_point(&self, map: &DisplaySnapshot) -> DisplayPoint {
|
||||
self.to_offset(&map.buffer_snapshot).to_display_point(map)
|
||||
}
|
||||
}
|
||||
|
||||
impl ToDisplayPoint for Point {
|
||||
fn to_display_point(&self, map: &DisplaySnapshot) -> DisplayPoint {
|
||||
map.point_to_display_point(*self, Bias::Left)
|
||||
|
||||
@@ -30,7 +30,7 @@ use gpui::{
|
||||
WeakViewHandle,
|
||||
};
|
||||
use json::json;
|
||||
use language::{Bias, DiagnosticSeverity, Selection};
|
||||
use language::{Bias, DiagnosticSeverity, OffsetUtf16, Selection};
|
||||
use project::ProjectPath;
|
||||
use settings::Settings;
|
||||
use smallvec::SmallVec;
|
||||
@@ -1517,6 +1517,43 @@ impl Element for EditorElement {
|
||||
}
|
||||
}
|
||||
|
||||
fn rect_for_text_range(
|
||||
&self,
|
||||
range_utf16: Range<usize>,
|
||||
bounds: RectF,
|
||||
_: RectF,
|
||||
layout: &Self::LayoutState,
|
||||
_: &Self::PaintState,
|
||||
_: &gpui::MeasurementContext,
|
||||
) -> Option<RectF> {
|
||||
let text_bounds = RectF::new(
|
||||
bounds.origin() + vec2f(layout.gutter_size.x(), 0.0),
|
||||
layout.text_size,
|
||||
);
|
||||
let content_origin = text_bounds.origin() + vec2f(layout.gutter_margin, 0.);
|
||||
let scroll_position = layout.snapshot.scroll_position();
|
||||
let start_row = scroll_position.y() as u32;
|
||||
let scroll_top = scroll_position.y() * layout.line_height;
|
||||
let scroll_left = scroll_position.x() * layout.em_width;
|
||||
|
||||
let range_start =
|
||||
OffsetUtf16(range_utf16.start).to_display_point(&layout.snapshot.display_snapshot);
|
||||
if range_start.row() < start_row {
|
||||
return None;
|
||||
}
|
||||
|
||||
let line = layout
|
||||
.line_layouts
|
||||
.get((range_start.row() - start_row) as usize)?;
|
||||
let range_start_x = line.x_for_index(range_start.column() as usize);
|
||||
let range_start_y = range_start.row() as f32 * layout.line_height;
|
||||
Some(RectF::new(
|
||||
content_origin + vec2f(range_start_x, range_start_y + layout.line_height)
|
||||
- vec2f(scroll_left, scroll_top),
|
||||
vec2f(layout.em_width, layout.line_height),
|
||||
))
|
||||
}
|
||||
|
||||
fn debug(
|
||||
&self,
|
||||
bounds: RectF,
|
||||
|
||||
Reference in New Issue
Block a user