fui/controls/
selection_area.rs1use super::*;
2use crate::signal::{Callback, Signal, Subscription};
3
4#[derive(Clone)]
5pub struct SelectionArea {
6 root: FlexBox,
7 selected_text_signal: Rc<RefCell<Signal<String>>>,
8}
9
10impl SelectionArea {
11 pub fn new() -> Self {
12 let root = flex_box();
13 root.selection_area(true);
14 let selected_text_signal = Rc::new(RefCell::new(Signal::new(String::new())));
15 let signal = selected_text_signal.clone();
16 root.core.borrow_mut().handlers.cross_selection_changed = Some(Rc::new(move |text| {
17 let callbacks = signal.borrow_mut().set(text);
18 if let Some(callbacks) = callbacks {
19 for callback in callbacks {
20 callback();
21 }
22 }
23 }));
24 Self {
25 root,
26 selected_text_signal,
27 }
28 }
29
30 pub fn selected_text(&self) -> String {
31 self.selected_text_signal.borrow().get()
32 }
33
34 pub fn subscribe_selected_text(&self, handler: impl Fn(String) + 'static) -> Subscription {
35 let signal = self.selected_text_signal.clone();
36 let callback: Callback = Rc::new(move || handler(signal.borrow().get()));
37 self.selected_text_signal.borrow_mut().subscribe(callback)
38 }
39}
40
41impl Default for SelectionArea {
42 fn default() -> Self {
43 Self::new()
44 }
45}
46
47impl Node for SelectionArea {
48 fn retained_node_ref(&self) -> NodeRef {
49 let selection_area = self.clone();
50 self.root
51 .retained_node_ref()
52 .with_build_callback(move || selection_area.build())
53 }
54
55 fn build_self(&self) {
56 self.root.build_self();
57 }
58}
59
60impl HasFlexBoxRoot for SelectionArea {
61 fn flex_box_root(&self) -> &FlexBox {
62 &self.root
63 }
64}
65
66impl ThemeBindable for SelectionArea {
67 fn theme_binding_node(&self) -> NodeRef {
68 self.root.retained_node_ref()
69 }
70
71 fn weak_theme_target(&self) -> Box<dyn Fn() -> Option<Self>> {
72 let weak_root = self.root.downgrade();
73 let signal = self.selected_text_signal.clone();
74 Box::new(move || {
75 Some(SelectionArea {
76 root: weak_root.upgrade()?,
77 selected_text_signal: signal.clone(),
78 })
79 })
80 }
81}