aboutsummaryrefslogtreecommitdiff
path: root/src/app/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/mod.rs')
-rw-r--r--src/app/mod.rs39
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));