use std::ptr;
use wxdragon_sys as ffi;
use crate::datetime::DateTime;
use crate::event::{Event, EventType, WxEvtHandler};
use crate::prelude::*;
use crate::window::{WindowHandle, WxWidget};
#[allow(unused_imports)]
use crate::window::Window;
use std::default::Default;
widget_style_enum!(
name: TimePickerCtrlStyle,
doc: "Style flags for TimePickerCtrl widgets.",
variants: {
Default: 0, "Default style."
},
default_variant: Default
);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimePickerEvent {
TimeChanged,
}
#[derive(Debug)]
pub struct TimePickerEventData {
event: Event,
}
impl TimePickerEventData {
pub fn new(event: Event) -> Self {
Self { event }
}
pub fn get_id(&self) -> i32 {
self.event.get_id()
}
pub fn skip(&self, skip: bool) {
self.event.skip(skip);
}
}
#[derive(Clone, Copy)]
pub struct TimePickerCtrl {
handle: WindowHandle,
}
impl TimePickerCtrl {
pub fn builder(parent: &dyn WxWidget) -> TimePickerCtrlBuilder<'_> {
TimePickerCtrlBuilder::new(parent)
}
#[inline]
fn time_picker_ptr(&self) -> *mut ffi::wxd_TimePickerCtrl_t {
self.handle
.get_ptr()
.map(|p| p as *mut ffi::wxd_TimePickerCtrl_t)
.unwrap_or(std::ptr::null_mut())
}
pub fn get_value(&self) -> DateTime {
let ptr = self.time_picker_ptr();
if ptr.is_null() {
return DateTime::default();
}
let ffi_dt = unsafe { ffi::wxd_TimePickerCtrl_GetValue(ptr) };
DateTime::from(ffi_dt)
}
pub fn set_value(&self, dt: &DateTime) {
let ptr = self.time_picker_ptr();
if ptr.is_null() {
return;
}
unsafe { ffi::wxd_TimePickerCtrl_SetValue(ptr, dt.as_const_ptr()) };
}
pub fn window_handle(&self) -> WindowHandle {
self.handle
}
}
widget_builder!(
name: TimePickerCtrl,
parent_type: &'a dyn WxWidget,
style_type: TimePickerCtrlStyle,
fields: {
value: Option<DateTime> = None
},
build_impl: |slf| {
assert!(!slf.parent.handle_ptr().is_null(), "TimePickerCtrl requires a parent");
let ffi_dt_ptr = slf.value.as_ref().map_or(ptr::null(), |dt_val| dt_val.as_const_ptr());
let ptr = unsafe {
ffi::wxd_TimePickerCtrl_Create(
slf.parent.handle_ptr(),
slf.id,
ffi_dt_ptr,
slf.pos.into(),
slf.size.into(),
slf.style.bits(),
)
};
if ptr.is_null() {
panic!("Failed to create TimePickerCtrl: FFI returned null pointer.");
}
TimePickerCtrl {
handle: WindowHandle::new(ptr as *mut ffi::wxd_Window_t),
}
}
);
impl WxWidget for TimePickerCtrl {
fn handle_ptr(&self) -> *mut ffi::wxd_Window_t {
self.handle.get_ptr().unwrap_or(std::ptr::null_mut())
}
fn is_valid(&self) -> bool {
self.handle.is_valid()
}
}
impl WxEvtHandler for TimePickerCtrl {
unsafe fn get_event_handler_ptr(&self) -> *mut ffi::wxd_EvtHandler_t {
self.handle.get_ptr().unwrap_or(std::ptr::null_mut()) as *mut ffi::wxd_EvtHandler_t
}
}
impl crate::event::WindowEvents for TimePickerCtrl {}
crate::implement_widget_local_event_handlers!(
TimePickerCtrl,
TimePickerEvent,
TimePickerEventData,
TimeChanged => time_changed, EventType::TIME_CHANGED
);
#[cfg(feature = "xrc")]
impl crate::xrc::XrcSupport for TimePickerCtrl {
unsafe fn from_xrc_ptr(ptr: *mut ffi::wxd_Window_t) -> Self {
TimePickerCtrl {
handle: WindowHandle::new(ptr),
}
}
}
impl crate::window::FromWindowWithClassName for TimePickerCtrl {
fn class_name() -> &'static str {
"wxTimePickerCtrl"
}
unsafe fn from_ptr(ptr: *mut ffi::wxd_Window_t) -> Self {
TimePickerCtrl {
handle: WindowHandle::new(ptr),
}
}
}