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");
});
+ obj.ctx.add_action_untyped("textarea_focus", move|event|{
+ textarea.focus();
+ });
});
});
});
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;
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);
+ });
}
}
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;
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 {