11#[ cfg( target_os = "macos" ) ]
22pub ( crate ) mod menu {
3+ use base64:: engine:: Engine ;
4+ use base64:: engine:: general_purpose:: STANDARD as BASE64 ;
5+
36 use graphite_editor:: messages:: input_mapper:: utility_types:: input_keyboard:: { Key , LayoutKey , LayoutKeysGroup } ;
47 use graphite_editor:: messages:: input_mapper:: utility_types:: misc:: ActionKeys ;
5- use graphite_editor:: messages:: tool:: tool_messages:: tool_prelude:: { LayoutGroup , MenuListEntry , SubLayout , Widget } ;
8+ use graphite_editor:: messages:: layout:: LayoutMessage ;
9+ use graphite_editor:: messages:: tool:: tool_messages:: tool_prelude:: { LayoutGroup , LayoutTarget , MenuListEntry , SubLayout , Widget , WidgetId } ;
610
7- use crate :: messages:: { KeyCode , MenuItem , Modifiers , Shortcut } ;
11+ use crate :: messages:: { EditorMessage , KeyCode , MenuItem , Modifiers , Shortcut } ;
812
9- pub ( crate ) fn convert_menu_bar_entries_to_menu_items ( layout : & SubLayout ) -> Vec < MenuItem > {
13+ pub ( crate ) fn convert_menu_bar_layout_to_menu_items ( layout : & SubLayout ) -> Vec < MenuItem > {
1014 let layout_group = match layout. as_slice ( ) {
1115 [ layout_group] => layout_group,
1216 _ => panic ! ( "Menu bar layout is supposed to have exactly one layout group" ) ,
1317 } ;
1418 let LayoutGroup :: Row { widgets } = layout_group else {
1519 panic ! ( "Menu bar layout group is supposed to be a row" ) ;
1620 } ;
17- println ! ( "" ) ;
1821 widgets
1922 . into_iter ( )
2023 . map ( |widget| {
2124 let text_button = match & widget. widget {
2225 Widget :: TextButton ( text_button) => text_button,
2326 _ => panic ! ( "Menu bar layout top-level widgets are supposed to be text buttons" ) ,
2427 } ;
25-
28+
2629 MenuItem :: SubMenu {
2730 id : widget. widget_id . to_string ( ) ,
2831 text : text_button. label . clone ( ) ,
@@ -33,15 +36,30 @@ pub(crate) mod menu {
3336 . collect :: < Vec < MenuItem > > ( )
3437 }
3538
36- fn item_path_to_string ( widget_id : u64 , path : Vec < String > ) -> String {
37- let path = path
38- . into_iter ( )
39- . map ( |element| {
40- use base64:: prelude:: * ;
41- base64:: engine:: general_purpose:: STANDARD . encode ( element)
39+ pub ( crate ) fn parse_item_path ( id : String ) -> Option < EditorMessage > {
40+ let mut id_parts = id. split ( ':' ) ;
41+ let widget_id = id_parts. next ( ) ?. parse :: < u64 > ( ) . ok ( ) ?;
42+
43+ let value = id_parts
44+ . map ( |part| {
45+ let bytes = BASE64 . decode ( part) . ok ( ) ?;
46+ String :: from_utf8 ( bytes) . ok ( )
4247 } )
43- . collect :: < Vec < _ > > ( )
44- . join ( ":" ) ;
48+ . collect :: < Option < Vec < String > > > ( ) ?;
49+ let value = serde_json:: to_value ( value) . ok ( ) ?;
50+
51+ Some (
52+ LayoutMessage :: WidgetValueUpdate {
53+ layout_target : LayoutTarget :: MenuBar ,
54+ widget_id : WidgetId ( widget_id) ,
55+ value,
56+ }
57+ . into ( ) ,
58+ )
59+ }
60+
61+ fn item_path_to_string ( widget_id : u64 , path : Vec < String > ) -> String {
62+ let path = path. into_iter ( ) . map ( |element| BASE64 . encode ( element) ) . collect :: < Vec < _ > > ( ) . join ( ":" ) ;
4563 format ! ( "{widget_id}:{path}" )
4664 }
4765
0 commit comments