cosmic/widget/segmented_button/model/
builder.rs
1use slotmap::{SecondaryMap, SparseSecondaryMap};
5
6use super::{Entity, Model, Selectable};
7use crate::widget::icon::Icon;
8use std::borrow::Cow;
9
10#[derive(Default)]
12pub struct ModelBuilder<SelectionMode: Default>(Model<SelectionMode>);
13
14pub struct BuilderEntity<SelectionMode: Default> {
16 model: ModelBuilder<SelectionMode>,
17 id: Entity,
18}
19
20impl<SelectionMode: Default> ModelBuilder<SelectionMode>
21where
22 Model<SelectionMode>: Selectable,
23{
24 #[must_use]
26 pub fn insert(
27 mut self,
28 builder: impl Fn(BuilderEntity<SelectionMode>) -> BuilderEntity<SelectionMode>,
29 ) -> Self {
30 let id = self.0.insert().id();
31 builder(BuilderEntity { model: self, id }).model
32 }
33
34 #[inline]
36 pub fn build(self) -> Model<SelectionMode> {
37 self.0
38 }
39}
40
41impl<SelectionMode: Default> BuilderEntity<SelectionMode>
42where
43 Model<SelectionMode>: Selectable,
44{
45 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
47 #[inline]
48 pub fn activate(mut self) -> Self {
49 self.model.0.activate(self.id);
50 self
51 }
52
53 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
55 #[inline]
56 pub fn closable(mut self) -> Self {
57 self.model.0.closable_set(self.id, true);
58 self
59 }
60
61 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
66 #[inline]
67 pub fn secondary<Data>(self, map: &mut SecondaryMap<Entity, Data>, data: Data) -> Self {
68 map.insert(self.id, data);
69 self
70 }
71
72 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
76 #[inline]
77 pub fn secondary_sparse<Data>(
78 self,
79 map: &mut SparseSecondaryMap<Entity, Data>,
80 data: Data,
81 ) -> Self {
82 map.insert(self.id, data);
83 self
84 }
85
86 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
98 #[inline]
99 pub fn data<Data: 'static>(mut self, data: Data) -> Self {
100 self.model.0.data_set(self.id, data);
101 self
102 }
103
104 #[inline]
105 pub fn divider_above(mut self) -> Self {
106 self.model.0.divider_above_set(self.id, true);
107 self
108 }
109
110 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
118 pub fn icon(mut self, icon: impl Into<Icon>) -> Self {
119 self.model.0.icon_set(self.id, icon.into());
120 self
121 }
122
123 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
125 #[inline]
126 pub fn position(mut self, position: u16) -> Self {
127 self.model.0.position_set(self.id, position);
128 self
129 }
130
131 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
133 #[inline]
134 pub fn position_swap(mut self, other: Entity) -> Self {
135 self.model.0.position_swap(self.id, other);
136 self
137 }
138
139 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
141 pub fn text(mut self, text: impl Into<Cow<'static, str>>) -> Self {
142 self.model.0.text_set(self.id, text);
143 self
144 }
145
146 #[allow(clippy::must_use_candidate, clippy::return_self_not_must_use)]
148 pub fn with_id(self, func: impl FnOnce(Entity)) -> Self {
149 func(self.id);
150 self
151 }
152}