Skip to content

Commit e6e5b90

Browse files
committed
Add ViewLines struct to replace Vec<ViewLine>
This replaces the representation of lines with a ViewLines struct. This provides a standard interface for working with the lines.
1 parent 50f15d7 commit e6e5b90

File tree

12 files changed

+196
-81
lines changed

12 files changed

+196
-81
lines changed

src/components/choice.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
display::DisplayColor,
88
input::{Event, InputOptions, KeyCode},
99
util::handle_view_data_scroll,
10-
view::{LineSegment, ViewData, ViewLine},
10+
view::{LineSegment, ViewData, ViewLine, ViewLines},
1111
};
1212

1313
pub(crate) static INPUT_OPTIONS: LazyLock<InputOptions> =
@@ -44,7 +44,7 @@ where T: Clone
4444
}
4545
}
4646

47-
pub(crate) fn set_prompt(&mut self, prompt_lines: Vec<ViewLine>) {
47+
pub(crate) fn set_prompt(&mut self, prompt_lines: ViewLines) {
4848
self.view_data.update_view_data(|updater| {
4949
updater.clear();
5050
for line in prompt_lines {

src/components/choice/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn render_options_no_prompt() {
3636
#[test]
3737
fn render_options_prompt() {
3838
let mut module = Choice::new(create_choices());
39-
module.set_prompt(vec![ViewLine::from("Prompt")]);
39+
module.set_prompt(ViewLines::from([ViewLine::from("Prompt")]));
4040
assert_rendered_output!(
4141
Style module.get_view_data(),
4242
"{TITLE}",

src/modules/external_editor.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::{
1717
module::{ExitStatus, Module, State},
1818
process::Results,
1919
todo_file::{Line, TodoFile},
20-
view::{RenderContext, ViewData, ViewLine},
20+
view::{RenderContext, ViewData, ViewLine, ViewLines},
2121
};
2222

2323
static INPUT_OPTIONS: LazyLock<InputOptions> = LazyLock::new(|| InputOptions::RESIZE);
@@ -181,7 +181,7 @@ impl ExternalEditor {
181181
String::from("Undo modifications and edit rebase file"),
182182
),
183183
]);
184-
empty_choice.set_prompt(vec![ViewLine::from("The rebase file is empty.")]);
184+
empty_choice.set_prompt(ViewLines::from([ViewLine::from("The rebase file is empty.")]));
185185

186186
let error_choice = Choice::new(vec![
187187
(Action::AbortRebase, '1', String::from("Abort rebase")),

src/modules/insert.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::{
1919
module::{Module, State},
2020
process::Results,
2121
todo_file::{Line, TodoFile},
22-
view::{LineSegment, RenderContext, ViewData, ViewDataUpdater, ViewLine},
22+
view::{LineSegment, RenderContext, ViewData, ViewDataUpdater, ViewLine, ViewLines},
2323
};
2424

2525
pub(crate) struct Insert {
@@ -122,7 +122,7 @@ impl Insert {
122122
(LineType::UpdateRef, 'u', String::from("update-ref <reference>")),
123123
(LineType::Cancel, 'q', String::from("Cancel add line")),
124124
]);
125-
action_choices.set_prompt(vec![ViewLine::from("Select the type of line to insert:")]);
125+
action_choices.set_prompt(ViewLines::from([ViewLine::from("Select the type of line to insert:")]));
126126

127127
Self {
128128
action_choices,

src/test_helpers/assertions/assert_rendered_output/render_view_data.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,30 @@ pub(crate) fn render_view_data(view_data: &ViewData, options: AssertRenderOption
2020
}
2121

2222
if !body_only {
23-
let leading_lines = view_data.get_leading_lines();
23+
let leading_lines = view_data.leading_lines();
2424
if !leading_lines.is_empty() {
2525
lines.push(String::from("{LEADING}"));
26-
for line in leading_lines {
26+
for line in leading_lines.iter() {
2727
lines.push(render_view_line(line, Some(options)));
2828
}
2929
}
3030
}
3131

32-
let body_lines = view_data.get_lines();
32+
let body_lines = view_data.lines();
3333
if !body_lines.is_empty() {
3434
if !body_only {
3535
lines.push(String::from("{BODY}"));
3636
}
37-
for line in body_lines {
37+
for line in body_lines.iter() {
3838
lines.push(render_view_line(line, Some(options)));
3939
}
4040
}
4141

4242
if !body_only {
43-
let trailing_lines = view_data.get_trailing_lines();
43+
let trailing_lines = view_data.trailing_lines();
4444
if !trailing_lines.is_empty() {
4545
lines.push(String::from("{TRAILING}"));
46-
for line in trailing_lines {
46+
for line in trailing_lines.iter() {
4747
lines.push(render_view_line(line, Some(options)));
4848
}
4949
}

src/view.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ mod thread;
1818
mod view_data;
1919
mod view_data_updater;
2020
mod view_line;
21+
mod view_lines;
2122

2223
#[cfg(test)]
2324
mod tests;
@@ -35,6 +36,7 @@ pub(crate) use self::{
3536
view_data::ViewData,
3637
view_data_updater::ViewDataUpdater,
3738
view_line::ViewLine,
39+
view_lines::ViewLines,
3840
};
3941
use crate::display::{Display, DisplayColor, Tui};
4042

@@ -101,17 +103,17 @@ impl<C: Tui> View<C> {
101103
self.display.next_line()?;
102104
}
103105

104-
let lines = render_slice.get_lines();
106+
let view_lines = render_slice.view_lines();
105107
let leading_line_count = render_slice.get_leading_lines_count();
106108
let trailing_line_count = render_slice.get_trailing_lines_count();
107-
let lines_count = lines.len() - leading_line_count - trailing_line_count;
109+
let lines_count = view_lines.count() as usize - leading_line_count - trailing_line_count;
108110
let show_scroll_bar = render_slice.should_show_scroll_bar();
109111
let scroll_indicator_index = render_slice.get_scroll_index();
110112
let view_height = window_height - leading_line_count - trailing_line_count;
111113

112-
let leading_lines_iter = lines.iter().take(leading_line_count);
113-
let lines_iter = lines.iter().skip(leading_line_count).take(lines_count);
114-
let trailing_lines_iter = lines.iter().skip(leading_line_count + lines_count);
114+
let leading_lines_iter = view_lines.iter().take(leading_line_count);
115+
let lines_iter = view_lines.iter().skip(leading_line_count).take(lines_count);
116+
let trailing_lines_iter = view_lines.iter().skip(leading_line_count + lines_count);
115117

116118
for line in leading_lines_iter {
117119
self.display.ensure_at_line_start()?;

src/view/render_slice.rs

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ use std::{
99
};
1010

1111
pub(crate) use self::render_action::RenderAction;
12-
use crate::view::{LineSegment, ScrollPosition, ViewData, ViewLine};
12+
use crate::view::{LineSegment, ScrollPosition, ViewData, ViewLine, ViewLines};
1313

1414
#[derive(Debug)]
1515
pub(crate) struct RenderSlice {
1616
actions: VecDeque<RenderAction>,
1717
height: usize,
18-
lines: Vec<ViewLine>,
18+
lines: ViewLines,
1919
lines_count: usize,
2020
lines_leading_count: usize,
2121
lines_trailing_count: usize,
@@ -36,7 +36,7 @@ impl RenderSlice {
3636
Self {
3737
actions: VecDeque::new(),
3838
height: 0,
39-
lines: vec![],
39+
lines: ViewLines::new(),
4040
lines_count: 0,
4141
lines_leading_count: 0,
4242
lines_trailing_count: 0,
@@ -187,7 +187,7 @@ impl RenderSlice {
187187
self.lines_trailing_count
188188
}
189189

190-
pub(crate) const fn get_lines(&self) -> &Vec<ViewLine> {
190+
pub(crate) const fn view_lines(&self) -> &ViewLines {
191191
&self.lines
192192
}
193193

@@ -214,8 +214,8 @@ impl RenderSlice {
214214

215215
fn set_padding_height(&mut self, view_data: &ViewData) {
216216
let padding_height = if view_data.show_title() { 1 } else { 0 }
217-
+ view_data.get_leading_lines().len()
218-
+ view_data.get_trailing_lines().len();
217+
+ view_data.leading_lines().count() as usize
218+
+ view_data.trailing_lines().count() as usize;
219219

220220
if self.padding_height != padding_height {
221221
self.padding_height = padding_height;
@@ -261,11 +261,10 @@ impl RenderSlice {
261261
);
262262
}
263263

264-
#[expect(clippy::too_many_lines, reason = "Legacy, needs refactor")]
265264
fn rebuild(&mut self, view_data: &ViewData) {
266-
let leading_lines_length = view_data.get_leading_lines().len();
267-
let trailing_lines_length = view_data.get_trailing_lines().len();
268-
let lines_length = view_data.get_lines().len();
265+
let leading_lines_length = view_data.leading_lines().count() as usize;
266+
let trailing_lines_length = view_data.trailing_lines().count() as usize;
267+
let lines_length = view_data.lines().count() as usize;
269268

270269
self.version += 1;
271270
self.view_data_name = String::from(view_data.get_name());
@@ -301,7 +300,7 @@ impl RenderSlice {
301300

302301
(
303302
leading_lines_end,
304-
Self::calculate_max_line_length(view_data.get_leading_lines(), 0, leading_lines_end),
303+
Self::calculate_max_line_length(view_data.leading_lines(), 0, leading_lines_end),
305304
)
306305
};
307306

@@ -327,7 +326,7 @@ impl RenderSlice {
327326

328327
(
329328
trailing_lines_end,
330-
Self::calculate_max_line_length(view_data.get_trailing_lines(), 0, trailing_lines_end),
329+
Self::calculate_max_line_length(view_data.trailing_lines(), 0, trailing_lines_end),
331330
)
332331
};
333332

@@ -352,7 +351,7 @@ impl RenderSlice {
352351
available_height
353352
};
354353

355-
let max_line_length = Self::calculate_max_line_length(view_data.get_lines(), lines_start, lines_end);
354+
let max_line_length = Self::calculate_max_line_length(view_data.lines(), lines_start, lines_end);
356355
(
357356
lines_start,
358357
lines_end,
@@ -373,17 +372,12 @@ impl RenderSlice {
373372
}
374373

375374
self.lines.clear();
376-
self.push_lines(view_data.get_leading_lines(), 0, leading_lines_end, false);
377-
self.push_lines(
378-
view_data.get_lines(),
379-
lines_start,
380-
lines_end,
381-
self.should_show_scrollbar,
382-
);
383-
self.push_lines(view_data.get_trailing_lines(), 0, trailing_lines_end, false);
375+
self.push_lines(view_data.leading_lines(), 0, leading_lines_end, false);
376+
self.push_lines(view_data.lines(), lines_start, lines_end, self.should_show_scrollbar);
377+
self.push_lines(view_data.trailing_lines(), 0, trailing_lines_end, false);
384378
}
385379

386-
fn calculate_max_line_length(view_lines: &[ViewLine], start: usize, length: usize) -> usize {
380+
fn calculate_max_line_length(view_lines: &ViewLines, start: usize, length: usize) -> usize {
387381
view_lines
388382
.iter()
389383
.skip(start)
@@ -400,7 +394,7 @@ impl RenderSlice {
400394
})
401395
}
402396

403-
fn push_lines(&mut self, view_lines: &[ViewLine], start: usize, end: usize, scroll_bar: bool) {
397+
fn push_lines(&mut self, view_lines: &ViewLines, start: usize, end: usize, scroll_bar: bool) {
404398
let window_width = if scroll_bar && self.width > 0 {
405399
self.width - 1
406400
}

src/view/render_slice/tests.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@ fn assert_rendered(render_slice: &RenderSlice, expected: &[&str]) {
2323
}
2424
}
2525

26-
let lines = render_slice.get_lines();
27-
if lines.is_empty() {
26+
let view_lines = render_slice.view_lines();
27+
if view_lines.is_empty() {
2828
output.push(String::from("{EMPTY}"));
2929
}
3030
else {
3131
let leading_line_count = render_slice.get_leading_lines_count();
3232
let trailing_line_count = render_slice.get_trailing_lines_count();
33-
let lines_count = lines.len() - leading_line_count - trailing_line_count;
34-
let leading_lines = lines.iter().take(leading_line_count);
35-
let body_lines = lines.iter().skip(leading_line_count).take(lines_count);
36-
let trailing_lines = lines.iter().skip(leading_line_count + lines_count);
33+
let lines_count = view_lines.count() as usize - leading_line_count - trailing_line_count;
34+
let leading_lines = view_lines.iter().take(leading_line_count);
35+
let body_lines = view_lines.iter().skip(leading_line_count).take(lines_count);
36+
let trailing_lines = view_lines.iter().skip(leading_line_count + lines_count);
3737

3838
if leading_line_count > 0 {
3939
output.push(String::from("{LEADING}"));
@@ -1237,40 +1237,40 @@ fn scroll_horizontal_with_segments() {
12371237

12381238
#[test]
12391239
fn calculate_max_line_length_max_first() {
1240-
let view_lines = [
1240+
let view_lines = ViewLines::from([
12411241
ViewLine::from(vec![LineSegment::new("0123456789"), LineSegment::new("012345")]),
12421242
ViewLine::from("012345"),
1243-
];
1243+
]);
12441244
assert_eq!(RenderSlice::calculate_max_line_length(&view_lines, 0, 1), 16);
12451245
}
12461246

12471247
#[test]
12481248
fn calculate_max_line_length_max_last() {
1249-
let view_lines = [
1249+
let view_lines = ViewLines::from([
12501250
ViewLine::from("012345"),
12511251
ViewLine::from(vec![LineSegment::new("0123456789"), LineSegment::new("012345")]),
1252-
];
1252+
]);
12531253
assert_eq!(RenderSlice::calculate_max_line_length(&view_lines, 0, 2), 16);
12541254
}
12551255

12561256
#[test]
12571257
fn calculate_max_line_length_with_slice() {
1258-
let view_lines = [
1258+
let view_lines = ViewLines::from([
12591259
ViewLine::from("012345"),
12601260
ViewLine::from("012345"),
12611261
ViewLine::from(vec![LineSegment::new("0123456789"), LineSegment::new("012345")]),
12621262
ViewLine::from(vec![LineSegment::new("0123456789"), LineSegment::new("01234567")]),
1263-
];
1263+
]);
12641264
assert_eq!(RenderSlice::calculate_max_line_length(&view_lines, 1, 2), 16);
12651265
}
12661266

12671267
#[test]
12681268
fn calculate_max_line_length_ignore_pinned() {
1269-
let view_lines = [
1269+
let view_lines = ViewLines::from([
12701270
ViewLine::from("012345"),
12711271
ViewLine::from("012345"),
12721272
ViewLine::from(vec![LineSegment::new("0123456789"), LineSegment::new("012345")]),
12731273
ViewLine::new_pinned(vec![LineSegment::new("0123456789"), LineSegment::new("01234567")]),
1274-
];
1274+
]);
12751275
assert_eq!(RenderSlice::calculate_max_line_length(&view_lines, 0, 4), 16);
12761276
}

src/view/thread/state.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,10 @@ mod tests {
276276
.state
277277
.render_slice()
278278
.lock()
279-
.get_lines()
280-
.first()
279+
.view_lines()
280+
.iter()
281+
.take(1)
282+
.next()
281283
.unwrap()
282284
.get_segments()
283285
.first()

0 commit comments

Comments
 (0)