From: Olaf Wintermann Date: Mon, 8 Jun 2026 20:07:38 +0000 (+0200) Subject: add add_action_untyped, prepare textarea focus on note selection X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Fmain;p=note.git add add_action_untyped, prepare textarea focus on note selection --- diff --git a/application/src/notebook.rs b/application/src/notebook.rs index b198fd2..b49fadd 100644 --- a/application/src/notebook.rs +++ b/application/src/notebook.rs @@ -121,6 +121,10 @@ impl Notebook { if let Some(mut nb) = self.doc_ref.get_doc() { nb.ctx.attach(&doc); + //nb.ctx.call_action("textarea_focus"); + nb.doc_proxy().call_mainthread(move |doc, note|{ + doc.ctx.call_action("textarea_focus"); + }); self.selected_note = Some(doc); if add_to_nav { diff --git a/application/src/window.rs b/application/src/window.rs index 0d2aa50..5e39213 100644 --- a/application/src/window.rs +++ b/application/src/window.rs @@ -242,12 +242,15 @@ pub fn create_window(app: &App, ctx: &AppContext) -> UiObject(e: *const ffi::UiEvent, data: *mut c_v let wrapper = &mut *(data as *mut ActionEventWrapper); let target = &mut *(wrapper.target as *mut T); + action_callback(e, |event| { + (wrapper.callback)(target, event); + }); + } +} + +fn action_callback(e: *const ffi::UiEvent, f: F) +where F: FnOnce(&ActionEvent) { + unsafe { let ev_int = ui_event_get_int(e); let ev_set = ui_event_get_set(e) != 0; @@ -302,8 +311,22 @@ pub extern "C" fn action_event_wrapper(e: *const ffi::UiEvent, data: *mut c_v intval: ev_int, set: ev_set }; + + f(&event); + } +} + +pub struct UntypedEventWrapper { + pub callback: Box +} + +pub extern "C" fn untyped_event_wrapper(e: *const ffi::UiEvent, data: *mut c_void) { + unsafe { + let wrapper = &mut *(data as *mut UntypedEventWrapper); - (wrapper.callback)(target, &event); + action_callback(e, |event| { + (wrapper.callback)(event); + }); } } diff --git a/ui-rs/src/ui/text.rs b/ui-rs/src/ui/text.rs index 70057c4..378f113 100644 --- a/ui-rs/src/ui/text.rs +++ b/ui-rs/src/ui/text.rs @@ -48,7 +48,7 @@ impl Widget for TextArea { } impl TextArea { - pub fn focus(&mut self) { + pub fn focus(&self) { unsafe { ui_textarea_focus(self.ptr); } diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index eec09d3..96aca74 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -30,7 +30,7 @@ use std::any::Any; use std::ffi::{c_char, c_int, c_void, CStr, CString}; -use crate::ui::{action_event_wrapper, event, ffi, ui_object_get_context, ui_object_get_windowdata, ui_reg_destructor, ui_remove_destructor, ActionEventWrapper, Event, EventWrapper, SubList, RUST_TYPED_OBJECT_BOX_ANY}; +use crate::ui::{action_event_wrapper, event, ffi, ui_object_get_context, ui_object_get_windowdata, ui_reg_destructor, ui_remove_destructor, untyped_event_wrapper, ActionEventWrapper, Event, EventWrapper, SubList, UntypedEventWrapper, RUST_TYPED_OBJECT_BOX_ANY}; use std::marker::PhantomData; use std::mem; @@ -118,6 +118,16 @@ impl UiContext { ui_add_action(self.ptr, cstr.as_ptr(), Some(action_event_wrapper::), ptr as *mut c_void); } + pub fn add_action_untyped(&self, name: &str, f: F) + where F: FnMut(&event::ActionEvent) + 'static { + unsafe { + let wrapper = Box::new(UntypedEventWrapper { callback: Box::new(f) }); + let ptr = self.reg_box(wrapper); + let cstr = CString::new(name).unwrap(); + ui_add_action(self.ptr, cstr.as_ptr(), Some(untyped_event_wrapper), ptr as *mut c_void); + } + } + pub fn call_action(&self, action: &str) { let cstr = CString::new(action).unwrap(); unsafe {