TMDH7GPVR3J7OEIELEE7RM7KXBA5IMFBCCVJTEGGMLYJZZCOLJ6QC EJPSD5XO43DWUBBZGNQMY4TMCAXL5EWCGX3OEHUERQ5GRASGWQLQC PKLUHYE4BGIMJKU6VKGBGSHEB2ZT53OYMTFBYCZYCO4J3RVTRXSAC LFEMJYYDO45ASMQSOJ3TNID7B5UZXDHB3NWFZJXWOAWNBS6GMDEAC YGZ3VCW4OAJYPI2CYK3MTABNFY7Y2ENSSTFE5ZZ4K6HK57FCU3XQC YRGDFHABL6BRX55ZWIBGXX3ZX2R4WUV4BELP7JMW5AZX54P5BBIQC LPSUBGUBMG2QHJJSAWQ35SZIMUR62R6ODPWBS7TSNNXJ5UJCNABQC MORKDJUERANZOBUWRC2F5766BEYYWXANAF3YAQ6YQ55WFQA7X64QC OLDN7R342GOTIMPDTTXAWFUM6MX5VTEEXS4GMZM5DAMWGECFXLAQC IMJQ4PML6OQ2MG5OK3SVUJH4RGXO4DD3O6IFD2A4UBZIMF6QI6YQC 5BAPU7K6DRZD2DYLIW3GKD2SIM6ANP7RYWGDJ6JCGHB37MHJUMTAC 6YZAVBWU6E5FYOI5JGEIPXGZLIKAW6LS2AOFIQWEE5DMOPPCD5PQC push_if(matches!(selection, dir_picker::Selection::Input),|| confirm("Confirm input"),ma,);push_if(matches!(selection, dir_picker::Selection::SubDir(_)),|| confirm("Confirm dir selection"),ma,);push_if(matches!(selection,dir_picker::Selection::ProjectPijul(_)| dir_picker::Selection::ProjectGit(_)),|| confirm("Confirm project selection"),ma,);
let push_sub_menu = |can_push: bool| {move || -> Binding {Binding {keys_str: "S-p",keys: ModKeys::One(ModKey {key: Key::Character("p".into()),mods: Mods::SHIFT,}),label: "push",msg: can_push.then_some(FilteredMsg::EnterSubMenu(model::SubMenu::Push)),}
let push_sub_menu = |can_push: bool| -> Binding {Binding {keys_str: "S-p",keys: ModKeys::One(ModKey {key: Key::Character("p".into()),mods: Mods::SHIFT,}),label: "push",msg: can_push.then_some(FilteredMsg::EnterSubMenu(model::SubMenu::Push)),
let pull_sub_menu = |can_pull: bool| {move || -> Binding {Binding {keys_str: "S-f",keys: ModKeys::One(ModKey {key: Key::Character("f".into()),mods: Mods::SHIFT,}),label: "pull",msg: can_pull.then_some(FilteredMsg::EnterSubMenu(model::SubMenu::Pull)),}
let pull_sub_menu = |can_pull: bool| -> Binding {Binding {keys_str: "S-f",keys: ModKeys::One(ModKey {key: Key::Character("f".into()),mods: Mods::SHIFT,}),label: "pull",msg: can_pull.then_some(FilteredMsg::EnterSubMenu(model::SubMenu::Pull)),
}}}Msg::SubmitInput => {if state.input.is_empty() {action = Some(Action::Picked(state.current_dir.as_path().to_path_buf(),));Task::none()} else {// Accept input only if there's an exact matchlet mut matches = if state.child_dirs.iter().any(|dir| {dir.file_name().map(|name| name.to_string_lossy())== Some(Cow::Borrowed(&state.input))}) {vec![state.input.clone()]} else {vec![]};// Change dir if there is only one matchif matches.len() == 1 {let matched =state.current_dir.join(matches.pop().unwrap());state.input = String::default();change_dir(state, matched)} else {Task::none()
if state.found_repos_dirs_git.len() - 1 > *ix {let new_ix = *ix + 1;*selection = Selection::ProjectGit(new_ix);} else {*selection = Selection::ProjectGit(0);}
*selection = Selection::ProjectGit(0);nav_scrollable::scroll_up_to_section(&mut state.right_nav,state.found_repos_dirs_pijul.len().saturating_sub(1),);
if state.found_repos_dirs_pijul.len() - 1 > *ix {let new_ix = *ix + 1;*selection = Selection::ProjectPijul(new_ix);} else {*selection = Selection::ProjectPijul(0);}
*selection = Selection::ProjectPijul(0);nav_scrollable::scroll_up_to_section(&mut state.right_nav,0,);
*selection = Selection::ProjectGit(state.found_repos_dirs_git.len() - 1,
let new_ix = state.found_repos_dirs_git.len() - 1;*selection = Selection::ProjectGit(new_ix);nav_scrollable::scroll_up_to_section(&mut state.right_nav,state.found_repos_dirs_pijul.len().saturating_sub(1)+ new_ix,
*selection = Selection::ProjectGit(state.found_repos_dirs_git.len() - 1,
let new_ix = state.found_repos_dirs_git.len() - 1;*selection = Selection::ProjectGit(new_ix);nav_scrollable::scroll_down_to_section(&mut state.right_nav,state.found_repos_dirs_pijul.len().saturating_sub(1)+ new_ix,
pub fn confirm_input_or_selection(state: &mut State,) -> (Task<Msg>, Option<Action>) {let mut action = None;let task = match state.selection {Selection::Input => {if state.input.is_empty() {action = Some(Action::Picked(state.current_dir.as_path().to_path_buf(),));Task::none()} else {nav_scrollable::scroll_up_to_section(&mut state.right_nav, 0);nav_scrollable::scroll_up_to_section(&mut state.left_nav, 0);// Accept input only if there's an exact matchlet mut matches = if state.child_dirs.iter().any(|dir| {dir.file_name().map(|name| name.to_string_lossy())== Some(Cow::Borrowed(&state.input))}) {vec![state.input.clone()]} else {vec![]};// Change dir if there is only one matchif matches.len() == 1 {let matched =state.current_dir.join(matches.pop().unwrap());state.input = String::default();change_dir(state, matched)} else {Task::none()}}}Selection::SubDir(ix) => {if !state.matched_child_dirs.is_empty() {if let Some(dir) = state.matched_child_dirs.get(ix) {let path = state.current_dir.join(dir);change_dir(state, path)} else {Task::none()}} else if !state.child_dirs.is_empty() {if let Some(dir) = state.child_dirs.get(ix) {let path = state.current_dir.join(dir);change_dir(state, path)} else {Task::none()}} else {Task::none()}}Selection::ProjectPijul(ix) => {if let Some(path) = state.found_repos_dirs_pijul.get(ix) {action = Some(Action::Picked(path.clone()));}Task::none()}Selection::ProjectGit(ix) => {if let Some(path) = state.found_repos_dirs_git.get(ix) {action = Some(Action::Picked(path.clone()));}Task::none()}};state.selection = Selection::Input;(task, action)}
let mut handle_action = |action| {if let Some(dir_picker::Action::Picked(dir)) = action {// If it contains Pijul repo, init ManagingRepo state// TODO: If it contains Git, offer to migrate it// TODO: Otherwise, offer to init Pijul from scratchlet project = store::Project {last_closed_time: cmp::Reverse(None),path: dir.clone(),};let store_project_task = if repo::is_pijul(&project.path) {Task::perform(async move { store::upsert_project(project).await },Msg::UpsertProjectResult,)} else {Task::none()};let (sub, managing_repo, managing_repo_task) =init_managing_repo(dir);new_state = Some((sub, managing_repo));Task::batch([managing_repo_task, store_project_task])} else {Task::none()}};
action::FilteredMsg::Confirm| action::FilteredMsg::Cancel
action::FilteredMsg::Confirm => {let (task, action) =dir_picker::confirm_input_or_selection(picker);let dir_picker_task =task.map(view::Msg::PickingRepoDir).map(Msg::View);let action_task = handle_action(action);Task::batch([dir_picker_task, action_task])}action::FilteredMsg::Cancel
if let Some(dir_picker::Action::Picked(dir)) = action {// If it contains Pijul repo, init ManagingRepo state// TODO: If it contains Git, offer to migrate it// TODO: Otherwise, offer to init Pijul from scratchlet project = store::Project {last_closed_time: cmp::Reverse(None),path: dir.clone(),};let store_project_task = if repo::is_pijul(&project.path) {Task::perform(async move { store::upsert_project(project).await },Msg::UpsertProjectResult,)} else {Task::none()};let (sub, managing_repo, managing_repo_task) =init_managing_repo(dir);new_state = Some((sub, managing_repo));Task::batch([dir_picker_task,managing_repo_task,store_project_task,])} else {dir_picker_task}
let action_task = handle_action(action);Task::batch([dir_picker_task, action_task])