cosmic/widget/dropdown/multi/
model.rs

1//! A [`Model`] for a multi menu dropdown widget.
2
3/// Create a [`Model`] for a multi-list dropdown.
4pub fn model<S, Item>() -> Model<S, Item> {
5    Model {
6        lists: Vec::new(),
7        selected: None,
8    }
9}
10
11/// Create a [`List`] for a multi-list dropdown widget.
12pub fn list<S, Item>(description: Option<S>, options: Vec<(S, Item)>) -> List<S, Item> {
13    List {
14        description,
15        options,
16    }
17}
18
19/// A model for managing the options in a multi-list dropdown.
20///
21/// ```no_run
22/// #[derive(Copy, Clone, Eq, PartialEq)]
23/// enum MenuOption {
24///     Option1,
25///     Option2,
26///     Option3,
27///     Option4,
28///     Option5,
29///     Option6
30/// }
31/// use cosmic::widget::dropdown;
32///
33/// let mut model = dropdown::multi::model();
34///
35/// model.insert(dropdown::multi::list(Some("List A"), vec![
36///     ("Option 1", MenuOption::Option1),
37///     ("Option 2", MenuOption::Option2),
38///     ("Option 3", MenuOption::Option3)
39/// ]));
40///
41/// model.insert(dropdown::multi::list(Some("List B"), vec![
42///     ("Option 4", MenuOption::Option4),
43///     ("Option 5", MenuOption::Option5),
44///     ("Option 6", MenuOption::Option6)
45/// ]));
46///
47/// model.clear();
48/// ```
49#[must_use]
50pub struct Model<S, Item> {
51    pub lists: Vec<List<S, Item>>,
52    pub selected: Option<Item>,
53}
54
55impl<S, Item: PartialEq> Model<S, Item> {
56    pub(super) fn get(&self, item: &Item) -> Option<&S> {
57        for list in &self.lists {
58            for option in &list.options {
59                if &option.1 == item {
60                    return Some(&option.0);
61                }
62            }
63        }
64
65        None
66    }
67
68    pub(super) fn next(&self) -> Option<&(S, Item)> {
69        let Some(item) = self.selected.as_ref() else {
70            return None;
71        };
72
73        let mut next = false;
74        for list in &self.lists {
75            for option in &list.options {
76                if next {
77                    return Some(option);
78                }
79
80                if &option.1 == item {
81                    next = true;
82                }
83            }
84        }
85
86        None
87    }
88
89    pub fn clear(&mut self) {
90        self.lists.clear();
91    }
92
93    pub fn insert(&mut self, list: List<S, Item>) {
94        self.lists.push(list);
95    }
96}
97
98/// A list for a multi-list dropdown widget.
99pub struct List<S, Item> {
100    pub description: Option<S>,
101    pub options: Vec<(S, Item)>,
102}