Skip to main content

fui/controls/
selection_area.rs

1use 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}