use crate::event::{Event, EventType};
use crate::widgets::treectrl::TreeItemId;
use std::ffi::CStr;
use wxdragon_sys as ffi;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TreeEvent {
SelectionChanged,
SelectionChanging,
ItemActivated,
BeginLabelEdit,
EndLabelEdit,
ItemExpanding,
ItemExpanded,
ItemCollapsing,
ItemCollapsed,
ItemRightClick,
BeginDrag,
EndDrag,
}
#[derive(Debug)]
pub struct TreeEventData {
pub event: Event,
}
impl TreeEventData {
pub fn new(event: Event) -> Self {
Self { event }
}
pub fn get_id(&self) -> i32 {
self.event.get_id()
}
pub fn get_item(&self) -> Option<TreeItemId> {
if self.event.is_null() {
return None;
}
let item_ptr = unsafe { ffi::wxd_TreeEvent_GetItem(self.event.0) };
unsafe { TreeItemId::from_ptr(item_ptr) }
}
pub fn get_label(&self) -> Option<String> {
if self.event.is_null() {
return None;
}
let len = unsafe { ffi::wxd_TreeEvent_GetLabel(self.event.0, std::ptr::null_mut(), 0) };
if len < 0 {
return None;
}
let mut buf = vec![0; len as usize + 1];
if unsafe { ffi::wxd_TreeEvent_GetLabel(self.event.0, buf.as_mut_ptr(), buf.len()) } == len {
Some(unsafe { CStr::from_ptr(buf.as_ptr()).to_string_lossy().to_string() })
} else {
None
}
}
pub fn is_edit_cancelled(&self) -> Option<bool> {
if self.event.is_null() {
return None;
}
Some(unsafe { ffi::wxd_TreeEvent_IsEditCancelled(self.event.0) != 0 })
}
}
crate::implement_category_event_handlers!(TreeEvents, TreeEvent, TreeEventData,
SelectionChanged => selection_changed, EventType::TREE_SEL_CHANGED,
SelectionChanging => selection_changing, EventType::TREE_SEL_CHANGING,
ItemActivated => item_activated, EventType::TREE_ITEM_ACTIVATED,
BeginLabelEdit => begin_label_edit, EventType::TREE_BEGIN_LABEL_EDIT,
EndLabelEdit => end_label_edit, EventType::TREE_END_LABEL_EDIT,
ItemExpanding => item_expanding, EventType::TREE_ITEM_EXPANDING,
ItemExpanded => item_expanded, EventType::TREE_ITEM_EXPANDED,
ItemCollapsing => item_collapsing, EventType::TREE_ITEM_COLLAPSING,
ItemCollapsed => item_collapsed, EventType::TREE_ITEM_COLLAPSED,
ItemRightClick => item_right_click, EventType::TREE_ITEM_RIGHT_CLICK,
BeginDrag => begin_drag, EventType::TREE_BEGIN_DRAG,
EndDrag => end_drag, EventType::TREE_END_DRAG
);