add undecoded diff view, improve decoded view style

[?]
May 7, 2025, 7:50 AM
DCSUCH6RRRQU4TQYO3K3HRC7SXAIBYP5R3ZOWAWS2LOXWNHEJM6AC

Dependencies

Change contents

  • replacement in crates/inflorescence/src/diff.rs at line 6
    [2.5071][2.5071:5137]()
    use iced::widget::{column, row, text};
    use iced::{Element, Font};
    [2.5071]
    [5.553]
    use iced::widget::{column, container, row, text};
    use iced::{Background, Color, Element, Font, Length};
  • replacement in crates/inflorescence/src/diff.rs at line 12
    [2.5154][4.1672:1744]()
    #[allow(dead_code)] // TODO rm once `view_decoded` is fully implemented
    [2.5154]
    [4.1744]
    // TODO: maybe use theme
    const DELETED_BG_COLOR: Color = Color::from_rgba8(190, 37, 40, 0.15);
    const ADDED_BG_COLOR: Color = Color::from_rgba8(47, 148, 11, 0.15);
  • edit in crates/inflorescence/src/diff.rs at line 90
    [4.2845][4.2845:2915]()
    #[allow(dead_code)] // TODO rm once `view_undecodable` is implemented
  • edit in crates/inflorescence/src/diff.rs at line 119
    [4.3717][4.3717:3787]()
    #[allow(dead_code)] // TODO rm once `view_undecodable` is implemented
  • edit in crates/inflorescence/src/diff.rs at line 390
    [4.8752]
    [3.28244]
    let DecodedFile {
    combined,
    diffs_without_contents,
    } = file;
    let line_num_digits = combined.max_line_num.to_string().len();
  • replacement in crates/inflorescence/src/diff.rs at line 399
    [2.10916][3.28319:28438]()
    let line_num_digits = file.combined.max_line_num.to_string().len();
    let sections_view = file
    .combined
    [2.10916]
    [2.11010]
    let sections_view = combined
  • edit in crates/inflorescence/src/diff.rs at line 404
    [2.11131]
    [2.11131]
    // TODO avoid collecting by placing these into `column` in here
  • replacement in crates/inflorescence/src/diff.rs at line 410
    [2.11297][2.11297:11432]()
    el(code(" ")),
    el(code(format!(
    "{:width$} ",
    [2.11297]
    [2.11432]
    el(code_view(" ")),
    el(line_num_view(
  • replacement in crates/inflorescence/src/diff.rs at line 413
    [2.11483][2.11483:11624]()
    width = line_num_digits
    ))),
    el(code(line.clone())),
    [2.11483]
    [2.11624]
    line_num_digits,
    )),
    el(code_view(line.clone()).width(Length::Fill)),
  • replacement in crates/inflorescence/src/diff.rs at line 428
    [2.11985][2.11985:12153]()
    el(row([
    el(code("- ")),
    el(code(format!(
    "{:width$} ",
    [2.11985]
    [2.12153]
    el(container(row([
    el(code_view("- ")),
    el(line_num_view(
  • replacement in crates/inflorescence/src/diff.rs at line 432
    [2.12204][2.12204:12345]()
    width = line_num_digits
    ))),
    el(code(line.clone())),
    [2.12204]
    [2.12345]
    line_num_digits,
    )),
    el(code_view(line.clone()).width(Length::Fill)),
  • edit in crates/inflorescence/src/diff.rs at line 436
    [2.12373]
    [2.12373]
    .style(|_theme| {
    container::background(Background::from(
    DELETED_BG_COLOR,
    ))
    }))
  • replacement in crates/inflorescence/src/diff.rs at line 443
    [2.12467][2.12467:12635]()
    el(row([
    el(code("+ ")),
    el(code(format!(
    "{:width$} ",
    [2.12467]
    [2.12635]
    el(container(row([
    el(code_view("+ ")),
    el(line_num_view(
  • replacement in crates/inflorescence/src/diff.rs at line 447
    [2.12686][2.12686:12827]()
    width = line_num_digits
    ))),
    el(code(line.clone())),
    [2.12686]
    [2.12827]
    line_num_digits,
    )),
    el(code_view(line.clone()).width(Length::Fill)),
  • edit in crates/inflorescence/src/diff.rs at line 451
    [2.12855]
    [2.12855]
    .style(|_theme| {
    container::background(Background::from(
    ADDED_BG_COLOR,
    ))
    }))
  • replacement in crates/inflorescence/src/diff.rs at line 464
    [2.13042][2.13042:13072]()
    el(column(sections_view))
    [2.13042]
    [3.28439]
    if diffs_without_contents.is_empty() {
    el(column(sections_view))
    } else {
    let diffs_without_contents_view = diffs_without_contents
    .iter()
    .map(view_diff_without_contents);
    el(column([
    el(column(diffs_without_contents_view)),
    el(column(sections_view)),
    ])
    .spacing(10))
    }
  • replacement in crates/inflorescence/src/diff.rs at line 484
    [4.8806][3.28549:28618](),[3.28549][3.28549:28618]()
    // TODO implement proper view
    el(code(format!("{file:#?}")))
    [4.8806]
    [2.13072]
    let UndecodableFile {
    diffs_with_contents,
    diffs_without_contents,
    } = file;
    let diffs = diffs_with_contents
    .iter()
    .map(view_diff_with_contents)
    .chain(
    diffs_without_contents
    .iter()
    .map(view_diff_without_contents),
    );
    el(column(diffs))
    }
    /// View diffs without context (the file contents)
    fn view_diff_with_contents(diff: &DiffWithContents) -> Element<'_, Action> {
    match diff {
    DiffWithContents::Add => el(text("Added")),
    DiffWithContents::Edit {
    line,
    deleted,
    contents,
    } => {
    let line_num = *line;
    let lines = contents_to_lines(contents);
    let max_line_num = line_num + lines.len();
    let line_num_digits = max_line_num.to_string().len();
    let lines_view = lines.iter().enumerate().map(|(ix, line)| {
    el(row([
    el(code_view(if *deleted { "- " } else { "+ " })),
    el(line_num_view(line_num + ix, line_num_digits)),
    el(code_view(line.clone()).width(Length::Fill)),
    ]))
    });
    el(column(lines_view))
    }
    DiffWithContents::Replacement {
    line,
    change_contents,
    replacement_contents,
    } => {
    let line_num = *line;
    let change_lines = contents_to_lines(change_contents);
    let replacement_lines = contents_to_lines(replacement_contents);
    let max_line_num = line_num
    + cmp::max(change_lines.len(), replacement_lines.len());
    let line_num_digits = max_line_num.to_string().len();
    // TODO: re-use with `view_decoded`
    let lines_view = change_lines
    .iter()
    .enumerate()
    .map(|(ix, line)| {
    el(container(row([
    el(code_view("- ")),
    el(line_num_view(line_num + ix, line_num_digits)),
    el(code_view(line.clone()).width(Length::Fill)),
    ]))
    .style(|_theme| {
    container::background(Background::from(
    DELETED_BG_COLOR,
    ))
    }))
    })
    .chain(replacement_lines.iter().enumerate().map(
    |(ix, line)| {
    el(container(row([
    el(code_view("+ ")),
    el(line_num_view(line_num + ix, line_num_digits)),
    el(code_view(line.clone()).width(Length::Fill)),
    ]))
    .style(|_theme| {
    container::background(Background::from(
    ADDED_BG_COLOR,
    ))
    }))
    },
    ));
    el(column(lines_view))
    }
    DiffWithContents::Del => el(text("Deleted")),
    DiffWithContents::Undel => el(text("Revived")),
    }
  • replacement in crates/inflorescence/src/diff.rs at line 573
    [2.13075][2.13075:13149]()
    fn code<'a>(txt: impl text::IntoFragment<'a>) -> iced::widget::Text<'a> {
    [2.13075]
    [2.13149]
    /// View diffs without context (the file contents)
    fn view_diff_without_contents(
    diff: &DiffWithoutContents,
    ) -> Element<'_, Action> {
    match diff {
    DiffWithoutContents::Move => todo!(),
    DiffWithoutContents::SolveNameConflict => todo!(),
    DiffWithoutContents::UnsolveNameConflict => todo!(),
    DiffWithoutContents::SolveOrderConflict => todo!(),
    DiffWithoutContents::UnsolveOrderConflict => todo!(),
    DiffWithoutContents::ResurrectZombines => todo!(),
    DiffWithoutContents::AddRoot => todo!(),
    DiffWithoutContents::DelRoot => todo!(),
    DiffWithoutContents::Edit {
    line,
    deleted,
    contents,
    } => todo!(),
    DiffWithoutContents::Replacement {
    line,
    change_contents,
    replacement_contents,
    } => todo!(),
    }
    }
    fn code_view<'a>(txt: impl text::IntoFragment<'a>) -> iced::widget::Text<'a> {
  • edit in crates/inflorescence/src/diff.rs at line 602
    [2.13187]
    fn line_num_view<'a>(num: usize, digits: usize) -> iced::widget::Text<'a> {
    // Fill the string to the number of digits
    let txt = format!("{:width$} ", num, width = digits);
    code_view(txt).font(Font::MONOSPACE).style(move |theme| {
    let palette = theme.extended_palette();
    text::Style {
    color: Some(palette.background.base.text.scale_alpha(0.61)),
    }
    })
    }