fix mouse selection

[?]
Jul 25, 2025, 8:40 AM
NZD56PVBVHARAQD7JNXE2F3DRT4S2NNRDHVVJTKTQK474LDMVIXQC

Dependencies

  • [2] L6KSEFQI move cursor related stuff into its module
  • [3] KWTBNTO3 diffs selection and scrolling
  • [4] KQABQCCZ update rust to 1.88
  • [5] RDRBP7AL auto-scroll status selection
  • [6] UR4J677R nav for log changes and refactors
  • [7] JZXYSIYD channel selection!
  • [8] VJNWIGSX clippy
  • [9] YKHE3XMW refactor diffs handling
  • [10] 4PNWU55O replace the circular hor navigation
  • [11] 5MUEECMJ smooth scrolling nav
  • [12] K63JN6CR refactor out non-view field from cursor
  • [*] WT3GA27P add cursor with selection

Change contents

  • replacement in inflorescence/src/selection.rs at line 1252
    [3.46063][3.46063:46083]()
    fn select_exact<M>(
    [3.46063]
    [3.46083]
    fn select_exact(
  • replacement in inflorescence/src/selection.rs at line 1257
    [5.17970][3.46187:46273](),[3.46187][3.46187:46273]()
    files_diffs: &diff::FilesState,
    logs: &diff::LogFilesAndState,
    ) -> Task<M> {
    [5.17970]
    [5.17971]
    files_diffs: &mut diff::FilesState,
    logs: &mut diff::LogFilesAndState,
    ) -> Task<crate::Msg> {
  • replacement in inflorescence/src/selection.rs at line 1262
    [5.18023][5.18023:18046]()
    status_nav: _,
    [5.18023]
    [7.17192]
    status_nav,
  • replacement in inflorescence/src/selection.rs at line 1281
    [3.46885][4.610:655]()
    let task = if is_diff_scrollable
    [3.46885]
    [6.43301]
    let scroll_task = if is_diff_scrollable
  • replacement in inflorescence/src/selection.rs at line 1291
    [3.47252][3.47252:47266](),[3.47266][7.17223:17268](),[7.17268][3.47314:47462](),[3.47314][3.47314:47462]()
    (
    Some(Status::UntrackedFile {
    ix,
    path,
    diff_selected: false,
    }),
    task,
    )
    [3.47252]
    [3.47462]
    let (selection, selection_task) = untracked_file_selection(
    repo_state,
    status_nav,
    ix,
    files,
    files_diffs,
    VertDir::Down,
    );
    (Some(selection), Task::batch([scroll_task, selection_task]))
  • replacement in inflorescence/src/selection.rs at line 1316
    [3.48246][4.902:947]()
    let task = if is_diff_scrollable
    [3.48246]
    [6.43529]
    let scroll_task = if is_diff_scrollable
  • replacement in inflorescence/src/selection.rs at line 1326
    [3.48613][3.48613:48627](),[3.48627][7.17269:17312](),[7.17312][3.48673:48821](),[3.48673][3.48673:48821]()
    (
    Some(Status::ChangedFile {
    ix,
    path,
    diff_selected: false,
    }),
    task,
    )
    [3.48613]
    [2.23134]
    let (selection, selection_task) = changed_file_selection(
    repo_state,
    status_nav,
    ix,
    files,
    files_diffs,
    VertDir::Down,
    );
    (Some(selection), Task::batch([scroll_task, selection_task]))
    }
    Select::LogChange {
    ix,
    hash: _,
    message: _,
    } => {
    let (selection, task) =
    log_selection(status_nav, logs, repo_state, ix, VertDir::Down);
    (Some(selection), task)
  • edit in inflorescence/src/selection.rs at line 1346
    [2.23144][3.48822:48875](),[3.48875][7.17313:17350](),[7.17350][3.48915:49063](),[3.48915][3.48915:49063]()
    Select::LogChange { ix, hash, message } => (
    Some(Status::LogChange {
    ix,
    hash,
    message,
    file: None,
    }),
    Task::none(),
    ),
  • replacement in inflorescence/src/selection.rs at line 1349
    [7.17437][3.49207:49242](),[3.49207][3.49207:49242]()
    ix: change_ix,
    [7.17437]
    [3.49242]
    ix: log_ix,
  • edit in inflorescence/src/selection.rs at line 1354
    [3.49350]
    [3.49350]
    let log_entry = repo_state.log.get(log_ix).unwrap();
  • replacement in inflorescence/src/selection.rs at line 1361
    [3.49684][4.1076:1124]()
    let task = if diff_selected
    [3.49684]
    [6.43757]
    let scroll_task = if diff_selected
  • replacement in inflorescence/src/selection.rs at line 1371
    [3.50249][3.50249:50441](),[3.50441][2.24714:24736](),[2.24714][2.24714:24736](),[2.24736][7.17438:17487](),[7.17487][3.50442:50485](),[2.24788][3.50442:50485](),[3.50485][2.24820:24891](),[2.24820][2.24820:24891](),[2.24891][3.50486:50532](),[3.50532][2.24972:25052](),[2.24972][2.24972:25052]()
    let file = LogChangeFileSelection {
    ix: file_ix,
    path,
    diff_selected: false,
    };
    (
    Some(Status::LogChange {
    ix: change_ix,
    hash,
    message,
    file: Some(file),
    }),
    task,
    )
    [3.50249]
    [2.26122]
    let (file, selection_task) =
    log_file_selection(logs, log_entry, hash, file_ix);
    let selection = Some(Status::LogChange {
    ix: log_ix,
    hash,
    message,
    file: Some(file),
    });
    (selection, Task::batch([selection_task, scroll_task]))
  • replacement in inflorescence/src/selection.rs at line 1595
    [6.49936][6.49936:50536]()
    let nav_task = match (logs.diffs.get(&id_hash), logs.diffs_nav.as_ref()) {
    (Some(diff), Some((nav_id_hash, _nav))) if *nav_id_hash != id_hash => {
    let contents_count = diff::contents_count(&diff.file);
    // Init log change diff nav
    let (nav, tasks) =
    iced_nav_scrollable::init(contents_count, HashSet::new());
    logs.diffs_nav = Some((id_hash, nav));
    tasks.map(move |msg| {
    crate::Msg::View(app::Msg::LogChangeFileDiff {
    id_hash,
    msg: diff::Msg::DiffNav(msg),
    [6.49936]
    [6.50536]
    let nav_task = match logs.diffs.get(&id_hash) {
    Some(diff) => {
    let needs_new_nav = logs.diffs_nav.is_none()
    || logs
    .diffs_nav
    .as_ref()
    .map(|(nav_id_hash, _nav)| *nav_id_hash != id_hash)
    .unwrap_or_default();
    if needs_new_nav {
    let contents_count = diff::contents_count(&diff.file);
    // Init log change diff nav
    let (nav, tasks) =
    iced_nav_scrollable::init(contents_count, HashSet::new());
    logs.diffs_nav = Some((id_hash, nav));
    tasks.map(move |msg| {
    crate::Msg::View(app::Msg::LogChangeFileDiff {
    id_hash,
    msg: diff::Msg::DiffNav(msg),
    })
  • replacement in inflorescence/src/selection.rs at line 1615
    [6.50555][6.50555:50570]()
    })
    [6.50555]
    [6.50570]
    } else {
    Task::none()
    }
  • replacement in inflorescence/src/selection.rs at line 1619
    [6.50580][6.50580:50595]()
    _ => {
    [6.50580]
    [6.50595]
    None => {