From 90f9c13dd7145173f906f5f50f8c7893bb99e261 Mon Sep 17 00:00:00 2001 From: shadow cat Date: Sat, 22 Nov 2025 00:15:02 -0500 Subject: [PATCH] TEXT SELECTION --- iris | 2 +- src/bin/client/main.rs | 5 ++++ src/bin/client/ui/login.rs | 2 +- src/bin/client/ui/main.rs | 4 +-- src/bin/client/ui/misc.rs | 51 +++++++++++++++++++++++++++++++------- 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/iris b/iris index 246caff..1cec56e 160000 --- a/iris +++ b/iris @@ -1 +1 @@ -Subproject commit 246caffb348bb13816ed446e6defac6131d005ca +Subproject commit 1cec56e8472a1f0660a9c5f5932e7478bb804785 diff --git a/src/bin/client/main.rs b/src/bin/client/main.rs index c5b67d9..f571703 100644 --- a/src/bin/client/main.rs +++ b/src/bin/client/main.rs @@ -160,6 +160,11 @@ impl Client { } self.run_event(sel, Edited, ()); } + TextInputResult::Copy(text) => { + if let Err(err) = self.clipboard.set_text(text) { + eprintln!("failed to copy text to clipboard: {err}") + } + } TextInputResult::Used => { self.run_event(sel, Edited, ()); } diff --git a/src/bin/client/ui/login.rs b/src/bin/client/ui/login.rs index 0909b98..cdb69dd 100644 --- a/src/bin/client/ui/login.rs +++ b/src/bin/client/ui/login.rs @@ -21,7 +21,7 @@ pub fn login_screen(client: &mut Client) -> WidgetId { .clone() .pad(10) .background(rect(Color::BLACK.brighter(0.1)).radius(15)) - .on(CursorSense::click(), focus_other(field)) + .attr::(field) }; // I LAV NOT HAVING ERGONOMIC CLONES diff --git a/src/bin/client/ui/main.rs b/src/bin/client/ui/main.rs index 9445515..887bc46 100644 --- a/src/bin/client/ui/main.rs +++ b/src/bin/client/ui/main.rs @@ -23,7 +23,7 @@ pub fn msg_widget(msg: Msg) -> impl WidgetLike { .editable() .size(SIZE) .wrap(true) - .id_on(CursorSense::click(), |i, c, d| focus(i.clone(), c, d)); + .attr::(()); let header = text(msg.user).size(SIZE); ( image(include_bytes!("../assets/sungals.png")) @@ -70,7 +70,7 @@ pub fn msg_panel(client: &mut Client, network: NetSender) -> impl WidgetFn(send_text) .scroll() .masked() .background(rect(Color::BLACK.brighter(0.05)).radius(15)) diff --git a/src/bin/client/ui/misc.rs b/src/bin/client/ui/misc.rs index ea72654..720ea6b 100644 --- a/src/bin/client/ui/misc.rs +++ b/src/bin/client/ui/misc.rs @@ -9,8 +9,48 @@ pub fn error(ui: &mut Ui, msg: &str) -> WidgetId { .any() } -pub fn focus(id: WidgetId, client: &mut Client, data: CursorData) { - client.ui.text(&id).select(data.cursor, data.size); +pub struct Selector; + +impl WidgetAttr for Selector { + type Input = WidgetId; + + fn run(ui: &mut Ui, container: &WidgetId, id: Self::Input) { + let container = container.clone(); + ui.register_event( + &container.clone(), + CursorSense::click_or_drag(), + move |client: &mut Client, mut data| { + let id_pos = client.ui.window_region(&id).unwrap().top_left; + let container_pos = client.ui.window_region(&container).unwrap().top_left; + data.cursor += container_pos - id_pos; + select(id.clone(), client, data); + }, + ); + } +} + +pub struct Selectable; + +impl WidgetAttr for Selectable { + type Input = (); + + fn run(ui: &mut Ui, id: &WidgetId, _: Self::Input) { + let id = id.clone(); + ui.register_event( + &id.clone(), + CursorSense::click_or_drag(), + move |client: &mut Client, data| { + select(id.clone(), client, data); + }, + ); + } +} + +fn select(id: WidgetId, client: &mut Client, data: CursorData) { + client + .ui + .text(&id) + .select(data.cursor, data.size, data.sense.is_dragging()); if let Some(region) = client.ui.window_region(&id) { client.handle.window.set_ime_allowed(true); client.handle.window.set_ime_cursor_area( @@ -21,13 +61,6 @@ pub fn focus(id: WidgetId, client: &mut Client, data: CursorData) { client.focus = Some(id); } -pub fn focus_other(id: WidgetId) -> impl Fn(&mut Client, CursorData) { - move |client: &mut Client, data: CursorData| { - focus(id.clone(), client, data); - } -} - pub fn hint(msg: impl Into) -> TextBuilder { text(msg).size(20).color(Color::GRAY) } -