@@ -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+
726755impl < 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