input: Use closest_index_for_position from GPUI. (#593)
This commit is contained in:
parent
8e931bd862
commit
85c6872e68
3 changed files with 26 additions and 126 deletions
55
Cargo.lock
generated
55
Cargo.lock
generated
|
|
@ -474,7 +474,7 @@ dependencies = [
|
||||||
"bitflags 2.6.0",
|
"bitflags 2.6.0",
|
||||||
"cexpr",
|
"cexpr",
|
||||||
"clang-sys",
|
"clang-sys",
|
||||||
"itertools 0.13.0",
|
"itertools 0.11.0",
|
||||||
"log",
|
"log",
|
||||||
"prettyplease",
|
"prettyplease",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
|
@ -952,7 +952,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "collections"
|
name = "collections"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap 2.7.1",
|
"indexmap 2.7.1",
|
||||||
"rustc-hash 2.1.0",
|
"rustc-hash 2.1.0",
|
||||||
|
|
@ -1316,7 +1316,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "derive_refineable"
|
name = "derive_refineable"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
@ -2275,7 +2275,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gpui"
|
name = "gpui"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"as-raw-xcb-connection",
|
"as-raw-xcb-connection",
|
||||||
|
|
@ -2309,8 +2309,8 @@ dependencies = [
|
||||||
"gpui_macros",
|
"gpui_macros",
|
||||||
"http_client",
|
"http_client",
|
||||||
"image",
|
"image",
|
||||||
|
"inventory",
|
||||||
"itertools 0.14.0",
|
"itertools 0.14.0",
|
||||||
"linkme",
|
|
||||||
"log",
|
"log",
|
||||||
"lyon",
|
"lyon",
|
||||||
"media",
|
"media",
|
||||||
|
|
@ -2363,7 +2363,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gpui_macros"
|
name = "gpui_macros"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
@ -2553,7 +2553,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "http_client"
|
name = "http_client"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
|
@ -2717,6 +2717,15 @@ dependencies = [
|
||||||
"syn 2.0.96",
|
"syn 2.0.96",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "inventory"
|
||||||
|
version = "0.3.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "54b12ebb6799019b044deaf431eadfe23245b259bba5a2c0796acec3943a3cdb"
|
||||||
|
dependencies = [
|
||||||
|
"rustversion",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "io-lifetimes"
|
name = "io-lifetimes"
|
||||||
version = "1.0.11"
|
version = "1.0.11"
|
||||||
|
|
@ -2961,26 +2970,6 @@ version = "0.0.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "64804cc6a5042d4f05379909ba25b503ec04e2c082151d62122d5dcaa274b961"
|
checksum = "64804cc6a5042d4f05379909ba25b503ec04e2c082151d62122d5dcaa274b961"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "linkme"
|
|
||||||
version = "0.3.29"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "70fe496a7af8c406f877635cbf3cd6a9fac9d6f443f58691cd8afe6ce0971af4"
|
|
||||||
dependencies = [
|
|
||||||
"linkme-impl",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "linkme-impl"
|
|
||||||
version = "0.3.29"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b01f197a15988fb5b2ec0a5a9800c97e70771499c456ad757d63b3c5e9b96e75"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 2.0.96",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linux-raw-sys"
|
name = "linux-raw-sys"
|
||||||
version = "0.3.8"
|
version = "0.3.8"
|
||||||
|
|
@ -3131,7 +3120,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "media"
|
name = "media"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bindgen",
|
"bindgen",
|
||||||
|
|
@ -3491,7 +3480,7 @@ version = "0.7.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
|
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro-crate 1.3.1",
|
"proc-macro-crate 3.2.0",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.96",
|
"syn 2.0.96",
|
||||||
|
|
@ -4486,7 +4475,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "refineable"
|
name = "refineable"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"derive_refineable",
|
"derive_refineable",
|
||||||
]
|
]
|
||||||
|
|
@ -4814,7 +4803,7 @@ checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "semantic_version"
|
name = "semantic_version"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
@ -5253,7 +5242,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sum_tree"
|
name = "sum_tree"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
"log",
|
"log",
|
||||||
|
|
@ -5938,7 +5927,7 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "util"
|
name = "util"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/huacnlee/zed.git?branch=webview#7071d1a9c22776da144c051907c7d3210d12d29c"
|
source = "git+https://github.com/huacnlee/zed.git?branch=webview#d45d61a264afd26e20e7e06e6c4121ce8e9fd046"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-fs 2.1.2",
|
"async-fs 2.1.2",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use gpui::{
|
use gpui::{
|
||||||
fill, point, px, relative, size, App, Bounds, Corners, Element, ElementId, ElementInputHandler,
|
fill, point, px, relative, size, App, Bounds, Corners, Element, ElementId, ElementInputHandler,
|
||||||
Entity, GlobalElementId, IntoElement, LayoutId, MouseButton, MouseMoveEvent, PaintQuad, Path,
|
Entity, GlobalElementId, IntoElement, LayoutId, MouseButton, MouseMoveEvent, PaintQuad, Path,
|
||||||
Pixels, Point, Style, TextRun, UnderlineStyle, Window, WrappedLine,
|
Pixels, Point, Style, TextAlign, TextRun, UnderlineStyle, Window, WrappedLine,
|
||||||
};
|
};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
|
|
@ -514,7 +514,7 @@ impl Element for TextElement {
|
||||||
}
|
}
|
||||||
for line in prepaint.lines.iter() {
|
for line in prepaint.lines.iter() {
|
||||||
let p = point(origin.x, origin.y + offset_y);
|
let p = point(origin.x, origin.y + offset_y);
|
||||||
_ = line.paint(p, line_height, window, cx);
|
_ = line.paint(p, line_height, TextAlign::Left, window, cx);
|
||||||
offset_y += line.size(line_height).height;
|
offset_y += line.size(line_height).height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ use gpui::{
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - Press Up,Down to move cursor up, down line if multi-line
|
|
||||||
// - Move cursor to skip line eof empty chars.
|
// - Move cursor to skip line eof empty chars.
|
||||||
|
|
||||||
use super::blink_cursor::BlinkCursor;
|
use super::blink_cursor::BlinkCursor;
|
||||||
|
|
@ -1081,94 +1080,6 @@ impl TextInput {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fork of `closest_index_for_x` method from `gpui::text::Layout`
|
|
||||||
// https://github.com/zed-industries/zed/blob/d1be419fff415329b38f26aff90488700702c82a/crates/gpui/src/text_system/line_layout.rs#L74
|
|
||||||
fn closest_index_for_x(&self, line: &WrappedLine, x: Pixels) -> usize {
|
|
||||||
let mut prev_index = 0;
|
|
||||||
let mut prev_x = px(0.);
|
|
||||||
|
|
||||||
for run in line.unwrapped_layout.runs.iter() {
|
|
||||||
for glyph in run.glyphs.iter() {
|
|
||||||
if glyph.position.x >= x {
|
|
||||||
if glyph.position.x - x < x - prev_x {
|
|
||||||
return glyph.index;
|
|
||||||
} else {
|
|
||||||
return prev_index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prev_index = glyph.index;
|
|
||||||
prev_x = glyph.position.x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HOTFIX:
|
|
||||||
//
|
|
||||||
// Wait https://github.com/zed-industries/zed/pull/23603
|
|
||||||
if line.unwrapped_layout.len == 1 {
|
|
||||||
if x > line.width() / 2.0 {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.unwrapped_layout.len
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the closest index for position
|
|
||||||
///
|
|
||||||
/// Fork:
|
|
||||||
/// https://github.com/zed-industries/zed/blob/1c322c0f2daa50f46644832a6a1cdf15bcf921ea/crates/gpui/src/text_system/line_layout.rs#L272
|
|
||||||
///
|
|
||||||
/// Wait PR https://github.com/zed-industries/zed/pull/23668
|
|
||||||
pub fn closest_index_for_position(
|
|
||||||
&self,
|
|
||||||
line: &WrappedLine,
|
|
||||||
position: Point<Pixels>,
|
|
||||||
line_height: Pixels,
|
|
||||||
) -> Result<usize, usize> {
|
|
||||||
let wrapped_line_ix = (position.y / line_height) as usize;
|
|
||||||
|
|
||||||
let wrapped_line_start_index;
|
|
||||||
let wrapped_line_start_x;
|
|
||||||
if wrapped_line_ix > 0 {
|
|
||||||
let Some(line_start_boundary) = line.wrap_boundaries.get(wrapped_line_ix - 1) else {
|
|
||||||
return Err(0);
|
|
||||||
};
|
|
||||||
let run = &line.unwrapped_layout.runs[line_start_boundary.run_ix];
|
|
||||||
let glyph = &run.glyphs[line_start_boundary.glyph_ix];
|
|
||||||
wrapped_line_start_index = glyph.index;
|
|
||||||
wrapped_line_start_x = glyph.position.x;
|
|
||||||
} else {
|
|
||||||
wrapped_line_start_index = 0;
|
|
||||||
wrapped_line_start_x = Pixels::ZERO;
|
|
||||||
};
|
|
||||||
|
|
||||||
let wrapped_line_end_index;
|
|
||||||
let wrapped_line_end_x;
|
|
||||||
if wrapped_line_ix < line.wrap_boundaries.len() {
|
|
||||||
let next_wrap_boundary_ix = wrapped_line_ix;
|
|
||||||
let next_wrap_boundary = line.wrap_boundaries[next_wrap_boundary_ix];
|
|
||||||
let run = &line.unwrapped_layout.runs[next_wrap_boundary.run_ix];
|
|
||||||
let glyph = &run.glyphs[next_wrap_boundary.glyph_ix];
|
|
||||||
wrapped_line_end_index = glyph.index;
|
|
||||||
wrapped_line_end_x = glyph.position.x;
|
|
||||||
} else {
|
|
||||||
wrapped_line_end_index = line.unwrapped_layout.len;
|
|
||||||
wrapped_line_end_x = line.unwrapped_layout.width;
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut position_in_unwrapped_line = position;
|
|
||||||
position_in_unwrapped_line.x += wrapped_line_start_x;
|
|
||||||
if position_in_unwrapped_line.x < wrapped_line_start_x {
|
|
||||||
Err(wrapped_line_start_index)
|
|
||||||
} else if position_in_unwrapped_line.x >= wrapped_line_end_x {
|
|
||||||
Err(wrapped_line_end_index)
|
|
||||||
} else {
|
|
||||||
// HOTFIX
|
|
||||||
Ok(self.closest_index_for_x(&line, position_in_unwrapped_line.x))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn index_for_mouse_position(
|
fn index_for_mouse_position(
|
||||||
&self,
|
&self,
|
||||||
position: Point<Pixels>,
|
position: Point<Pixels>,
|
||||||
|
|
@ -1205,14 +1116,14 @@ impl TextInput {
|
||||||
for line in lines.iter() {
|
for line in lines.iter() {
|
||||||
let line_origin = self.line_origin_with_y_offset(&mut y_offset, &line, line_height);
|
let line_origin = self.line_origin_with_y_offset(&mut y_offset, &line, line_height);
|
||||||
let pos = inner_position - line_origin;
|
let pos = inner_position - line_origin;
|
||||||
let closest_index = self.closest_index_for_x(line, pos.x);
|
let closest_index = line.unwrapped_layout.closest_index_for_x(pos.x);
|
||||||
|
|
||||||
// Return offset by use closest_index_for_x if is single line mode.
|
// Return offset by use closest_index_for_x if is single line mode.
|
||||||
if self.is_single_line() {
|
if self.is_single_line() {
|
||||||
return closest_index;
|
return closest_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
let index_result = self.closest_index_for_position(line, pos, line_height);
|
let index_result = line.closest_index_for_position(pos, line_height);
|
||||||
if let Ok(v) = index_result {
|
if let Ok(v) = index_result {
|
||||||
index += v;
|
index += v;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue