pub type WidgetId = String;
#[derive(Debug, Clone, PartialEq)]
pub enum WidgetEvent {
ButtonClick { id: WidgetId },
TextChanged { id: WidgetId, value: String },
TextSubmit { id: WidgetId, value: String },
CheckboxChanged { id: WidgetId, checked: bool },
SliderChanged { id: WidgetId, value: f32 },
FocusGained { id: WidgetId },
FocusLost { id: WidgetId },
MouseEnter { id: WidgetId },
MouseLeave { id: WidgetId },
SelectionChanged { id: WidgetId, index: usize, value: String },
RadioChanged { id: WidgetId, index: usize, value: String },
TabChanged { id: WidgetId, index: usize, label: String },
LinkClicked { id: WidgetId },
SelectableLabelChanged { id: WidgetId, selected: bool },
DragValueChanged { id: WidgetId, value: f64 },
ColorChanged { id: WidgetId, color: [u8; 4] },
HyperlinkClicked { id: WidgetId, url: String },
FileDialogCompleted { id: WidgetId, paths: Vec<String>, cancelled: bool },
FontChanged { id: WidgetId, family: String },
}
impl WidgetEvent {
pub fn widget_id(&self) -> &WidgetId {
match self {
WidgetEvent::ButtonClick { id } => id,
WidgetEvent::TextChanged { id, .. } => id,
WidgetEvent::TextSubmit { id, .. } => id,
WidgetEvent::CheckboxChanged { id, .. } => id,
WidgetEvent::SliderChanged { id, .. } => id,
WidgetEvent::FocusGained { id } => id,
WidgetEvent::FocusLost { id } => id,
WidgetEvent::MouseEnter { id } => id,
WidgetEvent::MouseLeave { id } => id,
WidgetEvent::SelectionChanged { id, .. } => id,
WidgetEvent::RadioChanged { id, .. } => id,
WidgetEvent::TabChanged { id, .. } => id,
WidgetEvent::LinkClicked { id } => id,
WidgetEvent::SelectableLabelChanged { id, .. } => id,
WidgetEvent::DragValueChanged { id, .. } => id,
WidgetEvent::ColorChanged { id, .. } => id,
WidgetEvent::HyperlinkClicked { id, .. } => id,
WidgetEvent::FileDialogCompleted { id, .. } => id,
WidgetEvent::FontChanged { id, .. } => id,
}
}
pub fn event_type(&self) -> &'static str {
match self {
WidgetEvent::ButtonClick { .. } => "button_click",
WidgetEvent::TextChanged { .. } => "text_changed",
WidgetEvent::TextSubmit { .. } => "text_submit",
WidgetEvent::CheckboxChanged { .. } => "checkbox_changed",
WidgetEvent::SliderChanged { .. } => "slider_changed",
WidgetEvent::FocusGained { .. } => "focus_gained",
WidgetEvent::FocusLost { .. } => "focus_lost",
WidgetEvent::MouseEnter { .. } => "mouse_enter",
WidgetEvent::MouseLeave { .. } => "mouse_leave",
WidgetEvent::SelectionChanged { .. } => "selection_changed",
WidgetEvent::RadioChanged { .. } => "radio_changed",
WidgetEvent::TabChanged { .. } => "tab_changed",
WidgetEvent::LinkClicked { .. } => "link_clicked",
WidgetEvent::SelectableLabelChanged { .. } => "selectable_label_changed",
WidgetEvent::DragValueChanged { .. } => "drag_value_changed",
WidgetEvent::ColorChanged { .. } => "color_changed",
WidgetEvent::HyperlinkClicked { .. } => "hyperlink_clicked",
WidgetEvent::FileDialogCompleted { .. } => "file_dialog_completed",
WidgetEvent::FontChanged { .. } => "font_changed",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DialogResult {
Ok,
Cancel,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FileDialogResult {
pub paths: Vec<String>,
pub cancelled: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_widget_event_id() {
let event = WidgetEvent::ButtonClick { id: "btn1".to_string() };
assert_eq!(event.widget_id(), "btn1");
assert_eq!(event.event_type(), "button_click");
}
#[test]
fn test_text_changed_event() {
let event =
WidgetEvent::TextChanged { id: "input1".to_string(), value: "hello".to_string() };
assert_eq!(event.widget_id(), "input1");
if let WidgetEvent::TextChanged { value, .. } = event {
assert_eq!(value, "hello");
}
}
}