@@ -8,6 +8,7 @@ use tauri::{AppHandle, Emitter, Manager, Runtime};
88
99use super :: pane_state:: PaneStateStore ;
1010use super :: protocol:: { INTERNAL_ERROR , INVALID_PARAMS } ;
11+ use super :: settings_state:: SettingsStateStore ;
1112use crate :: commands:: ui:: {
1213 copy_to_clipboard, get_info, open_in_editor, quick_look, set_view_mode, show_in_finder, toggle_hidden_files,
1314} ;
@@ -59,6 +60,10 @@ pub fn execute_tool<R: Runtime>(app: &AppHandle<R>, name: &str, params: &Value)
5960 n if n. starts_with ( "selection_" ) => execute_selection_command ( app, n, params) ,
6061 // Context commands
6162 n if n. starts_with ( "context_" ) => execute_context_command ( app, n) ,
63+ // Settings commands
64+ n if n. starts_with ( "settings_" ) => execute_settings_command ( app, n, params) ,
65+ // Shortcuts commands
66+ n if n. starts_with ( "shortcuts_" ) => execute_shortcuts_command ( app, n, params) ,
6267 _ => Err ( ToolError :: invalid_params ( format ! ( "Unknown tool: {name}" ) ) ) ,
6368 }
6469}
@@ -355,6 +360,196 @@ fn execute_context_command<R: Runtime>(app: &AppHandle<R>, name: &str) -> ToolRe
355360 }
356361}
357362
363+ /// Execute a settings command.
364+ /// These manage the Settings window and its values.
365+ fn execute_settings_command < R : Runtime > ( app : & AppHandle < R > , name : & str , params : & Value ) -> ToolResult {
366+ match name {
367+ "settings_open" => {
368+ // Emit event to main window to open settings
369+ app. emit_to ( "main" , "open-settings" , ( ) )
370+ . map_err ( |e| ToolError :: internal ( e. to_string ( ) ) ) ?;
371+ Ok ( json ! ( { "success" : true , "message" : "Settings window opening" } ) )
372+ }
373+ "settings_close" => {
374+ // Emit event to settings window to close
375+ app. emit_to ( "settings" , "mcp-settings-close" , ( ) )
376+ . map_err ( |e| ToolError :: internal ( e. to_string ( ) ) ) ?;
377+ Ok ( json ! ( { "success" : true , "message" : "Settings window closing" } ) )
378+ }
379+ "settings_listSections" => {
380+ let store = app
381+ . try_state :: < SettingsStateStore > ( )
382+ . ok_or_else ( || ToolError :: internal ( "Settings state not initialized" ) ) ?;
383+
384+ let state = store. get_state ( ) ;
385+ Ok ( json ! ( {
386+ "sections" : state. sections,
387+ "selectedSection" : state. selected_section
388+ } ) )
389+ }
390+ "settings_selectSection" => {
391+ let section_path = params
392+ . get ( "sectionPath" )
393+ . and_then ( |v| v. as_array ( ) )
394+ . map ( |arr| {
395+ arr. iter ( )
396+ . filter_map ( |v| v. as_str ( ) . map ( String :: from) )
397+ . collect :: < Vec < _ > > ( )
398+ } )
399+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'sectionPath' parameter" ) ) ?;
400+
401+ // Emit event to settings window to select section
402+ app. emit_to (
403+ "settings" ,
404+ "mcp-settings-select-section" ,
405+ json ! ( { "sectionPath" : section_path} ) ,
406+ )
407+ . map_err ( |e| ToolError :: internal ( e. to_string ( ) ) ) ?;
408+ Ok ( json ! ( { "success" : true , "selectedSection" : section_path} ) )
409+ }
410+ "settings_listItems" => {
411+ let store = app
412+ . try_state :: < SettingsStateStore > ( )
413+ . ok_or_else ( || ToolError :: internal ( "Settings state not initialized" ) ) ?;
414+
415+ let state = store. get_state ( ) ;
416+ Ok ( json ! ( {
417+ "selectedSection" : state. selected_section,
418+ "settings" : state. current_settings
419+ } ) )
420+ }
421+ "settings_getValue" => {
422+ let setting_id = params
423+ . get ( "settingId" )
424+ . and_then ( |v| v. as_str ( ) )
425+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'settingId' parameter" ) ) ?;
426+
427+ let store = app
428+ . try_state :: < SettingsStateStore > ( )
429+ . ok_or_else ( || ToolError :: internal ( "Settings state not initialized" ) ) ?;
430+
431+ let state = store. get_state ( ) ;
432+ let setting = state. current_settings . iter ( ) . find ( |s| s. id == setting_id) . cloned ( ) ;
433+
434+ match setting {
435+ Some ( s) => Ok ( json ! ( {
436+ "settingId" : s. id,
437+ "value" : s. value,
438+ "isModified" : s. is_modified,
439+ "defaultValue" : s. default_value
440+ } ) ) ,
441+ None => Err ( ToolError :: invalid_params ( format ! ( "Setting not found: {setting_id}" ) ) ) ,
442+ }
443+ }
444+ "settings_setValue" => {
445+ let setting_id = params
446+ . get ( "settingId" )
447+ . and_then ( |v| v. as_str ( ) )
448+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'settingId' parameter" ) ) ?;
449+
450+ let value = params
451+ . get ( "value" )
452+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'value' parameter" ) ) ?;
453+
454+ // Emit event to settings window to set the value
455+ app. emit_to (
456+ "settings" ,
457+ "mcp-settings-set-value" ,
458+ json ! ( { "settingId" : setting_id, "value" : value} ) ,
459+ )
460+ . map_err ( |e| ToolError :: internal ( e. to_string ( ) ) ) ?;
461+
462+ Ok ( json ! ( { "success" : true , "settingId" : setting_id, "value" : value} ) )
463+ }
464+ _ => Err ( ToolError :: invalid_params ( format ! ( "Unknown settings command: {name}" ) ) ) ,
465+ }
466+ }
467+
468+ /// Execute a shortcuts command.
469+ /// These manage keyboard shortcuts configuration.
470+ fn execute_shortcuts_command < R : Runtime > ( app : & AppHandle < R > , name : & str , params : & Value ) -> ToolResult {
471+ match name {
472+ "shortcuts_list" => {
473+ let store = app
474+ . try_state :: < SettingsStateStore > ( )
475+ . ok_or_else ( || ToolError :: internal ( "Settings state not initialized" ) ) ?;
476+
477+ let state = store. get_state ( ) ;
478+ Ok ( json ! ( {
479+ "commands" : state. shortcuts
480+ } ) )
481+ }
482+ "shortcuts_set" => {
483+ let command_id = params
484+ . get ( "commandId" )
485+ . and_then ( |v| v. as_str ( ) )
486+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'commandId' parameter" ) ) ?;
487+
488+ let index = params
489+ . get ( "index" )
490+ . and_then ( |v| v. as_i64 ( ) )
491+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'index' parameter" ) ) ?;
492+
493+ let shortcut = params
494+ . get ( "shortcut" )
495+ . and_then ( |v| v. as_str ( ) )
496+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'shortcut' parameter" ) ) ?;
497+
498+ // Emit event to settings window (or main window if settings is closed)
499+ // to set the shortcut
500+ app. emit (
501+ "mcp-shortcuts-set" ,
502+ json ! ( { "commandId" : command_id, "index" : index, "shortcut" : shortcut} ) ,
503+ )
504+ . map_err ( |e| ToolError :: internal ( e. to_string ( ) ) ) ?;
505+
506+ Ok ( json ! ( {
507+ "success" : true ,
508+ "commandId" : command_id,
509+ "index" : index,
510+ "shortcut" : shortcut
511+ } ) )
512+ }
513+ "shortcuts_remove" => {
514+ let command_id = params
515+ . get ( "commandId" )
516+ . and_then ( |v| v. as_str ( ) )
517+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'commandId' parameter" ) ) ?;
518+
519+ let index = params
520+ . get ( "index" )
521+ . and_then ( |v| v. as_i64 ( ) )
522+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'index' parameter" ) ) ?;
523+
524+ // Emit event to remove the shortcut
525+ app. emit ( "mcp-shortcuts-remove" , json ! ( { "commandId" : command_id, "index" : index} ) )
526+ . map_err ( |e| ToolError :: internal ( e. to_string ( ) ) ) ?;
527+
528+ Ok ( json ! ( {
529+ "success" : true ,
530+ "commandId" : command_id,
531+ "index" : index
532+ } ) )
533+ }
534+ "shortcuts_reset" => {
535+ let command_id = params
536+ . get ( "commandId" )
537+ . and_then ( |v| v. as_str ( ) )
538+ . ok_or_else ( || ToolError :: invalid_params ( "Missing 'commandId' parameter" ) ) ?;
539+
540+ // Emit event to reset the shortcut
541+ app. emit ( "mcp-shortcuts-reset" , json ! ( { "commandId" : command_id} ) )
542+ . map_err ( |e| ToolError :: internal ( e. to_string ( ) ) ) ?;
543+
544+ Ok ( json ! ( {
545+ "success" : true ,
546+ "commandId" : command_id
547+ } ) )
548+ }
549+ _ => Err ( ToolError :: invalid_params ( format ! ( "Unknown shortcuts command: {name}" ) ) ) ,
550+ }
551+ }
552+
358553#[ cfg( test) ]
359554mod tests {
360555 use super :: * ;
0 commit comments