working colors in vim mode
This commit is contained in:
@@ -265,7 +265,7 @@ fn apply_highlighting<'a, T: CanvasTheme>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Apply characterwise highlighting - DIRECTION-AWARE VERSION
|
/// Apply characterwise highlighting - PROPER VIM-LIKE VERSION
|
||||||
#[cfg(feature = "gui")]
|
#[cfg(feature = "gui")]
|
||||||
fn apply_characterwise_highlighting<'a, T: CanvasTheme>(
|
fn apply_characterwise_highlighting<'a, T: CanvasTheme>(
|
||||||
text: &'a str,
|
text: &'a str,
|
||||||
@@ -281,16 +281,19 @@ fn apply_characterwise_highlighting<'a, T: CanvasTheme>(
|
|||||||
let start_field = min(anchor_field, *current_field_idx);
|
let start_field = min(anchor_field, *current_field_idx);
|
||||||
let end_field = max(anchor_field, *current_field_idx);
|
let end_field = max(anchor_field, *current_field_idx);
|
||||||
|
|
||||||
|
// Vim-like styling:
|
||||||
|
// - Selected text: contrasting color + background (like vim visual selection)
|
||||||
|
// - All other text: normal color (no special colors for active fields, etc.)
|
||||||
let highlight_style = Style::default()
|
let highlight_style = Style::default()
|
||||||
.fg(theme.highlight())
|
.fg(theme.highlight()) // ✅ Contrasting text color for selected text
|
||||||
.bg(theme.highlight_bg())
|
.bg(theme.highlight_bg()) // ✅ Background for selected text
|
||||||
.add_modifier(Modifier::BOLD);
|
.add_modifier(Modifier::BOLD);
|
||||||
let normal_style_in_highlight = Style::default().fg(theme.highlight());
|
|
||||||
let normal_style_outside = Style::default().fg(theme.fg());
|
let normal_style = Style::default().fg(theme.fg()); // ✅ Normal text color everywhere else
|
||||||
|
|
||||||
if field_index >= start_field && field_index <= end_field {
|
if field_index >= start_field && field_index <= end_field {
|
||||||
if start_field == end_field {
|
if start_field == end_field {
|
||||||
// Single field selection - same as before
|
// Single field selection
|
||||||
let (start_char, end_char) = if anchor_field == *current_field_idx {
|
let (start_char, end_char) = if anchor_field == *current_field_idx {
|
||||||
(min(anchor_char, current_cursor_pos), max(anchor_char, current_cursor_pos))
|
(min(anchor_char, current_cursor_pos), max(anchor_char, current_cursor_pos))
|
||||||
} else if anchor_field < *current_field_idx {
|
} else if anchor_field < *current_field_idx {
|
||||||
@@ -310,72 +313,64 @@ fn apply_characterwise_highlighting<'a, T: CanvasTheme>(
|
|||||||
let after: String = text.chars().skip(clamped_end + 1).collect();
|
let after: String = text.chars().skip(clamped_end + 1).collect();
|
||||||
|
|
||||||
Line::from(vec![
|
Line::from(vec![
|
||||||
Span::styled(before, normal_style_in_highlight),
|
Span::styled(before, normal_style), // Normal text color
|
||||||
Span::styled(highlighted, highlight_style),
|
Span::styled(highlighted, highlight_style), // Contrasting color + background
|
||||||
Span::styled(after, normal_style_in_highlight),
|
Span::styled(after, normal_style), // Normal text color
|
||||||
])
|
])
|
||||||
} else {
|
} else {
|
||||||
// Multi-field selection - think in terms of anchor→current direction
|
// Multi-field selection
|
||||||
if field_index == anchor_field {
|
if field_index == anchor_field {
|
||||||
// Anchor field: highlight from anchor position toward the selection
|
|
||||||
if anchor_field < *current_field_idx {
|
if anchor_field < *current_field_idx {
|
||||||
// Downward selection: highlight from anchor to end of field
|
|
||||||
let clamped_start = anchor_char.min(text_len);
|
let clamped_start = anchor_char.min(text_len);
|
||||||
let before: String = text.chars().take(clamped_start).collect();
|
let before: String = text.chars().take(clamped_start).collect();
|
||||||
let highlighted: String = text.chars().skip(clamped_start).collect();
|
let highlighted: String = text.chars().skip(clamped_start).collect();
|
||||||
|
|
||||||
Line::from(vec![
|
Line::from(vec![
|
||||||
Span::styled(before, normal_style_in_highlight),
|
Span::styled(before, normal_style),
|
||||||
Span::styled(highlighted, highlight_style),
|
Span::styled(highlighted, highlight_style),
|
||||||
])
|
])
|
||||||
} else {
|
} else {
|
||||||
// Upward selection: highlight from start of field to anchor
|
|
||||||
let clamped_end = anchor_char.min(text_len);
|
let clamped_end = anchor_char.min(text_len);
|
||||||
let highlighted: String = text.chars().take(clamped_end + 1).collect();
|
let highlighted: String = text.chars().take(clamped_end + 1).collect();
|
||||||
let after: String = text.chars().skip(clamped_end + 1).collect();
|
let after: String = text.chars().skip(clamped_end + 1).collect();
|
||||||
|
|
||||||
Line::from(vec![
|
Line::from(vec![
|
||||||
Span::styled(highlighted, highlight_style),
|
Span::styled(highlighted, highlight_style),
|
||||||
Span::styled(after, normal_style_in_highlight),
|
Span::styled(after, normal_style),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
} else if field_index == *current_field_idx {
|
} else if field_index == *current_field_idx {
|
||||||
// Current field: highlight toward the cursor position
|
|
||||||
if anchor_field < *current_field_idx {
|
if anchor_field < *current_field_idx {
|
||||||
// Downward selection: highlight from start of field to cursor
|
|
||||||
let clamped_end = current_cursor_pos.min(text_len);
|
let clamped_end = current_cursor_pos.min(text_len);
|
||||||
let highlighted: String = text.chars().take(clamped_end + 1).collect();
|
let highlighted: String = text.chars().take(clamped_end + 1).collect();
|
||||||
let after: String = text.chars().skip(clamped_end + 1).collect();
|
let after: String = text.chars().skip(clamped_end + 1).collect();
|
||||||
|
|
||||||
Line::from(vec![
|
Line::from(vec![
|
||||||
Span::styled(highlighted, highlight_style),
|
Span::styled(highlighted, highlight_style),
|
||||||
Span::styled(after, normal_style_in_highlight),
|
Span::styled(after, normal_style),
|
||||||
])
|
])
|
||||||
} else {
|
} else {
|
||||||
// Upward selection: highlight from cursor to end of field
|
|
||||||
let clamped_start = current_cursor_pos.min(text_len);
|
let clamped_start = current_cursor_pos.min(text_len);
|
||||||
let before: String = text.chars().take(clamped_start).collect();
|
let before: String = text.chars().take(clamped_start).collect();
|
||||||
let highlighted: String = text.chars().skip(clamped_start).collect();
|
let highlighted: String = text.chars().skip(clamped_start).collect();
|
||||||
|
|
||||||
Line::from(vec![
|
Line::from(vec![
|
||||||
Span::styled(before, normal_style_in_highlight),
|
Span::styled(before, normal_style),
|
||||||
Span::styled(highlighted, highlight_style),
|
Span::styled(highlighted, highlight_style),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Middle field between anchor and current: highlight entire field
|
// Middle field: highlight entire field
|
||||||
Line::from(Span::styled(text, highlight_style))
|
Line::from(Span::styled(text, highlight_style))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Line::from(Span::styled(
|
// Outside selection: always normal text color (no special active field color)
|
||||||
text,
|
Line::from(Span::styled(text, normal_style))
|
||||||
if is_active { normal_style_in_highlight } else { normal_style_outside }
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Apply linewise highlighting - VISUALLY DISTINCT VERSION
|
/// Apply linewise highlighting - PROPER VIM-LIKE VERSION
|
||||||
#[cfg(feature = "gui")]
|
#[cfg(feature = "gui")]
|
||||||
fn apply_linewise_highlighting<'a, T: CanvasTheme>(
|
fn apply_linewise_highlighting<'a, T: CanvasTheme>(
|
||||||
text: &'a str,
|
text: &'a str,
|
||||||
@@ -388,23 +383,22 @@ fn apply_linewise_highlighting<'a, T: CanvasTheme>(
|
|||||||
let start_field = min(*anchor_line, *current_field_idx);
|
let start_field = min(*anchor_line, *current_field_idx);
|
||||||
let end_field = max(*anchor_line, *current_field_idx);
|
let end_field = max(*anchor_line, *current_field_idx);
|
||||||
|
|
||||||
// Use the SAME style as characterwise highlighting
|
// Vim-like styling:
|
||||||
|
// - Selected lines: contrasting text color + background
|
||||||
|
// - All other lines: normal text color (no special active field color)
|
||||||
let highlight_style = Style::default()
|
let highlight_style = Style::default()
|
||||||
.fg(theme.highlight())
|
.fg(theme.highlight()) // ✅ Contrasting text color for selected text
|
||||||
.bg(theme.highlight_bg())
|
.bg(theme.highlight_bg()) // ✅ Background for selected text
|
||||||
.add_modifier(Modifier::BOLD);
|
.add_modifier(Modifier::BOLD);
|
||||||
|
|
||||||
let normal_style_in_highlight = Style::default().fg(theme.highlight());
|
let normal_style = Style::default().fg(theme.fg()); // ✅ Normal text color everywhere else
|
||||||
let normal_style_outside = Style::default().fg(theme.fg());
|
|
||||||
|
|
||||||
if field_index >= start_field && field_index <= end_field {
|
if field_index >= start_field && field_index <= end_field {
|
||||||
// ALWAYS highlight entire line - no markers, just full line highlighting
|
// Selected line: contrasting text color + background
|
||||||
Line::from(Span::styled(text, highlight_style))
|
Line::from(Span::styled(text, highlight_style))
|
||||||
} else {
|
} else {
|
||||||
Line::from(Span::styled(
|
// Normal line: normal text color (no special active field color)
|
||||||
text,
|
Line::from(Span::styled(text, normal_style))
|
||||||
if is_active { normal_style_in_highlight } else { normal_style_outside }
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user