use std::time::{Duration, Instant}; use super::*; pub fn error(ui: &mut Ui, msg: &str) -> WidgetId { text(msg) .size(20) .color(Color::RED.brighter(0.3)) .pad(10) .add(ui) .any() } pub struct Selector; impl WidgetAttr for Selector { type Input = WidgetId; fn run(ui: &mut Ui, container: &WidgetId, id: Self::Input) { let container = container.clone(); ui.register_event( &container.clone(), CursorSense::click_or_drag(), move |client: &mut Client, mut data| { let region = client.ui.window_region(&id).unwrap(); let id_pos = region.top_left; let container_pos = client.ui.window_region(&container).unwrap().top_left; data.cursor += container_pos - id_pos; data.size = region.size(); select(id.clone(), client, data); }, ); } } pub struct Selectable; impl WidgetAttr for Selectable { type Input = (); fn run(ui: &mut Ui, id: &WidgetId, _: Self::Input) { let id = id.clone(); ui.register_event( &id.clone(), CursorSense::click_or_drag(), move |client: &mut Client, data| { select(id.clone(), client, data); }, ); } } fn select(id: WidgetId, client: &mut Client, data: CursorData) { let now = Instant::now(); let recent = (now - client.last_click) < Duration::from_millis(300); client.last_click = now; client .ui .text(&id) .select(data.cursor, data.size, data.sense.is_dragging(), recent); if let Some(region) = client.ui.window_region(&id) { client.handle.window.set_ime_allowed(true); client.handle.window.set_ime_cursor_area( LogicalPosition::::from(region.top_left.tuple()), LogicalSize::::from(region.size().tuple()), ); } client.focus = Some(id); } pub fn hint(msg: impl Into) -> TextBuilder { text(msg).size(20).color(Color::GRAY) }