Skip to content

Commit eff2716

Browse files
committed
update example
1 parent 0807c31 commit eff2716

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

druid/examples/menu.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,29 @@ fn build_menu() -> Menu<AppState> {
7474
)
7575
.entry(
7676
MenuItem::new("1 Selected")
77-
.on_activate(|_, data: &mut AppState, _|if data.value == 1 {data.value = 0} else {data.value = 1})
78-
.selected_if(|data: &AppState, _|data.value == 1)
77+
.radio_item(1, Some(0))
78+
.lens(AppState::value)
7979
)
8080
.entry(
8181
MenuItem::new("2 Selected")
82-
.on_activate(|_, data: &mut AppState, _|if data.value == 2 {data.value = 0} else {data.value = 2})
83-
.selected_if(|data: &AppState, _|data.value == 2)
82+
.radio_item(2, Some(0))
83+
.lens(AppState::value)
8484
)
8585
.entry(
86+
// Implementing the radio item from hand
8687
MenuItem::new("3 Selected")
8788
.on_activate(|_, data: &mut AppState, _|if data.value == 3 {data.value = 0} else {data.value = 3})
8889
.selected_if(|data: &AppState, _|data.value == 3)
8990
)
9091
.separator()
9192
.entry(
9293
MenuItem::new("CheckBox")
94+
.toggle_data()
95+
.lens(AppState::option)
96+
)
97+
.entry(
98+
// Implementing the CheckBox from hand
99+
MenuItem::new("Manual CheckBox")
93100
.on_activate(|_, data: &mut AppState, _|data.option = !data.option)
94101
.selected_if(|data: &AppState, _|data.option)
95102
)

druid/src/menu/mod.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,23 @@ impl<T: Data> MenuItem<T> {
638638
self.on_activate(move |ctx, _data, _env| ctx.submit_command(cmd.clone()))
639639
}
640640

641+
/// Turns this `MenuItem` into a `RadioButton`
642+
///
643+
/// When selected this MenuItem will set the provided value as data.
644+
/// If data is equal to the provided value the Item is selected otherwise not.
645+
pub fn radio_item(self, value: T, unselect: Option<T>) -> Self where T: PartialEq {
646+
let value2 = value.clone();
647+
self
648+
.on_activate(move |_, data: &mut T, _|{
649+
if data != value {
650+
*data = value.clone();
651+
} else if let Some(value) = unselect.clone() {
652+
*data = value;
653+
}
654+
})
655+
.selected_if(move |data, _|data == value2)
656+
}
657+
641658
/// Provide a hotkey for activating this menu item.
642659
///
643660
/// This is equivalent to
@@ -723,6 +740,18 @@ impl<T: Data> MenuItem<T> {
723740
}
724741
}
725742

743+
impl MenuItem<bool> {
744+
/// Turns the MenuItem into a CheckBox.
745+
///
746+
/// this is a convenience method which sets the `on_activate` and `selected_if` callbacks
747+
/// to behave like a `CheckBox`.
748+
pub fn toggle_data(self) -> Self {
749+
self
750+
.on_activate(|_, data, _|*data = !*data)
751+
.selected_if(|data, _|*data)
752+
}
753+
}
754+
726755
impl<T: Data> MenuVisitor<T> for Menu<T> {
727756
fn activate(&mut self, ctx: &mut MenuEventCtx, id: MenuItemId, data: &mut T, env: &Env) {
728757
for child in &mut self.children {

0 commit comments

Comments
 (0)