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 item = self.selected.as_ref()?;
70
71        let mut next = false;
72        for list in &self.lists {
73            for option in &list.options {
74                if next {
75                    return Some(option);
76                }
77
78                if &option.1 == item {
79                    next = true;
80                }
81            }
82        }
83
84        None
85    }
86
87    pub fn clear(&mut self) {
88        self.lists.clear();
89    }
90
91    pub fn insert(&mut self, list: List<S, Item>) {
92        self.lists.push(list);
93    }
94}
95
96/// A list for a multi-list dropdown widget.
97pub struct List<S, Item> {
98    pub description: Option<S>,
99    pub options: Vec<(S, Item)>,
100}