dir picker key navigation

tzemanovic
Feb 6, 2026, 12:16 PM
5BAPU7K6DRZD2DYLIW3GKD2SIM6ANP7RYWGDJ6JCGHB37MHJUMTAC

Dependencies

  • [2] EJPSD5XO shared allowed actions conditions between update and view
  • [3] 7WCB5YQJ refactor msgs and modules
  • [4] AZ5D2LQU allow to set record description
  • [5] QUMAQ7IX fix prev focus label
  • [6] CULHFNIV add error report view
  • [7] LFEMJYYD start of to_record selection
  • [8] 2SLTGWP6 add change files diffs to-record selection
  • [9] TEDT26JQ add push and pull sub-menus
  • [10] YRGDFHAB project dir picker
  • [11] LPSUBGUB add projects picker
  • [12] MORKDJUE use allowed actions binding for key subs
  • [13] EIHMXSDR mv crate iced_expl_widget to inflorescence_iced_widget
  • [14] 23SFYK4Q big view refactor into a new crate
  • [*] 6YZAVBWU Initial commit

Change contents

  • replacement in inflorescence_view/src/view.rs at line 132
    [10.19559][10.19559:19620](),[10.19620][11.14900:14939]()
    dir_picker::view(picker, theme::Container::Bordered)
    .map(Msg::PickingRepoDir),
    [10.19559]
    [10.19656]
    dir_picker::view(
    picker,
    theme::Container::Bordered,
    theme::Container::NavSelectedSection,
    theme::Button::Normal,
    theme::Button::Selected,
    theme::Scrollable::Normal,
    theme::Scrollable::Selected,
    )
    .map(Msg::PickingRepoDir),
  • replacement in inflorescence_model/src/action.rs at line 4
    [12.170966][10.3592421:3592468](),[7.12963][10.3592421:3592468]()
    use inflorescence_iced_widget::nav_scrollable;
    [12.170966]
    [8.7459]
    use inflorescence_iced_widget::{dir_picker, nav_scrollable};
  • edit in inflorescence_model/src/action.rs at line 144
    [2.5596]
    [10.3592469]
    impl ModKeys {
    pub fn iter(&self) -> ModKeysIter<'_> {
    ModKeysIter { keys: self, ix: 0 }
    }
    }
    pub struct ModKeysIter<'a> {
    keys: &'a ModKeys,
    ix: usize,
    }
    impl<'a> Iterator for ModKeysIter<'a> {
    type Item = &'a ModKey;
    fn next(&mut self) -> Option<Self::Item> {
    let Self { keys, ix } = self;
    match keys {
    ModKeys::One(mod_key) => {
    if *ix == 0 {
    *ix += 1;
    Some(mod_key)
    } else {
    None
    }
    }
    ModKeys::Two(mod_key_0, mod_key_1) => {
    if *ix == 0 {
    *ix += 1;
    Some(mod_key_0)
    } else if *ix == 1 {
    *ix += 1;
    Some(mod_key_1)
    } else {
    None
    }
    }
    }
    }
    }
  • replacement in inflorescence_model/src/action.rs at line 202
    [10.3592673][10.3592673:3592722]()
    get_allowed_in_picking_repo(sub)
    [10.3592673]
    [10.3592722]
    get_allowed_in_picking_repo_dir(sub)
  • replacement in inflorescence_model/src/action.rs at line 207
    [9.532805][11.15162:15272]()
    model::SubState::PickingProject(_sub) =>
    // TODO
    {
    vec![]
    [9.532805]
    [11.15272]
    model::SubState::PickingProject(sub) => {
    get_allowed_in_picking_project(sub)
  • replacement in inflorescence_model/src/action.rs at line 245
    [6.7283][12.171776:171877]()
    impl ModKeys {
    pub fn iter(&self) -> ModKeysIter<'_> {
    ModKeysIter { keys: self, ix: 0 }
    [6.7283]
    [12.171877]
    fn get_allowed_in_picking_project(
    state: &model::PickingProject,
    ) -> Vec<Binding> {
    let model::PickingProject {
    is_blocking: _,
    projects,
    } = state;
    if projects.is_some() {
    vec![down(), up()]
    } else {
    vec![]
  • edit in inflorescence_model/src/action.rs at line 259
    [12.171885]
    [12.171885]
    fn get_allowed_in_picking_repo_dir(
    state: &model::PickingRepoDir,
    ) -> Vec<Binding> {
    let model::PickingRepoDir {
    picker:
    dir_picker::State {
    matched_child_dirs,
    child_dirs,
    found_repos_dirs_pijul,
    found_repos_dirs_git,
    selection,
    ..
    },
    } = state;
  • replacement in inflorescence_model/src/action.rs at line 275
    [12.171886][12.171886:171955]()
    pub struct ModKeysIter<'a> {
    keys: &'a ModKeys,
    ix: usize,
    }
    [12.171886]
    [12.171955]
    let down = || Binding {
    keys_str: "C-(↓| j)",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowDown),
    mods: Mods::CTRL,
    },
    ModKey {
    key: Key::Character("j".into()),
    mods: Mods::CTRL,
    },
    ),
    label: "down",
    msg: Some(FilteredMsg::Selection(selection::Msg::AltPressDir(
    selection::Dir::Down,
    ))),
    };
    let up = || Binding {
    keys_str: "C-(↑| k)",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowUp),
    mods: Mods::CTRL,
    },
    ModKey {
    key: Key::Character("k".into()),
    mods: Mods::CTRL,
    },
    ),
    label: "up",
    msg: Some(FilteredMsg::Selection(selection::Msg::AltPressDir(
    selection::Dir::Up,
    ))),
    };
    let left = || Binding {
    keys_str: "C-(←| h)",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowLeft),
    mods: Mods::CTRL,
    },
    ModKey {
    key: Key::Character("h".into()),
    mods: Mods::CTRL,
    },
    ),
    label: "left",
    msg: Some(FilteredMsg::Selection(selection::Msg::AltPressDir(
    selection::Dir::Left,
    ))),
    };
    let right = || Binding {
    keys_str: "C-(→| l)",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowRight),
    mods: Mods::CTRL,
    },
    ModKey {
    key: Key::Character("l".into()),
    mods: Mods::CTRL,
    },
    ),
    label: "right",
    msg: Some(FilteredMsg::Selection(selection::Msg::AltPressDir(
    selection::Dir::Right,
    ))),
    };
  • replacement in inflorescence_model/src/action.rs at line 344
    [12.171956][12.171956:172024]()
    impl<'a> Iterator for ModKeysIter<'a> {
    type Item = &'a ModKey;
    [12.171956]
    [12.172024]
    let mut actions = vec![];
    let ma = &mut actions;
  • replacement in inflorescence_model/src/action.rs at line 347
    [12.172025][12.172025:172679]()
    fn next(&mut self) -> Option<Self::Item> {
    let Self { keys, ix } = self;
    match keys {
    ModKeys::One(mod_key) => {
    if *ix == 0 {
    *ix += 1;
    Some(mod_key)
    } else {
    None
    }
    }
    ModKeys::Two(mod_key_0, mod_key_1) => {
    if *ix == 0 {
    *ix += 1;
    Some(mod_key_0)
    } else if *ix == 1 {
    *ix += 1;
    Some(mod_key_1)
    } else {
    None
    }
    }
    [12.172025]
    [12.172679]
    let can_down_or_up = match selection {
    dir_picker::Selection::Input => {
    !matched_child_dirs.is_empty() || !child_dirs.is_empty()
    }
    dir_picker::Selection::SubDir(_) => true,
    dir_picker::Selection::ProjectPijul(_)
    | dir_picker::Selection::ProjectGit(_) => {
    !found_repos_dirs_pijul.is_empty()
    || !found_repos_dirs_git.is_empty()
  • replacement in inflorescence_model/src/action.rs at line 357
    [12.172689][12.172689:172697]()
    }
    }
    [12.172689]
    [12.172697]
    };
  • replacement in inflorescence_model/src/action.rs at line 359
    [12.172698][10.3593010:3593114](),[6.7283][10.3593010:3593114]()
    fn get_allowed_in_picking_repo(_state: &model::PickingRepoDir) -> Vec<Binding> {
    vec![down(), up()]
    [12.172698]
    [10.3593114]
    push_if(can_down_or_up, down, ma);
    push_if(can_down_or_up, up, ma);
    push_if(
    matches!(
    selection,
    dir_picker::Selection::ProjectPijul(_)
    | dir_picker::Selection::ProjectGit(_)
    ),
    left,
    ma,
    );
    push_if(
    matches!(
    selection,
    dir_picker::Selection::Input | dir_picker::Selection::SubDir(_)
    ),
    right,
    ma,
    );
    push(focus_next, ma);
    actions
  • replacement in inflorescence_model/src/action.rs at line 400
    [2.6759][12.173316:173348]()
    keys_str: "S-(↓| j)",
    [2.6759]
    [12.173348]
    keys_str: "C-(↓| j)",
  • replacement in inflorescence_model/src/action.rs at line 404
    [12.173448][12.173448:173483]()
    mods: Mods::SHIFT,
    [12.173448]
    [12.173483]
    mods: Mods::CTRL,
  • replacement in inflorescence_model/src/action.rs at line 408
    [12.173568][12.173568:173603]()
    mods: Mods::SHIFT,
    [12.173568]
    [12.173603]
    mods: Mods::CTRL,
  • replacement in inflorescence_model/src/action.rs at line 417
    [2.6962][12.173630:173662]()
    keys_str: "S-(↑| k)",
    [2.6962]
    [12.173662]
    keys_str: "C-(↑| k)",
  • replacement in inflorescence_model/src/action.rs at line 421
    [12.173760][12.173760:173795]()
    mods: Mods::SHIFT,
    [12.173760]
    [12.173795]
    mods: Mods::CTRL,
  • replacement in inflorescence_model/src/action.rs at line 425
    [12.173880][12.173880:173915]()
    mods: Mods::SHIFT,
    [12.173880]
    [12.173915]
    mods: Mods::CTRL,
  • edit in inflorescence_model/src/action.rs at line 506
    [3.8262][2.7915:7922](),[2.7915][2.7915:7922](),[2.7922][4.3098:3132](),[4.3132][12.175124:175268](),[12.175268][4.3152:3224](),[4.3152][4.3152:3224]()
    };
    let focus_next = || Binding {
    keys_str: "Tab",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Tab),
    mods: Mods::NONE,
    }),
    label: "focus next",
    msg: Some(FilteredMsg::FocusNext),
  • edit in inflorescence_model/src/action.rs at line 507
    [4.3231][4.3231:3265](),[4.3265][12.175269:175416](),[5.62][4.3285:3368](),[12.175416][4.3285:3368](),[4.3285][4.3285:3368]()
    let focus_prev = || Binding {
    keys_str: "S-Tab",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Tab),
    mods: Mods::SHIFT,
    }),
    label: "focus previous",
    msg: Some(FilteredMsg::FocusPrev),
    };
  • edit in inflorescence_model/src/action.rs at line 1380
    [9.533520]
    fn focus_next() -> Binding {
    Binding {
    keys_str: "Tab",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Tab),
    mods: Mods::NONE,
    }),
    label: "focus next",
    msg: Some(FilteredMsg::FocusNext),
    }
    }
    fn focus_prev() -> Binding {
    Binding {
    keys_str: "S-Tab",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Tab),
    mods: Mods::SHIFT,
    }),
    label: "focus previous",
    msg: Some(FilteredMsg::FocusPrev),
    }
    }
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 21
    [10.615][10.615:983]()
    left_nav: nav_scrollable::State,
    right_nav: nav_scrollable::State,
    input: String,
    current_dir: BasePathBuf,
    child_dirs: Vec<PathBuf>,
    matched_child_dirs: Vec<String>,
    found_repos_dirs_pijul: Vec<PathBuf>,
    found_repos_dirs_git: Vec<PathBuf>,
    find_child_dirs_handle: Option<task::Handle>,
    find_repos_handle: Option<task::Handle>,
    [10.615]
    [10.983]
    pub left_nav: nav_scrollable::State,
    pub right_nav: nav_scrollable::State,
    pub input: String,
    pub current_dir: BasePathBuf,
    pub child_dirs: Vec<PathBuf>,
    pub matched_child_dirs: Vec<String>,
    pub found_repos_dirs_pijul: Vec<PathBuf>,
    pub found_repos_dirs_git: Vec<PathBuf>,
    pub find_child_dirs_handle: Option<task::Handle>,
    pub find_repos_handle: Option<task::Handle>,
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 32
    [10.1050][10.1050:1072]()
    matcher: Matcher,
    [10.1050]
    [10.1072]
    pub matcher: Matcher,
    pub selection: Selection,
    }
    #[derive(Debug, Default)]
    pub enum Selection {
    #[default]
    Input,
    SubDir(usize),
    ProjectPijul(usize),
    ProjectGit(usize),
  • edit in inflorescence_iced_widget/src/dir_picker.rs at line 102
    [10.2894]
    [10.2894]
    selection: Selection::default(),
  • edit in inflorescence_iced_widget/src/dir_picker.rs at line 118
    [10.3140][10.3140:3143]()
    //
  • edit in inflorescence_iced_widget/src/dir_picker.rs at line 252
    [10.8245]
    [10.8245]
    }
    #[derive(Debug, Clone, Copy)]
    pub enum SelectionDir {
    Down,
    Up,
    Left,
    Right,
    }
    pub fn move_selection(state: &mut State, dir: SelectionDir) {
    let selection = &mut state.selection;
    match dir {
    SelectionDir::Down => match selection {
    Selection::Input => {
    if !state.matched_child_dirs.is_empty()
    || !state.child_dirs.is_empty()
    {
    *selection = Selection::SubDir(0);
    }
    }
    Selection::SubDir(ix) => {
    if (!state.matched_child_dirs.is_empty()
    && state.matched_child_dirs.len() - 1 > *ix)
    || (!state.child_dirs.is_empty()
    && state.child_dirs.len() - 1 > *ix)
    {
    let new_ix = *ix + 1;
    *selection = Selection::SubDir(new_ix);
    } else {
    *selection = Selection::Input;
    }
    }
    Selection::ProjectPijul(ix) => {
    if !state.found_repos_dirs_pijul.is_empty() {
    if state.found_repos_dirs_pijul.len() - 1 > *ix {
    let new_ix = *ix + 1;
    *selection = Selection::ProjectPijul(new_ix);
    } else if !state.found_repos_dirs_git.is_empty() {
    *selection = Selection::ProjectGit(0);
    } else {
    *selection = Selection::ProjectPijul(0);
    }
    } else if !state.found_repos_dirs_git.is_empty() {
    if state.found_repos_dirs_git.len() - 1 > *ix {
    let new_ix = *ix + 1;
    *selection = Selection::ProjectGit(new_ix);
    } else {
    *selection = Selection::ProjectGit(0);
    }
    } else {
    *selection = Selection::Input;
    }
    }
    Selection::ProjectGit(ix) => {
    if !state.found_repos_dirs_git.is_empty() {
    if state.found_repos_dirs_git.len() - 1 > *ix {
    let new_ix = *ix + 1;
    *selection = Selection::ProjectGit(new_ix);
    } else if !state.found_repos_dirs_pijul.is_empty() {
    *selection = Selection::ProjectPijul(0);
    } else {
    *selection = Selection::ProjectGit(0);
    }
    } else if !state.found_repos_dirs_pijul.is_empty() {
    if state.found_repos_dirs_pijul.len() - 1 > *ix {
    let new_ix = *ix + 1;
    *selection = Selection::ProjectPijul(new_ix);
    } else {
    *selection = Selection::ProjectPijul(0);
    }
    } else {
    *selection = Selection::Input;
    }
    }
    },
    SelectionDir::Up => match selection {
    Selection::Input => {
    if !state.matched_child_dirs.is_empty() {
    let new_ix = state.matched_child_dirs.len() - 1;
    *selection = Selection::SubDir(new_ix);
    } else if !state.child_dirs.is_empty() {
    let new_ix = state.child_dirs.len() - 1;
    *selection = Selection::SubDir(new_ix);
    }
    }
    Selection::SubDir(ix) => {
    if *ix > 0
    && (!state.matched_child_dirs.is_empty()
    || !state.child_dirs.is_empty())
    {
    let new_ix = *ix - 1;
    *selection = Selection::SubDir(new_ix);
    } else {
    *selection = Selection::Input;
    }
    }
    Selection::ProjectPijul(ix) => {
    if !state.found_repos_dirs_pijul.is_empty() {
    if *ix > 0 {
    let new_ix = *ix - 1;
    *selection = Selection::ProjectPijul(new_ix);
    } else if !state.found_repos_dirs_git.is_empty() {
    *selection = Selection::ProjectGit(
    state.found_repos_dirs_git.len() - 1,
    );
    } else {
    *selection = Selection::ProjectPijul(
    state.found_repos_dirs_pijul.len() - 1,
    );
    }
    } else if !state.found_repos_dirs_git.is_empty() {
    if *ix > 0 {
    let new_ix = *ix - 1;
    *selection = Selection::ProjectGit(new_ix);
    } else {
    *selection = Selection::ProjectGit(
    state.found_repos_dirs_git.len() - 1,
    );
    }
    } else {
    *selection = Selection::Input;
    }
    }
    Selection::ProjectGit(ix) => {
    if !state.found_repos_dirs_git.is_empty() {
    if *ix > 0 {
    let new_ix = *ix - 1;
    *selection = Selection::ProjectGit(new_ix);
    } else if !state.found_repos_dirs_pijul.is_empty() {
    *selection = Selection::ProjectPijul(
    state.found_repos_dirs_pijul.len() - 1,
    );
    } else {
    *selection = Selection::ProjectGit(
    state.found_repos_dirs_git.len() - 1,
    );
    }
    } else if !state.found_repos_dirs_pijul.is_empty() {
    if *ix > 0 {
    let new_ix = *ix - 1;
    *selection = Selection::ProjectPijul(new_ix);
    } else {
    *selection = Selection::ProjectPijul(
    state.found_repos_dirs_pijul.len() - 1,
    );
    }
    } else {
    *selection = Selection::Input;
    }
    }
    },
    SelectionDir::Right | SelectionDir::Left => match selection {
    Selection::Input | Selection::SubDir(_) => {
    if !state.found_repos_dirs_pijul.is_empty() {
    *selection = Selection::ProjectPijul(0);
    } else if !state.found_repos_dirs_git.is_empty() {
    *selection = Selection::ProjectGit(0);
    }
    }
    Selection::ProjectPijul(_) => {
    if !state.matched_child_dirs.is_empty()
    || !state.child_dirs.is_empty()
    {
    *selection = Selection::SubDir(0);
    } else {
    *selection = Selection::Input;
    }
    }
    Selection::ProjectGit(_) => {
    if !state.matched_child_dirs.is_empty()
    || !state.child_dirs.is_empty()
    {
    *selection = Selection::SubDir(0);
    } else {
    *selection = Selection::Input;
    }
    }
    },
    }
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 436
    [10.8304][10.8304:8376]()
    bordered_container_class: <Theme as container::Catalog>::Class<'a>,
    [10.8304]
    [10.8376]
    container_class_bordered: <Theme as container::Catalog>::Class<'a>,
    container_class_bordered_selected: <Theme as container::Catalog>::Class<'a>,
    button_class_normal: <Theme as button::Catalog>::Class<'a>,
    button_class_selected: <Theme as button::Catalog>::Class<'a>,
    scrollable_normal: <Theme as nav_scrollable::Catalog>::Class<'a>,
    scrollable_selected: <Theme as nav_scrollable::Catalog>::Class<'a>,
  • edit in inflorescence_iced_widget/src/dir_picker.rs at line 450
    [10.8579]
    [10.8579]
    <Theme as button::Catalog>::Class<'a>: Copy,
    <Theme as nav_scrollable::Catalog>::Class<'a>: Copy,
  • edit in inflorescence_iced_widget/src/dir_picker.rs at line 467
    [10.9009]
    [10.9009]
    selection,
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 515
    [10.10640][10.10640:10681]()
    .class(bordered_container_class)
    [10.10640]
    [10.10681]
    .class(if matches!(selection, Selection::Input) {
    container_class_bordered_selected
    } else {
    container_class_bordered
    })
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 545
    [10.11683][10.11683:12006]()
    Element::new(button(text(dir)).on_press_with(
    move || {
    Msg::SelectChildDir(
    current_dir.as_path().join(dir),
    )
    },
    )),
    [10.11683]
    [10.12006]
    Element::new(
    button(text(dir))
    .on_press_with(move || {
    Msg::SelectChildDir(
    current_dir.as_path().join(dir),
    )
    })
    .class(
    if let Selection::SubDir(dir_ix) = selection
    && *dir_ix == ix
    {
    button_class_selected
    } else {
    button_class_normal
    },
    ),
    ),
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 584
    [10.12822][10.12822:12903]()
    .on_press_with(|| Msg::SelectChildDir(dir.clone())),
    [10.12822]
    [10.12903]
    .on_press_with(|| Msg::SelectChildDir(dir.clone()))
    .class(
    if let Selection::SubDir(dir_ix) = selection
    && *dir_ix == ix
    {
    button_class_selected
    } else {
    button_class_normal
    },
    ),
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 619
    [10.13429][10.13429:13450]()
    .map(|dir| {
    [10.13429]
    [10.13450]
    .enumerate()
    .map(|(ix, dir)| {
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 623
    [10.13528][10.13528:13597]()
    .on_press_with(|| Msg::SelectRepo(dir.clone())),
    [10.13528]
    [10.13597]
    .on_press_with(|| Msg::SelectRepo(dir.clone()))
    .class(
    if let Selection::ProjectPijul(dir_ix) = selection
    && *dir_ix == ix
    {
    button_class_selected
    } else {
    button_class_normal
    },
    ),
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 635
    [10.13622][10.13622:13677]()
    .chain(found_repos_dirs_git.iter().map(|dir| {
    [10.13622]
    [10.13677]
    .chain(found_repos_dirs_git.iter().enumerate().map(|(ix, dir)| {
  • replacement in inflorescence_iced_widget/src/dir_picker.rs at line 638
    [10.13776][10.13776:13845]()
    .on_press_with(|| Msg::SelectRepo(dir.clone())),
    [10.13776]
    [10.13845]
    .on_press_with(|| Msg::SelectRepo(dir.clone()))
    .class(
    if let Selection::ProjectGit(dir_ix) = selection
    && *dir_ix == ix
    {
    button_class_selected
    } else {
    button_class_normal
    },
    ),
  • edit in inflorescence_iced_widget/src/dir_picker.rs at line 658
    [10.14098]
    [10.14098]
    .class(if matches!(selection, Selection::SubDir(_)) {
    scrollable_selected
    } else {
    scrollable_normal
    })
  • edit in inflorescence_iced_widget/src/dir_picker.rs at line 675
    [10.14453]
    [10.14453]
    .class(
    if matches!(
    selection,
    Selection::ProjectPijul(_)
    | Selection::ProjectGit(_)
    ) {
    scrollable_selected
    } else {
    scrollable_normal
    },
    )
  • edit in inflorescence/src/main.rs at line 309
    [11.19031]
    [11.19031]
    sub.is_blocking = false;
  • replacement in inflorescence/src/main.rs at line 556
    [10.3615548][10.3615548:3615749]()
    view::Msg::Action(msg) => {
    dbg!(msg);
    Task::none()
    }
    view::Msg::UnfilteredSelection(msg) => {
    dbg!(msg);
    Task::none()
    }
    [10.3615548]
    [11.22322]
    view::Msg::Action(msg) => match msg {
    action::FilteredMsg::Selection(msg) => match msg {
    selection::Msg::PressDir(_) => Task::none(),
    inflorescence_model::selection::Msg::AltPressDir(dir) => {
    update_dir_picker_selection(picker, dir);
    Task::none()
    }
    },
    action::FilteredMsg::FocusNext => task::widget_focus_next(),
    action::FilteredMsg::Confirm
    | action::FilteredMsg::Cancel
    | action::FilteredMsg::PostponeRecord
    | action::FilteredMsg::SaveRecord
    | action::FilteredMsg::DiscardRecord
    | action::FilteredMsg::AddUntrackedFile
    | action::FilteredMsg::RmChange
    | action::FilteredMsg::StartRecord
    | action::FilteredMsg::SelectChannel
    | action::FilteredMsg::ForkChannel
    | action::FilteredMsg::RefreshRepo
    | action::FilteredMsg::ShowEntireLog
    | action::FilteredMsg::FocusPrev
    | action::FilteredMsg::ClipboardCopy
    | action::FilteredMsg::ToggleReports
    | action::FilteredMsg::ClipboardCopyReports
    | action::FilteredMsg::ToRecord(_)
    | action::FilteredMsg::ToRecordToggleSelectedFileOrChange
    | action::FilteredMsg::EnterSubMenu(_) => Task::none(),
    },
    view::Msg::UnfilteredSelection(_msg) => Task::none(),
  • edit in inflorescence/src/main.rs at line 628
    [10.3616687]
    [10.3616687]
    fn update_dir_picker_selection(
    picker: &mut dir_picker::State,
    dir: selection::Dir,
    ) {
    let dir = match dir {
    selection::Dir::Down => dir_picker::SelectionDir::Down,
    selection::Dir::Up => dir_picker::SelectionDir::Up,
    selection::Dir::Right => dir_picker::SelectionDir::Right,
    selection::Dir::Left => dir_picker::SelectionDir::Left,
    };
    dir_picker::move_selection(picker, dir);
    }