ui: fix scrollbar calculations
parent
6e7ab0421b
commit
4c88422d71
|
@ -372,9 +372,6 @@ impl ThreadView {
|
||||||
let page_no = (self.new_cursor_pos).wrapping_div(rows);
|
let page_no = (self.new_cursor_pos).wrapping_div(rows);
|
||||||
|
|
||||||
let top_idx = page_no * rows;
|
let top_idx = page_no * rows;
|
||||||
if (rows >= height!(self.content.area())) {
|
|
||||||
upper_left = pos_dec(upper_left!(area), (1, 0));
|
|
||||||
}
|
|
||||||
/* This closure (written for code clarity, should be inlined by the compiler) returns the
|
/* This closure (written for code clarity, should be inlined by the compiler) returns the
|
||||||
* **line** of an entry in the ThreadView grid. */
|
* **line** of an entry in the ThreadView grid. */
|
||||||
let get_entry_area = |idx: usize, entries: &[ThreadEntry]| {
|
let get_entry_area = |idx: usize, entries: &[ThreadEntry]| {
|
||||||
|
@ -393,19 +390,21 @@ impl ThreadView {
|
||||||
if page_no != prev_page_no {
|
if page_no != prev_page_no {
|
||||||
clear_area(grid, area);
|
clear_area(grid, area);
|
||||||
}
|
}
|
||||||
let visibles = self
|
let visibles: Vec<&usize> = self
|
||||||
.visible_entries
|
.visible_entries
|
||||||
.iter()
|
.iter()
|
||||||
.flat_map(|v| v.iter())
|
.flat_map(|ref v| v.iter())
|
||||||
.skip(top_idx)
|
.collect();
|
||||||
.take(rows);
|
if (rows >= visibles.len()) {
|
||||||
let mut visible_entry_counter = 0;
|
upper_left = pos_dec(upper_left!(area), (1, 0));
|
||||||
|
}
|
||||||
|
|
||||||
for v in visibles {
|
let mut visible_entry_counter = 0;
|
||||||
|
for v in visibles.iter().skip(top_idx).take(rows) {
|
||||||
if visible_entry_counter >= rows {
|
if visible_entry_counter >= rows {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
let idx = v;
|
let idx = *v;
|
||||||
copy_area(
|
copy_area(
|
||||||
grid,
|
grid,
|
||||||
&self.content,
|
&self.content,
|
||||||
|
@ -422,11 +421,6 @@ impl ThreadView {
|
||||||
}
|
}
|
||||||
/* If cursor position has changed, remove the highlight from the previous position and
|
/* If cursor position has changed, remove the highlight from the previous position and
|
||||||
* apply it in the new one. */
|
* apply it in the new one. */
|
||||||
let visibles: Vec<&usize> = self
|
|
||||||
.visible_entries
|
|
||||||
.iter()
|
|
||||||
.flat_map(|ref v| v.iter())
|
|
||||||
.collect();
|
|
||||||
self.cursor_pos = self.new_cursor_pos;
|
self.cursor_pos = self.new_cursor_pos;
|
||||||
if self.cursor_pos + 1 > visibles.len() {
|
if self.cursor_pos + 1 > visibles.len() {
|
||||||
self.cursor_pos = visibles.len().saturating_sub(1);
|
self.cursor_pos = visibles.len().saturating_sub(1);
|
||||||
|
@ -455,7 +449,7 @@ impl ThreadView {
|
||||||
);
|
);
|
||||||
|
|
||||||
self.highlight_line(grid, dest_area, src_area, idx);
|
self.highlight_line(grid, dest_area, src_area, idx);
|
||||||
if (rows < height!(self.content.area())) {
|
if (rows < visibles.len()) {
|
||||||
ScrollBar::draw(
|
ScrollBar::draw(
|
||||||
grid,
|
grid,
|
||||||
(
|
(
|
||||||
|
@ -479,6 +473,9 @@ impl ThreadView {
|
||||||
.iter()
|
.iter()
|
||||||
.flat_map(|ref v| v.iter())
|
.flat_map(|ref v| v.iter())
|
||||||
.collect();
|
.collect();
|
||||||
|
if (rows >= visibles.len()) {
|
||||||
|
upper_left = pos_dec(upper_left!(area), (1, 0));
|
||||||
|
}
|
||||||
for &idx in &[old_cursor_pos, self.cursor_pos] {
|
for &idx in &[old_cursor_pos, self.cursor_pos] {
|
||||||
let entry_idx = *visibles[idx];
|
let entry_idx = *visibles[idx];
|
||||||
let src_area = { get_entry_area(entry_idx, &self.entries) };
|
let src_area = { get_entry_area(entry_idx, &self.entries) };
|
||||||
|
@ -504,7 +501,7 @@ impl ThreadView {
|
||||||
);
|
);
|
||||||
|
|
||||||
self.highlight_line(grid, dest_area, src_area, entry_idx);
|
self.highlight_line(grid, dest_area, src_area, entry_idx);
|
||||||
if (rows < height!(self.content.area())) {
|
if (rows < visibles.len()) {
|
||||||
ScrollBar::draw(
|
ScrollBar::draw(
|
||||||
grid,
|
grid,
|
||||||
(
|
(
|
||||||
|
|
|
@ -707,22 +707,33 @@ impl ScrollBar {
|
||||||
if height < 3 {
|
if height < 3 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let visible_ratio: f32 = (std::cmp::min(visible_rows, length) as f32) / (length as f32);
|
let height = height - 2;
|
||||||
let scrollbar_height = std::cmp::max((visible_ratio * (length as f32)) as usize, 1);
|
clear_area(grid, area);
|
||||||
let scrollbar_offset = (visible_ratio * (pos as f32)) as usize + 1;
|
|
||||||
|
|
||||||
|
let visible_ratio: f32 = (std::cmp::min(visible_rows, length) as f32) / (length as f32);
|
||||||
|
let scrollbar_height = std::cmp::max((visible_ratio * (height as f32)) as usize, 1);
|
||||||
|
let scrollbar_offset = {
|
||||||
|
let mut temp = (((pos as f32) / (length as f32)) * (height as f32)) as usize;
|
||||||
|
if temp + scrollbar_height >= height {
|
||||||
|
height - scrollbar_height
|
||||||
|
} else {
|
||||||
|
temp
|
||||||
|
}
|
||||||
|
};
|
||||||
let (upper_left, bottom_right) = area;
|
let (upper_left, bottom_right) = area;
|
||||||
|
|
||||||
grid[upper_left].set_ch('▴');
|
grid[upper_left].set_ch('▴');
|
||||||
for y in get_y(upper_left) + 1..(get_y(upper_left) + scrollbar_offset) {
|
let upper_left = (upper_left.0, upper_left.1 + 1);
|
||||||
|
|
||||||
|
for y in get_y(upper_left)..(get_y(upper_left) + scrollbar_offset) {
|
||||||
grid[set_y(upper_left, y)].set_ch(' ');
|
grid[set_y(upper_left, y)].set_ch(' ');
|
||||||
}
|
}
|
||||||
for y in (get_y(upper_left) + scrollbar_offset)
|
for y in (get_y(upper_left) + scrollbar_offset)
|
||||||
..(get_y(upper_left) + scrollbar_offset + scrollbar_height)
|
..=(get_y(upper_left) + scrollbar_offset + scrollbar_height)
|
||||||
{
|
{
|
||||||
grid[set_y(upper_left, y)].set_ch('█');
|
grid[set_y(upper_left, y)].set_ch('█');
|
||||||
}
|
}
|
||||||
for y in (get_y(upper_left) + scrollbar_offset + scrollbar_height)..get_y(bottom_right) - 1
|
for y in (get_y(upper_left) + scrollbar_offset + scrollbar_height + 1)..get_y(bottom_right)
|
||||||
{
|
{
|
||||||
grid[set_y(upper_left, y)].set_ch(' ');
|
grid[set_y(upper_left, y)].set_ch(' ');
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue