diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-18 01:55:46 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-18 01:55:46 +0300 |
| commit | e298e4589050349630d0faaec00ef11555b83ae1 (patch) | |
| tree | f9487e37bb641cb99e5bb053d7ad8106db13b047 /src/app/mod.rs | |
| parent | 13ce20c4f536892c5b939bd62e5286fac9c2eaee (diff) | |
feat: add optional workspace name prompt
Diffstat (limited to 'src/app/mod.rs')
| -rw-r--r-- | src/app/mod.rs | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/src/app/mod.rs b/src/app/mod.rs index b6f2bbb8..d634dbb4 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -534,6 +534,7 @@ impl App { request_clipboard_write: None, creating_new_tab: false, requested_new_tab_name: None, + pending_workspace_create_cwd: None, rename_pane_target: None, worktree_create: None, worktree_open: None, @@ -617,6 +618,7 @@ impl App { mouse_scroll_lines: config.ui.mouse_scroll_lines(), confirm_close: config.ui.confirm_close, prompt_new_tab_name: config.ui.prompt_new_tab_name, + prompt_new_workspace_name: config.ui.prompt_new_workspace_name, pane_borders: config.ui.pane_borders, pane_gaps: config.ui.pane_gaps, show_agent_labels_on_pane_borders: config.ui.show_agent_labels_on_pane_borders, @@ -1151,7 +1153,10 @@ impl App { } pub(crate) fn ensure_default_workspace(&mut self) -> bool { - if !self.state.workspaces.is_empty() || self.state.mode == Mode::Onboarding { + if !self.state.workspaces.is_empty() + || self.state.mode == Mode::Onboarding + || self.state.pending_workspace_create_cwd.is_some() + { return false; } @@ -1405,6 +1410,7 @@ impl App { config.ui.right_click_passthrough_modifiers(); self.state.confirm_close = config.ui.confirm_close; self.state.prompt_new_tab_name = config.ui.prompt_new_tab_name; + self.state.prompt_new_workspace_name = config.ui.prompt_new_workspace_name; self.state.pane_borders = config.ui.pane_borders; self.state.pane_gaps = config.ui.pane_gaps; self.state.show_agent_labels_on_pane_borders = @@ -2386,6 +2392,34 @@ mod tests { } #[test] + fn workspace_name_prompt_suppresses_default_creation_while_pending() { + let mut app = test_app(); + app.state.prompt_new_workspace_name = true; + + app.begin_tui_workspace_create("test.workspace.create"); + + assert_eq!(app.state.mode, Mode::RenameWorkspace); + assert!(app.state.pending_workspace_create_cwd.is_some()); + assert!(!app.ensure_default_workspace()); + assert!(app.state.workspaces.is_empty()); + + app.handle_rename_key_via_api(KeyEvent::new(KeyCode::Esc, KeyModifiers::empty())); + assert!(app.state.workspaces.is_empty()); + assert!(app.state.pending_workspace_create_cwd.is_none()); + } + + #[test] + fn startup_uses_workspace_name_prompt_config() { + let mut config = Config::default(); + config.ui.prompt_new_workspace_name = true; + let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); + + let app = App::new(&config, true, None, api_rx, crate::api::EventHub::default()); + + assert!(app.state.prompt_new_workspace_name); + } + + #[test] fn theme_auto_switch_is_opt_in_and_preserves_manual_default() { let mut config = Config::default(); config.theme.name = Some("tokyo-night".to_string()); @@ -2571,7 +2605,7 @@ mod tests { std::fs::create_dir_all(path.parent().unwrap()).unwrap(); std::fs::write( &path, - "[terminal]\ndefault_shell = \"nu\"\nshell_mode = \"non_login\"\nnew_cwd = \"home\"\n[keys]\nnew_workspace = \"prefix+m\"\nprefix = \"ctrl+a\"\n[update]\nversion_check = false\nmanifest_check = false\n[ui]\nagent_panel_scope = \"current\"\nagent_panel_sort = \"priority\"\nredraw_on_focus_gained = false\ncopy_on_select = false\nright_click_passthrough_modifier = \"ctrl\"\n[ui.toast]\ndelivery = \"herdr\"\n[experimental]\nswitch_ascii_input_source_in_prefix = true\n", + "[terminal]\ndefault_shell = \"nu\"\nshell_mode = \"non_login\"\nnew_cwd = \"home\"\n[keys]\nnew_workspace = \"prefix+m\"\nprefix = \"ctrl+a\"\n[update]\nversion_check = false\nmanifest_check = false\n[ui]\nagent_panel_scope = \"current\"\nagent_panel_sort = \"priority\"\nredraw_on_focus_gained = false\ncopy_on_select = false\nright_click_passthrough_modifier = \"ctrl\"\nprompt_new_workspace_name = true\n[ui.toast]\ndelivery = \"herdr\"\n[experimental]\nswitch_ascii_input_source_in_prefix = true\n", ) .unwrap(); std::env::set_var(crate::config::CONFIG_PATH_ENV_VAR, &path); @@ -2619,6 +2653,7 @@ mod tests { assert_eq!(app.state.agent_panel_sort, state::AgentPanelSort::Priority); assert!(!app.state.redraw_on_focus_gained); assert!(!app.state.copy_on_select); + assert!(app.state.prompt_new_workspace_name); assert!(app.state.selection.is_some()); assert!(app.state.selection_autoscroll.is_some()); assert_eq!(app.selection_autoscroll_deadline, Some(selection_deadline)); |
