pub fn onclick<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 wrapper = Box::new(EventWrapper::new(f) );
let ptr = self.obj.ctx.reg_box(wrapper);
unsafe {
ui_button_args_set_onclick(self.args, Some(event::event_wrapper::<T>));
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 wrapper = Box::new(EventWrapper::new(f) );
let ptr = self.obj.ctx.reg_box(wrapper);
unsafe {
ui_toggle_args_set_onchange(self.args, Some(event::event_wrapper::<T>));
pub fn onclick<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 wrapper = Box::new(EventWrapper::new(f) );
let ptr = self.obj.ctx.reg_box(wrapper);
unsafe {
ui_linkbutton_args_set_onclick(self.args, Some(event::event_wrapper::<T>));
}
}
+pub enum EventWrapperCallback<T> {
+ Once(Option<Box<dyn FnOnce(&mut Event<T>)>>),
+ Mut(Box<dyn FnMut(&mut Event<T>)>)
+}
+
pub struct EventWrapper<T> {
- pub callback: Box<dyn FnMut(&mut Event<T>)>
+ pub callback: EventWrapperCallback<T>
}
impl<T> EventWrapper<T> {
pub fn new<F>(f: F) -> EventWrapper<T>
where F: FnMut(&mut event::Event<T>) + 'static {
- EventWrapper { callback: Box::new(f) }
+ EventWrapper { callback: EventWrapperCallback::Mut(Box::new(f)) }
+ }
+
+ pub fn new_once<F>(f: F) -> EventWrapper<T>
+ where F: FnOnce(&mut event::Event<T>) + 'static {
+ EventWrapper { callback: EventWrapperCallback::Once(Some(Box::new(f))) }
}
}
intval: ev_int,
set: ev_set
};
-
- (wrapper.callback)(&mut event);
+
+
+ match wrapper.callback {
+ EventWrapperCallback::Once(ref mut cb) => {
+ if let Some(cb) = cb.take() {
+ cb(&mut event);
+ }
+ },
+ EventWrapperCallback::Mut(ref mut cb) => {
+ cb(&mut event);
+ }
+ }
}
}
pub fn onclose<F>(&self, f: F)
where F: FnMut(&mut event::Event<T>) + 'static {
- let wrapper = Box::new(EventWrapper { callback: Box::new(f) });
+ let wrapper = Box::new(EventWrapper::new(f));
let ptr = self.ctx.reg_box(wrapper);
unsafe {
ui_object_set_onclose(self.ptr, Some(event::event_wrapper::<T>), ptr.cast());
}
pub fn result<F>(&mut self, f: F) -> &mut Self
- where F: FnMut(&mut event::Event<T>) + 'static {
- let wrapper = Box::new(EventWrapper { callback: Box::new(f) });
+ where F: FnOnce(&mut event::Event<T>) + 'static {
+ let wrapper = Box::new(EventWrapper::new_once(f) );
let ptr = Box::into_raw(wrapper);
unsafe {
ui_dialog_args_set_result(self.args, Some(event::event_wrapper::<T>));
pub fn onclick<F>(&mut self, f: F) -> &mut Self
where F: FnMut(&mut event::Event<T>) + 'static {
- self.onclick = Some(Box::new(EventWrapper { callback: Box::new(f) }));
+ self.onclick = Some(Box::new(EventWrapper::new(f) ));
self
}
}
}
fn openfile_dialog<T, F>(obj: &toolkit::UiObject<T>, mode: c_uint, f: F)
-where F: FnMut(&mut event::Event<T>) + 'static {
- let b: Box<EventWrapper<T>> = Box::new(EventWrapper { callback: Box::new(f) });
+where F: FnOnce(&mut event::Event<T>) + 'static {
+ let b: Box<EventWrapper<T>> = Box::new(EventWrapper::new_once(f));
let ptr = Box::into_raw(b);
unsafe {
ui_openfiledialog(obj.ptr, mode, Some(event_wrapper_oneshot::<T>), ptr as *mut c_void);
}
fn savefile_dialog<T, F>(obj: &toolkit::UiObject<T>, name: &str, f: F)
-where F: FnMut(&mut event::Event<T>) + 'static {
+where F: FnOnce(&mut event::Event<T>) + 'static {
let cstr = CString::new(name).unwrap();
- let b: Box<EventWrapper<T>> = Box::new(EventWrapper { callback: Box::new(f) });
+ let b: Box<EventWrapper<T>> = Box::new(EventWrapper::new_once(f));
let ptr = Box::into_raw(b);
unsafe {
ui_savefiledialog(obj.ptr, cstr.as_ptr(), Some(event_wrapper_oneshot::<T>), ptr as *mut c_void);