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}