auto-scroll status selection

[?]
Jul 17, 2025, 10:13 AM
RDRBP7AL74NBFNZSQFTU7VQCMWTGJO5RZWGPCWVVS5WRTXJ77DFAC

Dependencies

  • [2] WT3GA27P add cursor with selection
  • [3] L6KSEFQI move cursor related stuff into its module
  • [4] BFN2VHZS refactor file stuff into sub-mod
  • [5] 3BK22XE5 add a test for hover btn and more refactors
  • [6] WW36JYLR add iced_nav_scrollable widget crate
  • [7] K5YUSV2W auto-scroll to last offset
  • [8] KWTBNTO3 diffs selection and scrolling
  • [9] 5MUEECMJ smooth scrolling nav
  • [10] 3TLPJ57B alt scroll via context and couple fixes
  • [11] KQABQCCZ update rust to 1.88
  • [12] AI3IMKC3 refactor stairs
  • [13] PTWZYQFR use nav-scrollable for repo status
  • [14] 4PNWU55O replace the circular hor navigation
  • [*] 6YZAVBWU Initial commit

Change contents

  • replacement in inflorescence/src/main.rs at line 271
    [9.800][13.4572:4633]()
    state.repo.as_ref().map(|repo| &repo.state),
    [9.800]
    [7.291]
    state.repo.as_mut(),
  • edit in inflorescence/src/cursor.rs at line 1
    [2.26]
    [5.1946]
    use inflorescence_view::app;
  • replacement in inflorescence/src/cursor.rs at line 21
    [9.4353][3.2353:2385](),[4.8608][3.2353:2385](),[3.2353][3.2353:2385]()
    repo: Option<&repo::State>,
    [9.4353]
    [8.20864]
    repo: Option<&mut app::Repo>,
  • replacement in inflorescence/src/cursor.rs at line 60
    [9.5508][9.5508:5644]()
    Dir::Left => select_left(state, repo),
    Dir::Right => select_right(state, repo, files_diffs, log_diffs),
    [9.5508]
    [9.5644]
    Dir::Left => select_left(state, repo.as_deref()),
    Dir::Right => {
    select_right(state, repo.as_deref(), files_diffs, log_diffs)
    }
  • replacement in inflorescence/src/cursor.rs at line 102
    [10.4164][8.21152:21272](),[9.5745][8.21152:21272](),[8.21152][8.21152:21272]()
    Msg::Select(select) => {
    select_exact(select, state, files, repo, files_diffs, log_diffs)
    }
    [10.4164]
    [8.21272]
    Msg::Select(select) => select_exact(
    select,
    state,
    files,
    repo.as_deref(),
    files_diffs,
    log_diffs,
    ),
  • replacement in inflorescence/src/cursor.rs at line 180
    [8.22824][8.22824:22856]()
    repo: Option<&repo::State>,
    [8.22824]
    [9.5746]
    repo: Option<&mut app::Repo>,
  • replacement in inflorescence/src/cursor.rs at line 185
    [8.22942][12.40:82]()
    let Some(repo) = repo.as_ref() else {
    [8.22942]
    [12.82]
    let Some(app::Repo {
    state: repo_state,
    status_nav,
    }) = repo
    else {
  • replacement in inflorescence/src/cursor.rs at line 215
    [12.941][12.941:1068]()
    } else if repo.untracked_files.len().saturating_sub(1) == ix {
    if !repo.changed_files.is_empty() {
    [12.941]
    [12.1068]
    } else if repo_state.untracked_files.len().saturating_sub(1) == ix {
    // Last untracked file selected
    if !repo_state.changed_files.is_empty() {
  • replacement in inflorescence/src/cursor.rs at line 219
    [12.1100][12.1100:1272]()
    let selection = changed_file_selection(repo, ix, files);
    (selection, Task::none())
    } else if !repo.log.is_empty() {
    [12.1100]
    [12.1272]
    let selection =
    changed_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (selection, task)
    } else if !repo_state.log.is_empty() {
  • replacement in inflorescence/src/cursor.rs at line 232
    [12.1304][12.1304:1364]()
    (log_selection(repo, ix), Task::none())
    [12.1304]
    [8.24638]
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Log,
    ),
    status_nav,
    );
    (log_selection(repo_state, ix), task)
  • replacement in inflorescence/src/cursor.rs at line 243
    [12.1397][8.24700:24825](),[8.24700][8.24700:24825]()
    let selection = untracked_file_selection(repo, ix, files);
    (selection, Task::none())
    [12.1397]
    [12.1398]
    let selection =
    untracked_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 257
    [12.1470][12.1470:1587]()
    let selection = untracked_file_selection(repo, ix, files);
    (selection, Task::none())
    [12.1470]
    [12.1587]
    let selection = untracked_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 292
    [12.2406][12.2406:2521]()
    } else if repo.changed_files.len().saturating_sub(1) == ix {
    if !repo.log.is_empty() {
    [12.2406]
    [12.2521]
    } else if repo_state.changed_files.len().saturating_sub(1) == ix {
    // Last changed file selected
    if !repo_state.log.is_empty() {
  • replacement in inflorescence/src/cursor.rs at line 296
    [12.2553][12.2553:2674]()
    (log_selection(repo, ix), Task::none())
    } else if !repo.untracked_files.is_empty() {
    [12.2553]
    [12.2674]
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Log,
    ),
    status_nav,
    );
    (log_selection(repo_state, ix), task)
    } else if !repo_state.untracked_files.is_empty() {
  • replacement in inflorescence/src/cursor.rs at line 307
    [12.2706][12.2706:2831]()
    let selection = untracked_file_selection(repo, ix, files);
    (selection, Task::none())
    [12.2706]
    [8.26467]
    let selection =
    untracked_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 320
    [12.2864][8.26529:26652](),[8.26529][8.26529:26652]()
    let selection = changed_file_selection(repo, ix, files);
    (selection, Task::none())
    [12.2864]
    [12.2865]
    let selection =
    changed_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 334
    [12.2937][12.2937:3052]()
    let selection = changed_file_selection(repo, ix, files);
    (selection, Task::none())
    [12.2937]
    [12.3052]
    let selection = changed_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 383
    [12.4542][12.4542:4613]()
    let log_entry = repo.log.get(log_ix).unwrap();
    [12.4542]
    [3.7109]
    let log_entry = repo_state.log.get(log_ix).unwrap();
  • replacement in inflorescence/src/cursor.rs at line 408
    [12.5418][12.5418:5897](),[12.5897][8.29597:29634](),[8.29597][8.29597:29634](),[8.29634][12.5898:5942](),[12.5942][8.29687:29743](),[8.29687][8.29687:29743](),[8.29743][12.5943:5973]()
    let selection =
    if repo.log.len().saturating_sub(1) == log_ix {
    if !repo.untracked_files.is_empty() {
    let ix = 0;
    untracked_file_selection(repo, ix, files)
    } else if !repo.changed_files.is_empty() {
    let ix = 0;
    changed_file_selection(repo, ix, files)
    } else {
    let ix = 0;
    log_selection(repo, ix)
    }
    [12.5418]
    [12.5973]
    if repo_state.log.len().saturating_sub(1) == log_ix {
    // Last log selected
    if !repo_state.untracked_files.is_empty() {
    let ix = 0;
    let task =
    iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (
    untracked_file_selection(repo_state, ix, files),
    task,
    )
    } else if !repo_state.changed_files.is_empty() {
    let ix = 0;
    let task =
    iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (
    changed_file_selection(repo_state, ix, files),
    task,
    )
  • replacement in inflorescence/src/cursor.rs at line 441
    [12.6006][12.6006:6134](),[12.6134][8.30139:30185](),[8.30139][8.30139:30185]()
    let ix = log_ix + 1;
    log_selection(repo, ix)
    };
    (selection, Task::none())
    [12.6006]
    [12.6135]
    let ix = 0;
    let task =
    iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Log,
    ),
    status_nav,
    );
    (log_selection(repo_state, ix), task)
    }
    } else {
    let ix = log_ix + 1;
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Log,
    ),
    status_nav,
    );
    (log_selection(repo_state, ix), task)
    }
  • replacement in inflorescence/src/cursor.rs at line 470
    [12.6232][12.6232:6306]()
    let (selection, task) = if !repo.untracked_files.is_empty() {
    [12.6232]
    [12.6306]
    if !repo_state.untracked_files.is_empty() {
  • replacement in inflorescence/src/cursor.rs at line 472
    [12.6334][12.6334:6512]()
    let selection = Some(untracked_file_selection(repo, ix, files));
    (selection, Task::none())
    } else if !repo.changed_files.is_empty() {
    [12.6334]
    [12.6512]
    let selection =
    Some(untracked_file_selection(repo_state, ix, files));
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (selection, task)
    } else if !repo_state.changed_files.is_empty() {
  • replacement in inflorescence/src/cursor.rs at line 485
    [12.6540][12.6540:6856]()
    let selection = Some(changed_file_selection(repo, ix, files));
    (selection, Task::none())
    } else if !repo.log.is_empty() {
    let ix = repo.log.len() - 1;
    let selection = log_selection(repo, ix);
    (Some(selection), Task::none())
    [12.6540]
    [12.6856]
    let selection =
    Some(changed_file_selection(repo_state, ix, files));
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (selection, task)
    } else if !repo_state.log.is_empty() {
    let ix = repo_state.log.len() - 1;
    let selection = log_selection(repo_state, ix);
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(repo_state, ix, StatusSectionKind::Log),
    status_nav,
    );
    (Some(selection), task)
  • replacement in inflorescence/src/cursor.rs at line 506
    [12.6914][12.6914:6959]()
    };
    (selection, task)
    [12.6914]
    [12.6959]
    }
  • replacement in inflorescence/src/cursor.rs at line 516
    [8.30946][8.30946:30978]()
    repo: Option<&repo::State>,
    [8.30946]
    [9.6447]
    repo: Option<&mut app::Repo>,
  • replacement in inflorescence/src/cursor.rs at line 521
    [8.31064][12.7019:7061]()
    let Some(repo) = repo.as_ref() else {
    [8.31064]
    [12.7061]
    let Some(app::Repo {
    state: repo_state,
    status_nav,
    }) = repo
    else {
  • replacement in inflorescence/src/cursor.rs at line 552
    [12.7950][12.7950:8342]()
    if !repo.log.is_empty() {
    let ix = repo.log.len() - 1;
    (log_selection(repo, ix), Task::none())
    } else if !repo.changed_files.is_empty() {
    let ix = repo.changed_files.len() - 1;
    let selection = changed_file_selection(repo, ix, files);
    (selection, Task::none())
    [12.7950]
    [8.32731]
    // First untracked file selected
    if !repo_state.log.is_empty() {
    let ix = repo_state.log.len() - 1;
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Log,
    ),
    status_nav,
    );
    (log_selection(repo_state, ix), task)
    } else if !repo_state.changed_files.is_empty() {
    let ix = repo_state.changed_files.len() - 1;
    let selection =
    changed_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 578
    [8.32756][12.8343:8404](),[12.8404][8.32793:32918](),[8.32793][8.32793:32918]()
    let ix = repo.untracked_files.len() - 1;
    let selection = untracked_file_selection(repo, ix, files);
    (selection, Task::none())
    [8.32756]
    [12.8405]
    let ix = repo_state.untracked_files.len() - 1;
    let selection =
    untracked_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 593
    [12.8477][12.8477:8594]()
    let selection = untracked_file_selection(repo, ix, files);
    (selection, Task::none())
    [12.8477]
    [12.8594]
    let selection = untracked_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 629
    [12.9443][12.9443:9778]()
    let selection = if !repo.untracked_files.is_empty() {
    let ix = repo.untracked_files.len() - 1;
    untracked_file_selection(repo, ix, files)
    } else if !repo.log.is_empty() {
    let ix = repo.log.len() - 1;
    log_selection(repo, ix)
    [12.9443]
    [8.34478]
    // First changed file selected
    if !repo_state.untracked_files.is_empty() {
    let ix = repo_state.untracked_files.len() - 1;
    let selection =
    untracked_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (selection, task)
    } else if !repo_state.log.is_empty() {
    let ix = repo_state.log.len() - 1;
    let selection = log_selection(repo_state, ix);
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Log,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 656
    [8.34503][12.9779:9898](),[12.9898][8.34663:34682](),[8.34663][8.34663:34682](),[8.34682][12.9899:9941]()
    let ix = repo.changed_files.len() - 1;
    changed_file_selection(repo, ix, files)
    };
    (selection, Task::none())
    [8.34503]
    [12.9941]
    let ix = repo_state.changed_files.len() - 1;
    let selection =
    changed_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (selection, task)
    }
  • replacement in inflorescence/src/cursor.rs at line 671
    [12.9995][12.9995:10110]()
    let selection = changed_file_selection(repo, ix, files);
    (selection, Task::none())
    [12.9995]
    [12.10110]
    let selection = changed_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 720
    [12.11562][12.11562:11633]()
    let log_entry = repo.log.get(log_ix).unwrap();
    [12.11562]
    [8.36562]
    let log_entry = repo_state.log.get(log_ix).unwrap();
  • replacement in inflorescence/src/cursor.rs at line 741
    [12.12261][12.12261:12717]()
    let selection = if 0 == log_ix {
    if !repo.changed_files.is_empty() {
    let ix = repo.changed_files.len() - 1;
    changed_file_selection(repo, ix, files)
    } else if !repo.untracked_files.is_empty() {
    let ix = repo.untracked_files.len() - 1;
    untracked_file_selection(repo, ix, files)
    [12.12261]
    [12.12717]
    if 0 == log_ix {
    // First log selected
    if !repo_state.changed_files.is_empty() {
    let ix = repo_state.changed_files.len() - 1;
    let selection =
    changed_file_selection(repo_state, ix, files);
    let task =
    iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Changed,
    ),
    status_nav,
    );
    (selection, task)
    } else if !repo_state.untracked_files.is_empty() {
    let ix = repo_state.untracked_files.len() - 1;
    let selection =
    untracked_file_selection(repo_state, ix, files);
    let task =
    iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 772
    [12.12750][12.12750:12859]()
    let ix = repo.log.len() - 1;
    log_selection(repo, ix)
    [12.12750]
    [12.12859]
    let ix = repo_state.log.len() - 1;
    let selection = log_selection(repo_state, ix);
    let task =
    iced_nav_scrollable::scroll_down_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Log,
    ),
    status_nav,
    );
    (selection, task)
  • replacement in inflorescence/src/cursor.rs at line 787
    [12.12959][12.12959:13076]()
    log_selection(repo, ix)
    };
    (selection, Task::none())
    [12.12959]
    [12.13076]
    let selection = log_selection(repo_state, ix);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Log,
    ),
    status_nav,
    );
    (selection, task)
    }
  • replacement in inflorescence/src/cursor.rs at line 803
    [12.13173][12.13173:13853]()
    let (selection, task) = if !repo.log.is_empty() {
    let ix = repo.log.len() - 1;
    let selection = log_selection(repo, ix);
    (Some(selection), Task::none())
    } else if !repo.changed_files.is_empty() {
    let ix = repo.changed_files.len() - 1;
    let selection = changed_file_selection(repo, ix, files);
    (Some(selection), Task::none())
    } else if !repo.untracked_files.is_empty() {
    let ix = repo.untracked_files.len() - 1;
    let selection = untracked_file_selection(repo, ix, files);
    (Some(selection), Task::none())
    [12.13173]
    [12.13853]
    if !repo_state.log.is_empty() {
    let ix = repo_state.log.len() - 1;
    let selection = log_selection(repo_state, ix);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(repo_state, ix, StatusSectionKind::Log),
    status_nav,
    );
    (Some(selection), task)
    } else if !repo_state.changed_files.is_empty() {
    let ix = repo_state.changed_files.len() - 1;
    let selection = changed_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (Some(selection), task)
    } else if !repo_state.untracked_files.is_empty() {
    let ix = repo_state.untracked_files.len() - 1;
    let selection = untracked_file_selection(repo_state, ix, files);
    let task = iced_nav_scrollable::scroll_up_to_section(
    status_section_ix(
    repo_state,
    ix,
    StatusSectionKind::Untracked,
    ),
    status_nav,
    );
    (Some(selection), task)
  • replacement in inflorescence/src/cursor.rs at line 837
    [12.13911][12.13911:13956]()
    };
    (selection, task)
    [12.13911]
    [12.13956]
    }
  • replacement in inflorescence/src/cursor.rs at line 977
    [8.38748][8.38748:38826]()
    fn select_left<M>(state: &mut State, repo: Option<&repo::State>) -> Task<M> {
    [8.38748]
    [12.14017]
    fn select_left<M>(state: &mut State, repo: Option<&app::Repo>) -> Task<M> {
  • replacement in inflorescence/src/cursor.rs at line 1042
    [8.40684][8.40684:40716]()
    repo: Option<&repo::State>,
    [8.40684]
    [8.40716]
    repo: Option<&app::Repo>,
  • replacement in inflorescence/src/cursor.rs at line 1046
    [8.40802][12.15628:15670]()
    let Some(repo) = repo.as_ref() else {
    [8.40802]
    [12.15670]
    let Some(app::Repo {
    state: repo_state,
    status_nav: _,
    }) = repo.as_ref()
    else {
  • replacement in inflorescence/src/cursor.rs at line 1157
    [8.45142][8.45142:45201]()
    let log_entry = repo.log.get(ix).unwrap();
    [8.45142]
    [8.45201]
    let log_entry = repo_state.log.get(ix).unwrap();
  • replacement in inflorescence/src/cursor.rs at line 1260
    [8.46155][8.46155:46187]()
    repo: Option<&repo::State>,
    [8.46155]
    [8.46187]
    repo: Option<&app::Repo>,
  • edit in inflorescence/src/cursor.rs at line 1264
    [8.46273]
    [8.46273]
    let Some(app::Repo {
    state: repo_state,
    status_nav: _,
    }) = repo
    else {
    return Task::none();
    };
  • replacement in inflorescence/src/cursor.rs at line 1307
    [8.47695][8.47695:47805]()
    if let Some(diffs) =
    repo.as_ref().and_then(|repo| repo.changed_files.get(&path))
    [8.47695]
    [11.784]
    if let Some(diffs) = repo_state.changed_files.get(&path)
  • edit in inflorescence/src/cursor.rs at line 1387
    [8.50646]
    [3.27245]
    }
    enum StatusSectionKind {
    Untracked,
    Changed,
    Log,
  • edit in inflorescence/src/cursor.rs at line 1394
    [3.27247]
    fn status_section_ix(
    repo: &repo::State,
    ix: usize,
    kind: StatusSectionKind,
    ) -> usize {
    // The literals are for section headers
    match kind {
    StatusSectionKind::Untracked => 1 + ix,
    StatusSectionKind::Changed => 2 + repo.untracked_files.len() + ix,
    StatusSectionKind::Log => {
    3 + repo.untracked_files.len() + repo.changed_files.len() + ix
    }
    }
    }
  • edit in iced_nav_scrollable/src/lib.rs at line 259
    [8.51177][8.51177:51180](),[8.51180][9.10818:10853]()
    }
    enum Delay {
    Start,
    Apply,
  • edit in iced_nav_scrollable/src/lib.rs at line 452
    [10.9205]
    [6.4555]
    }
    pub fn scroll_down_to_section<M>(
    section_ix: usize,
    nav: &mut NavScrollable,
    ) -> Task<M> {
    // If the given section is below the bottom frame, scroll down to align
    // their bottom edges
    let (offset, height) = nav
    .section_offsets
    .iter()
    .zip(nav.section_heights.values())
    .nth(section_ix)
    .unwrap();
    if let Some(y) = {
    // dbg!(ix, offset, height, nav.offset);
    let bottom_frame =
    saturating_sub(nav.offset + nav.height, VISIBLE_CONTEXT_HEIGHT);
    let top_frame = nav.offset + VISIBLE_CONTEXT_HEIGHT;
    if offset + height > bottom_frame {
    Some(saturating_sub(
    offset + height + VISIBLE_CONTEXT_HEIGHT,
    nav.height,
    ))
    } else if *offset < top_frame {
    Some(saturating_sub(*offset, VISIBLE_CONTEXT_HEIGHT))
    } else {
    None
    }
    } {
    return task::scroll_to(
    nav.id.clone(),
    scrollable::AbsoluteOffset { x: 0.0, y },
    );
    }
    Task::none()
  • edit in iced_nav_scrollable/src/lib.rs at line 490
    [6.4558]
    [6.4558]
    pub fn scroll_up_to_section<M>(
    section_ix: usize,
    nav: &mut NavScrollable,
    ) -> Task<M> {
    // If the given section is above the top frame, scroll up to align their top
    // edges
    let (offset, height) = nav
    .section_offsets
    .iter()
    .zip(nav.section_heights.values())
    .nth(section_ix)
    .unwrap();
    if let Some(y) = {
    // dbg!(ix, offset, height, nav.offset);
    let bottom_frame =
    saturating_sub(nav.offset + nav.height, VISIBLE_CONTEXT_HEIGHT);
    let top_frame = nav.offset + VISIBLE_CONTEXT_HEIGHT;
    if *offset < top_frame {
    Some(saturating_sub(*offset, VISIBLE_CONTEXT_HEIGHT))
    } else if offset + height > bottom_frame {
    Some(saturating_sub(
    offset + height + VISIBLE_CONTEXT_HEIGHT,
    nav.height,
    ))
    } else {
    None
    }
    } {
    return task::scroll_to(
    nav.id.clone(),
    scrollable::AbsoluteOffset { x: 0.0, y },
    );
    }
    Task::none()
    }
    enum Delay {
    Start,
    Apply,
    }