use crate::event::{Event, EventType, WxEvtHandler};
use std::marker::PhantomData;
use wxdragon_sys as ffi;
pub struct Timer<T: WxEvtHandler> {
ptr: *mut ffi::wxd_Timer_t,
owner_ptr: *mut ffi::wxd_EvtHandler_t,
_owner: PhantomData<T>,
}
impl<T: WxEvtHandler> Timer<T> {
pub fn new(owner: &T) -> Self {
let owner_ptr = unsafe { owner.get_event_handler_ptr() };
let ptr = unsafe { ffi::wxd_Timer_Create(owner_ptr) };
Self {
ptr,
owner_ptr,
_owner: PhantomData,
}
}
pub fn on_tick<F>(&self, callback: F)
where
F: FnMut(Event) + 'static,
{
if !self.owner_ptr.is_null() {
let handler = TimerOwnerWrapper(self.owner_ptr);
handler.bind_internal(EventType::TIMER, callback);
}
}
pub fn start(&self, milliseconds: i32, one_shot: bool) -> bool {
if self.ptr.is_null() {
return false;
}
unsafe { ffi::wxd_Timer_Start(self.ptr, milliseconds, one_shot) }
}
pub fn stop(&self) {
if self.ptr.is_null() {
return;
}
unsafe { ffi::wxd_Timer_Stop(self.ptr) };
}
pub fn is_running(&self) -> bool {
if self.ptr.is_null() {
return false;
}
unsafe { ffi::wxd_Timer_IsRunning(self.ptr) }
}
pub fn get_interval(&self) -> i32 {
if self.ptr.is_null() {
return 0;
}
unsafe { ffi::wxd_Timer_GetInterval(self.ptr) }
}
pub fn set_interval(&self, milliseconds: i32) {
if self.ptr.is_null() {
return;
}
unsafe { ffi::wxd_Timer_SetInterval(self.ptr, milliseconds) };
}
}
impl<T: WxEvtHandler> Drop for Timer<T> {
fn drop(&mut self) {
if !self.ptr.is_null() {
unsafe { ffi::wxd_Timer_Destroy(self.ptr) };
}
}
}
struct TimerOwnerWrapper(*mut ffi::wxd_EvtHandler_t);
impl WxEvtHandler for TimerOwnerWrapper {
unsafe fn get_event_handler_ptr(&self) -> *mut ffi::wxd_EvtHandler_t {
self.0
}
}