use std::ffi::{c_char, c_int, c_void};
use std::ffi::CString;
-use std::marker::PhantomData;
-use crate::ui::{toolkit};
+use crate::ui::{event, toolkit, EventWrapper};
use crate::ui::ffi::*;
use crate::ui::widget::widget_fn;
/* -------------------------------- TextArea -------------------------------- */
-pub struct TextAreaBuilder<T> {
+pub struct TextAreaBuilder<'a, T> {
args: *mut UiTextAreaArgs,
- obj: *const UiObject,
- _marker: PhantomData<T>
+ obj: &'a mut toolkit::UiObject<T>
}
impl<T> toolkit::UiObject<T> {
widget_fn!(textarea, textarea_builder, TextAreaBuilder);
- pub fn textarea_builder(&self) -> TextAreaBuilder<T> {
+ pub fn textarea_builder<'a>(&'a mut self) -> TextAreaBuilder<'a, T> {
unsafe {
let args = ui_textarea_args_new();
- TextAreaBuilder { args: args, obj: self.ptr, _marker: PhantomData }
+ TextAreaBuilder { args: args, obj: self }
}
}
}
-impl<T> Drop for TextAreaBuilder<T> {
+impl<'a, T> Drop for TextAreaBuilder<'a, T> {
fn drop(&mut self) {
unsafe {
ui_textarea_args_free(self.args);
}
}
-impl<T> TextAreaBuilder<T> {
+impl<'a, T> TextAreaBuilder<'a, T> {
pub fn create(&mut self) {
unsafe {
- ui_textarea_create(self.obj, self.args);
+ ui_textarea_create(self.obj.ptr, self.args);
}
}
}
}
- // TODO: callback, states
+ pub fn onchange<F>(&mut self, f: F) -> &mut Self
+ where F: FnMut(&mut event::Event<T>) + 'static {
+ let wrapper = Box::new(EventWrapper { callback: Box::new(f) });
+ let ptr = self.obj.reg_box(wrapper);
+ unsafe {
+ ui_textarea_args_set_onchange(self.args, Some(event::event_wrapper::<T>));
+ ui_textarea_args_set_onchangedata(self.args, ptr as *mut c_void);
+ }
+ self
+ }
+
+ // TODO: states
}
pub type TextFieldCreate = fn(*const UiObject, *const UiTextFieldArgs);
-pub struct TextFieldBuilder<T> {
+pub struct TextFieldBuilder<'a, T> {
args: *mut UiTextFieldArgs,
- obj: *const UiObject,
- create: TextFieldCreate,
- _marker: PhantomData<T>
+ obj: &'a mut toolkit::UiObject<T>,
+ create: TextFieldCreate
}
pub fn textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs) {
widget_fn!(passwordfield, passwordfield_builder, TextFieldBuilder);
widget_fn!(frameless_textfield, frameless_textfield_builder, TextFieldBuilder);
- pub fn textfield_builder(&self) -> TextFieldBuilder<T> {
+ pub fn textfield_builder<'a>(&'a mut self) -> TextFieldBuilder<T> {
unsafe {
let args = ui_textfield_args_new();
- TextFieldBuilder { args: args, obj: self.ptr, create: textfield_create, _marker: PhantomData }
+ TextFieldBuilder { args: args, obj: self, create: textfield_create }
}
}
- pub fn passwordfield_builder(&self) -> TextFieldBuilder<T> {
+ pub fn passwordfield_builder<'a>(&'a mut self) -> TextFieldBuilder<T> {
unsafe {
let args = ui_textfield_args_new();
- TextFieldBuilder { args: args, obj: self.ptr, create: passwordfield_create, _marker: PhantomData }
+ TextFieldBuilder { args: args, obj: self, create: passwordfield_create }
}
}
- pub fn frameless_textfield_builder(&self) -> TextFieldBuilder<T> {
+ pub fn frameless_textfield_builder<'a>(&'a mut self) -> TextFieldBuilder<T> {
unsafe {
let args = ui_textfield_args_new();
- TextFieldBuilder { args: args, obj: self.ptr, create: frameless_textfield_create, _marker: PhantomData }
+ TextFieldBuilder { args: args, obj: self, create: frameless_textfield_create }
}
}
}
-impl<T> Drop for TextFieldBuilder<T> {
+impl<'a, T> Drop for TextFieldBuilder<'a, T> {
fn drop(&mut self) {
unsafe {
ui_textfield_args_free(self.args);
}
}
-impl<T> TextFieldBuilder<T> {
+impl<'a, T> TextFieldBuilder<'a, T> {
pub fn create(&mut self) {
unsafe {
- ui_textfield_create(self.obj, self.args);
+ ui_textfield_create(self.obj.ptr, self.args);
}
}
}
}
- // TODO: callback, states
+ pub fn onchange<F>(&mut self, f: F) -> &mut Self
+ where F: FnMut(&mut event::Event<T>) + 'static {
+ let wrapper = Box::new(EventWrapper { callback: Box::new(f) });
+ let ptr = self.obj.reg_box(wrapper);
+ unsafe {
+ ui_textfield_args_set_onchange(self.args, Some(event::event_wrapper::<T>));
+ ui_textfield_args_set_onchangedata(self.args, ptr as *mut c_void);
+ }
+ self
+ }
+
+ // TODO: states
}