mirror of
https://github.com/gitui-org/gitui
synced 2026-05-24 09:28:21 +00:00
visualize empty line in diff better (closes #1359)
This commit is contained in:
parent
9eb8d470a4
commit
6ec647710d
4 changed files with 55 additions and 42 deletions
|
|
@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
**visualize empty lines in diff better**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### Breaking Changes
|
### Breaking Changes
|
||||||
* Do you use a custom theme?
|
* Do you use a custom theme?
|
||||||
|
|
||||||
|
|
@ -22,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
* switched from textwrap to bwrap for text wrapping [[@TheBlackSheep3](https://github.com/TheBlackSheep3/)] ([#1762](https://github.com/extrawurst/gitui/issues/1762))
|
* switched from textwrap to bwrap for text wrapping [[@TheBlackSheep3](https://github.com/TheBlackSheep3/)] ([#1762](https://github.com/extrawurst/gitui/issues/1762))
|
||||||
* more logging diagnostics when a repo cannot be opened
|
* more logging diagnostics when a repo cannot be opened
|
||||||
* added to [anaconda](https://anaconda.org/conda-forge/gitui) [[@TheBlackSheep3](https://github.com/TheBlackSheep3/)] ([#1626](https://github.com/extrawurst/gitui/issues/1626))
|
* added to [anaconda](https://anaconda.org/conda-forge/gitui) [[@TheBlackSheep3](https://github.com/TheBlackSheep3/)] ([#1626](https://github.com/extrawurst/gitui/issues/1626))
|
||||||
|
* visualize empty line substituted with content in diff better ([#1359](https://github.com/extrawurst/gitui/issues/1359))
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
* fix commit dialog char count for multibyte characters ([#1726](https://github.com/extrawurst/gitui/issues/1726))
|
* fix commit dialog char count for multibyte characters ([#1726](https://github.com/extrawurst/gitui/issues/1726))
|
||||||
|
|
|
||||||
BIN
assets/diff-empty-line.png
Normal file
BIN
assets/diff-empty-line.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 220 KiB |
|
|
@ -335,47 +335,12 @@ impl DiffComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_text(&self, width: u16, height: u16) -> Vec<Line> {
|
fn get_text(&self, width: u16, height: u16) -> Vec<Line> {
|
||||||
let mut res: Vec<Line> = Vec::new();
|
|
||||||
if let Some(diff) = &self.diff {
|
if let Some(diff) = &self.diff {
|
||||||
if diff.hunks.is_empty() {
|
return if diff.hunks.is_empty() {
|
||||||
let is_positive = diff.size_delta >= 0;
|
self.get_text_binary(diff)
|
||||||
let delta_byte_size =
|
|
||||||
ByteSize::b(diff.size_delta.unsigned_abs());
|
|
||||||
let sign = if is_positive { "+" } else { "-" };
|
|
||||||
res.extend(vec![Line::from(vec![
|
|
||||||
Span::raw(Cow::from("size: ")),
|
|
||||||
Span::styled(
|
|
||||||
Cow::from(format!(
|
|
||||||
"{}",
|
|
||||||
ByteSize::b(diff.sizes.0)
|
|
||||||
)),
|
|
||||||
self.theme.text(false, false),
|
|
||||||
),
|
|
||||||
Span::raw(Cow::from(" -> ")),
|
|
||||||
Span::styled(
|
|
||||||
Cow::from(format!(
|
|
||||||
"{}",
|
|
||||||
ByteSize::b(diff.sizes.1)
|
|
||||||
)),
|
|
||||||
self.theme.text(false, false),
|
|
||||||
),
|
|
||||||
Span::raw(Cow::from(" (")),
|
|
||||||
Span::styled(
|
|
||||||
Cow::from(format!(
|
|
||||||
"{sign}{delta_byte_size:}"
|
|
||||||
)),
|
|
||||||
self.theme.diff_line(
|
|
||||||
if is_positive {
|
|
||||||
DiffLineType::Add
|
|
||||||
} else {
|
|
||||||
DiffLineType::Delete
|
|
||||||
},
|
|
||||||
false,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Span::raw(Cow::from(")")),
|
|
||||||
])]);
|
|
||||||
} else {
|
} else {
|
||||||
|
let mut res: Vec<Line> = Vec::new();
|
||||||
|
|
||||||
let min = self.vertical_scroll.get_top();
|
let min = self.vertical_scroll.get_top();
|
||||||
let max = min + height as usize;
|
let max = min + height as usize;
|
||||||
|
|
||||||
|
|
@ -426,9 +391,44 @@ impl DiffComponent {
|
||||||
line_cursor += hunk_len;
|
line_cursor += hunk_len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
res
|
||||||
|
};
|
||||||
}
|
}
|
||||||
res
|
|
||||||
|
vec![]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_text_binary(&self, diff: &FileDiff) -> Vec<Line> {
|
||||||
|
let is_positive = diff.size_delta >= 0;
|
||||||
|
let delta_byte_size =
|
||||||
|
ByteSize::b(diff.size_delta.unsigned_abs());
|
||||||
|
let sign = if is_positive { "+" } else { "-" };
|
||||||
|
vec![Line::from(vec![
|
||||||
|
Span::raw(Cow::from("size: ")),
|
||||||
|
Span::styled(
|
||||||
|
Cow::from(format!("{}", ByteSize::b(diff.sizes.0))),
|
||||||
|
self.theme.text(false, false),
|
||||||
|
),
|
||||||
|
Span::raw(Cow::from(" -> ")),
|
||||||
|
Span::styled(
|
||||||
|
Cow::from(format!("{}", ByteSize::b(diff.sizes.1))),
|
||||||
|
self.theme.text(false, false),
|
||||||
|
),
|
||||||
|
Span::raw(Cow::from(" (")),
|
||||||
|
Span::styled(
|
||||||
|
Cow::from(format!("{sign}{delta_byte_size:}")),
|
||||||
|
self.theme.diff_line(
|
||||||
|
if is_positive {
|
||||||
|
DiffLineType::Add
|
||||||
|
} else {
|
||||||
|
DiffLineType::Delete
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Span::raw(Cow::from(")")),
|
||||||
|
])]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_line_to_add<'a>(
|
fn get_line_to_add<'a>(
|
||||||
|
|
@ -442,6 +442,9 @@ impl DiffComponent {
|
||||||
) -> Line<'a> {
|
) -> Line<'a> {
|
||||||
let style = theme.diff_hunk_marker(selected_hunk);
|
let style = theme.diff_hunk_marker(selected_hunk);
|
||||||
|
|
||||||
|
let is_content_line =
|
||||||
|
matches!(line.line_type, DiffLineType::None);
|
||||||
|
|
||||||
let left_side_of_line = if end_of_hunk {
|
let left_side_of_line = if end_of_hunk {
|
||||||
Span::styled(Cow::from(symbols::line::BOTTOM_LEFT), style)
|
Span::styled(Cow::from(symbols::line::BOTTOM_LEFT), style)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -458,7 +461,11 @@ impl DiffComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
let content =
|
let content =
|
||||||
tabs_to_spaces(line.content.as_ref().to_string());
|
if !is_content_line && line.content.as_ref().is_empty() {
|
||||||
|
String::from(strings::symbol::LINE_BREAK)
|
||||||
|
} else {
|
||||||
|
tabs_to_spaces(line.content.as_ref().to_string())
|
||||||
|
};
|
||||||
let content = trim_offset(&content, scrolled_right);
|
let content = trim_offset(&content, scrolled_right);
|
||||||
|
|
||||||
let filled = if selected {
|
let filled = if selected {
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@ pub mod symbol {
|
||||||
pub const CHECKMARK: &str = "\u{2713}"; //✓
|
pub const CHECKMARK: &str = "\u{2713}"; //✓
|
||||||
pub const SPACE: &str = "\u{02FD}"; //˽
|
pub const SPACE: &str = "\u{02FD}"; //˽
|
||||||
pub const EMPTY_SPACE: &str = " ";
|
pub const EMPTY_SPACE: &str = " ";
|
||||||
|
pub const LINE_BREAK: &str = "¶";
|
||||||
pub const FOLDER_ICON_COLLAPSED: &str = "\u{25b8}"; //▸
|
pub const FOLDER_ICON_COLLAPSED: &str = "\u{25b8}"; //▸
|
||||||
pub const FOLDER_ICON_EXPANDED: &str = "\u{25be}"; //▾
|
pub const FOLDER_ICON_EXPANDED: &str = "\u{25be}"; //▾
|
||||||
pub const EMPTY_STR: &str = "";
|
pub const EMPTY_STR: &str = "";
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue