@@ -86,6 +86,7 @@ pub fn context_menu<'a>(
86
86
let mut selected_dir = 0 ;
87
87
let mut selected = 0 ;
88
88
let mut selected_trash_only = false ;
89
+ let mut selected_desktop_entry = None ;
89
90
let mut selected_types: Vec < Mime > = vec ! [ ] ;
90
91
tab. items_opt ( ) . map ( |items| {
91
92
for item in items. iter ( ) {
@@ -94,8 +95,16 @@ pub fn context_menu<'a>(
94
95
if item. metadata . is_dir ( ) {
95
96
selected_dir += 1 ;
96
97
}
97
- if item. location_opt == Some ( Location :: Trash ) {
98
- selected_trash_only = true ;
98
+ match & item. location_opt {
99
+ Some ( Location :: Trash ) => selected_trash_only = true ,
100
+ Some ( Location :: Path ( path) ) => {
101
+ if selected == 1
102
+ && path. extension ( ) . and_then ( |s| s. to_str ( ) ) == Some ( "desktop" )
103
+ {
104
+ selected_desktop_entry = Some ( & * * path) ;
105
+ }
106
+ }
107
+ _ => ( ) ,
99
108
}
100
109
selected_types. push ( item. mime . clone ( ) ) ;
101
110
}
@@ -104,6 +113,15 @@ pub fn context_menu<'a>(
104
113
selected_types. sort_unstable ( ) ;
105
114
selected_types. dedup ( ) ;
106
115
selected_trash_only = selected_trash_only && selected == 1 ;
116
+ // Recheck that only one item, the desktop entry, is selected
117
+ let selected_desktop_entry = selected_desktop_entry. and_then ( |path| {
118
+ if selected == 1 {
119
+ // Cache?
120
+ cosmic:: desktop:: load_desktop_file ( None , path)
121
+ } else {
122
+ None
123
+ }
124
+ } ) ;
107
125
108
126
let mut children: Vec < Element < _ > > = Vec :: new ( ) ;
109
127
match ( & tab. mode , & tab. location ) {
@@ -116,6 +134,15 @@ pub fn context_menu<'a>(
116
134
if tab:: trash_entries ( ) > 0 {
117
135
children. push ( menu_item ( fl ! ( "empty-trash" ) , Action :: EmptyTrash ) . into ( ) ) ;
118
136
}
137
+ } else if let Some ( entry) = selected_desktop_entry {
138
+ children. push ( menu_item ( fl ! ( "open" ) , Action :: Open ) . into ( ) ) ;
139
+ for ( i, action) in entry. desktop_actions . into_iter ( ) . enumerate ( ) {
140
+ children. push ( menu_item ( action. name , Action :: ExecEntryAction ( i) ) . into ( ) )
141
+ }
142
+ children. push ( divider:: horizontal:: light ( ) . into ( ) ) ;
143
+ children. push ( menu_item ( fl ! ( "rename" ) , Action :: Rename ) . into ( ) ) ;
144
+ // Should this simply bypass trash and remove the shortcut?
145
+ children. push ( menu_item ( fl ! ( "move-to-trash" ) , Action :: MoveToTrash ) . into ( ) ) ;
119
146
} else if selected > 0 {
120
147
if selected_dir == 1 && selected == 1 || selected_dir == 0 {
121
148
children. push ( menu_item ( fl ! ( "open" ) , Action :: Open ) . into ( ) ) ;
0 commit comments