]> uap-core.de Git - note.git/commitdiff
add add_action_untyped, prepare textarea focus on note selection main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 8 Jun 2026 20:07:38 +0000 (22:07 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Mon, 8 Jun 2026 20:07:38 +0000 (22:07 +0200)
application/src/notebook.rs
application/src/window.rs
ui-rs/src/ui/event.rs
ui-rs/src/ui/text.rs
ui-rs/src/ui/toolkit.rs

index b198fd29716f0e714a3e45c0439cd334851d5e31..b49fadd7cf94ea927fc0151920c838635cf15456 100644 (file)
@@ -121,6 +121,10 @@ impl Notebook {
 
         if let Some(mut nb) = self.doc_ref.get_doc() {
             nb.ctx.attach(&doc);
 
         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 {
             self.selected_note = Some(doc);
 
             if add_to_nav {
index 0d2aa50f743f8e1c0081010da4f13c6425e89ebd..5e392133f52e579ab688e7a82db31af8d86d6725 100644 (file)
@@ -242,12 +242,15 @@ pub fn create_window(app: &App, ctx: &AppContext<MainWindow>) -> UiObject<MainWi
                     tabview.tab("empty", |_obj| {});
 
                     tabview.tab("textnote", |obj| {
                     tabview.tab("empty", |_obj| {});
 
                     tabview.tab("textnote", |obj| {
-                        obj.textarea(|b|{
+                        let textarea = obj.textarea(|b|{
                            b.fill(true);
                             b.varname("note_text");
                             b.onchange_action("note_text_change");
                             b.ontextchanged_action("note_text_changed");
                         });
                            b.fill(true);
                             b.varname("note_text");
                             b.onchange_action("note_text_change");
                             b.ontextchanged_action("note_text_changed");
                         });
+                        obj.ctx.add_action_untyped("textarea_focus", move|event|{
+                            textarea.focus();
+                        });
                     });
                 });
         });
                     });
                 });
         });
index 87d84bc858d838ebf22708b245694c6d1298326c..2e7e2aabde026ea554ec3ec11c05438ff57bd1be 100644 (file)
@@ -283,6 +283,15 @@ pub extern "C" fn action_event_wrapper<T>(e: *const ffi::UiEvent, data: *mut c_v
         let wrapper = &mut *(data as *mut ActionEventWrapper<T>);
         let target = &mut *(wrapper.target as *mut T);
 
         let wrapper = &mut *(data as *mut ActionEventWrapper<T>);
         let target = &mut *(wrapper.target as *mut T);
 
+        action_callback(e, |event| {
+            (wrapper.callback)(target, event);
+        });
+    }
+}
+
+fn action_callback<F>(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;
 
         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<T>(e: *const ffi::UiEvent, data: *mut c_v
             intval: ev_int,
             set: ev_set
         };
             intval: ev_int,
             set: ev_set
         };
+        
+        f(&event);
+    }
+}
+
+pub struct UntypedEventWrapper {
+    pub callback: Box<dyn FnMut(&ActionEvent)>
+}
+
+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);
+        });
     }
 }
 
     }
 }
 
index 70057c41bdd872220200e4161ab9d55340fc31fa..378f113e413bd5d2614b9bdba8240d537945c7c1 100644 (file)
@@ -48,7 +48,7 @@ impl Widget for TextArea {
 }
 
 impl TextArea {
 }
 
 impl TextArea {
-    pub fn focus(&mut self) {
+    pub fn focus(&self) {
         unsafe {
             ui_textarea_focus(self.ptr);
         }
         unsafe {
             ui_textarea_focus(self.ptr);
         }
index eec09d33a3f10557041669564a795d858fa5b8d2..96aca742184e6e2aee02e2db18519cdc727fad43 100644 (file)
@@ -30,7 +30,7 @@
 
 use std::any::Any;
 use std::ffi::{c_char, c_int, c_void, CStr, CString};
 
 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;
 
 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::<T>), ptr as *mut c_void);
     }
 
         ui_add_action(self.ptr, cstr.as_ptr(), Some(action_event_wrapper::<T>), ptr as *mut c_void);
     }
 
+    pub fn add_action_untyped<F>(&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 {
     pub fn call_action(&self, action: &str) {
         let cstr = CString::new(action).unwrap();
         unsafe {