From bc829397c8d8e785b126c6eb494600ebf6704087 Mon Sep 17 00:00:00 2001 From: shadow cat Date: Mon, 17 Nov 2025 22:49:22 -0500 Subject: [PATCH] stuff for ime positioning --- src/core/text/edit.rs | 19 ++++++++++++++----- src/layout/pos.rs | 13 +++++++++---- src/layout/ui.rs | 9 +++++++-- src/layout/vec2.rs | 4 ++++ 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/core/text/edit.rs b/src/core/text/edit.rs index f761d8f..6fda7af 100644 --- a/src/core/text/edit.rs +++ b/src/core/text/edit.rs @@ -126,26 +126,35 @@ impl<'a> TextEditCtx<'a> { } } + pub fn replace(&mut self, len: usize, text: &str) { + for _ in 0..len { + self.delete(); + } + self.insert_inner(text, false); + } + pub fn insert(&mut self, text: &str) { let mut lines = text.split('\n'); let Some(first) = lines.next() else { return; }; - self.insert_inner(first); + self.insert_inner(first, true); for line in lines { self.newline(); - self.insert_inner(line); + self.insert_inner(line, true); } } - fn insert_inner(&mut self, text: &str) { + fn insert_inner(&mut self, text: &str, mov: bool) { if let Some(cursor) = &mut self.text.cursor { let line = &mut self.text.view.buf.lines[cursor.line]; let mut line_text = line.text().to_string(); line_text.insert_str(cursor.index, text); line.set_text(line_text, line.ending(), line.attrs_list().clone()); - for _ in 0..text.len() { - self.motion(Motion::Right); + if mov { + for _ in 0..text.chars().count() { + self.motion(Motion::Right); + } } } } diff --git a/src/layout/pos.rs b/src/layout/pos.rs index ef5a87d..30287bd 100644 --- a/src/layout/pos.rs +++ b/src/layout/pos.rs @@ -272,8 +272,8 @@ impl UiRegion { self } - pub fn to_screen(&self, size: Vec2) -> ScreenRegion { - ScreenRegion { + pub fn to_screen(&self, size: Vec2) -> PixelRegion { + PixelRegion { top_left: self.top_left.rel * size + self.top_left.abs, bot_right: self.bot_right.rel * size + self.bot_right.abs, } @@ -329,17 +329,22 @@ impl Display for UiRegion { } #[derive(Debug)] -pub struct ScreenRegion { +pub struct PixelRegion { pub top_left: Vec2, pub bot_right: Vec2, } -impl ScreenRegion { + +impl PixelRegion { pub fn contains(&self, pos: Vec2) -> bool { pos.x >= self.top_left.x && pos.x <= self.bot_right.x && pos.y >= self.top_left.y && pos.y <= self.bot_right.y } + + pub fn size(&self) -> Vec2 { + self.bot_right - self.top_left + } } pub struct UIRegionAxisView<'a> { diff --git a/src/layout/ui.rs b/src/layout/ui.rs index 23fb473..dc9cdbe 100644 --- a/src/layout/ui.rs +++ b/src/layout/ui.rs @@ -3,8 +3,8 @@ use image::DynamicImage; use crate::{ core::{TextEdit, TextEditCtx}, layout::{ - IdLike, PainterCtx, PainterData, StaticWidgetId, TextureHandle, Vec2, Widget, WidgetId, - WidgetLike, + IdLike, PainterCtx, PainterData, PixelRegion, StaticWidgetId, TextureHandle, Vec2, Widget, + WidgetId, WidgetLike, }, util::Id, }; @@ -179,6 +179,11 @@ impl Ui { } } + pub fn window_region(&self, id: &impl IdLike) -> Option { + let region = self.data.active.get(&id.id())?.region; + Some(region.to_screen(self.data.output_size)) + } + pub fn debug(&self, label: &str) { for (id, inst) in &self.data.active { let l = &self.data.widgets.data(id).unwrap().label; diff --git a/src/layout/vec2.rs b/src/layout/vec2.rs index 190df0b..9f36f32 100644 --- a/src/layout/vec2.rs +++ b/src/layout/vec2.rs @@ -43,6 +43,10 @@ impl Vec2 { y: self.y.ceil(), } } + + pub const fn tuple(&self) -> (f32, f32) { + (self.x, self.y) + } } impl const From for Vec2 {