#![allow(dead_code)]
-use std::ffi::c_void;
-use crate::ui::{event, ffi, UiDouble, UiInteger, UiString, UiText};
-use crate::ui::ffi::{UiEvent, UiRange};
+use std::ffi::{c_char, c_void, CStr, CString};
+use crate::ui::{event, ffi, UiDouble, UiInteger, UiString, UiText, UiRange};
+use crate::ui::ffi::{UiEvent};
pub struct Event<'a, T> {
pub data: &'a mut T,
FileList
}
+enum EventTypeData {
+ Null,
+ Pointer,
+ String(*const c_char),
+ IntegerValue(UiInteger),
+ StringValue(UiString),
+ TextValue(UiText),
+ DoubleValue(UiDouble),
+ RangeValue(UiRange),
+ ListSelection,
+ ListElement,
+ Dnd,
+ SubList,
+ FileList
+}
+
+fn get_event_data(e: *const ffi::UiEvent) -> EventTypeData {
+ let event_type = unsafe { ui_event_get_eventdatatype(e) };
+ let ptr = unsafe { ui_event_get_eventdata(e) };
+ match event_type {
+ 3 => {
+ let i: *mut ffi::UiInteger = ptr.cast();
+ EventTypeData::IntegerValue( UiInteger { ptr: i } )
+ }
+ 4 => {
+ let s: *mut ffi::UiString = ptr.cast();
+ EventTypeData::StringValue( UiString { ptr: s } )
+ }
+ 5 => {
+ let t: *mut ffi::UiText = ptr.cast();
+ EventTypeData::TextValue( UiText { ptr: t } )
+ }
+ 6 => {
+ let d: *mut ffi::UiDouble = ptr.cast();
+ EventTypeData::DoubleValue( UiDouble { ptr: d } )
+ }
+ 7 => {
+ let d: *mut ffi::UiRange = ptr.cast();
+ EventTypeData::RangeValue( UiRange { ptr: d } )
+ }
+ _ => EventTypeData::Null
+ }
+}
+
+fn get_event_type<'a>(data: &'a mut EventTypeData) -> EventType<'a> {
+ match data {
+ EventTypeData::Null => EventType::Null,
+ EventTypeData::Pointer => EventType::Pointer,
+ EventTypeData::String(s) => EventType::String(unsafe { CStr::from_ptr(*s).to_string_lossy().into_owned() }),
+ EventTypeData::IntegerValue(i) => EventType::IntegerValue( i ),
+ EventTypeData::StringValue(s) => EventType::StringValue (s),
+ EventTypeData::TextValue(t) => EventType::TextValue( t ),
+ EventTypeData::DoubleValue(d) => EventType::DoubleValue( d ),
+ EventTypeData::RangeValue(r) => EventType::RangeValue( r ),
+ EventTypeData::ListSelection => EventType::ListSelection,
+ EventTypeData::ListElement => EventType::ListElement,
+ EventTypeData::Dnd => EventType::Dnd,
+ EventTypeData::SubList => EventType::SubList,
+ EventTypeData::FileList => EventType::FileList,
+ }
+}
+
pub struct EventWrapper<T> {
pub callback: Box<dyn FnMut(&mut Event<T>)>
}
let ev_int = ui_event_get_int(e);
let ev_set = ui_event_get_set(e) != 0;
+ let mut event_data = get_event_data(e);
+ let event_type = get_event_type(&mut event_data);
+
let mut event = Event {
data: wdata,
- event_type: EventType::Null,
+ event_type: event_type,
intval: ev_int,
set: ev_set
};
let ev_int = ui_event_get_int(e);
let ev_set = ui_event_get_set(e) != 0;
+ let mut event_data = get_event_data(e);
+ let event_type = get_event_type(&mut event_data);
+
let event = ActionEvent {
- event_type: EventType::Null,
+ event_type: event_type,
intval: ev_int,
set: ev_set
};
extern "C" {
fn ui_event_get_windowdata(event: *const UiEvent) -> *const c_void;
fn ui_event_get_document(event: *const UiEvent) -> *const c_void;
- fn ui_event_get_eventdata(event: *const UiEvent) -> *const c_void;
+ fn ui_event_get_eventdata(event: *const UiEvent) -> *mut c_void;
fn ui_event_get_eventdatatype(event: *const UiEvent) -> i32;
fn ui_event_get_int(event: *const UiEvent) -> i32;
fn ui_event_get_set(event: *const UiEvent) -> i32;