mirror of
https://github.com/extrawurst/gitui.git
synced 2025-01-04 07:15:45 +03:00
fix scrollbar (#350)
This commit is contained in:
parent
7e6e310ab8
commit
bd00b3e4b8
@ -359,8 +359,7 @@ impl DrawableComponent for DetailsComponent {
|
|||||||
f,
|
f,
|
||||||
chunks[1],
|
chunks[1],
|
||||||
&self.theme,
|
&self.theme,
|
||||||
self.get_number_of_lines(width as usize)
|
self.get_number_of_lines(width as usize),
|
||||||
.saturating_sub(height as usize),
|
|
||||||
self.scroll_top.get(),
|
self.scroll_top.get(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -591,7 +591,7 @@ impl DrawableComponent for DiffComponent {
|
|||||||
r,
|
r,
|
||||||
&self.theme,
|
&self.theme,
|
||||||
self.lines_count(),
|
self.lines_count(),
|
||||||
self.selection.get_end(),
|
self.scroll_top.get(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,16 +12,16 @@ use tui::{
|
|||||||
|
|
||||||
///
|
///
|
||||||
struct Scrollbar {
|
struct Scrollbar {
|
||||||
max: u16,
|
lines: u16,
|
||||||
pos: u16,
|
pos: u16,
|
||||||
style_bar: Style,
|
style_bar: Style,
|
||||||
style_pos: Style,
|
style_pos: Style,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Scrollbar {
|
impl Scrollbar {
|
||||||
fn new(max: usize, pos: usize) -> Self {
|
fn new(lines: usize, pos: usize) -> Self {
|
||||||
Self {
|
Self {
|
||||||
max: u16::try_from(max).unwrap_or_default(),
|
lines: u16::try_from(lines).unwrap_or_default(),
|
||||||
pos: u16::try_from(pos).unwrap_or_default(),
|
pos: u16::try_from(pos).unwrap_or_default(),
|
||||||
style_pos: Style::default(),
|
style_pos: Style::default(),
|
||||||
style_bar: Style::default(),
|
style_bar: Style::default(),
|
||||||
@ -41,11 +41,11 @@ impl Widget for Scrollbar {
|
|||||||
vertical: 1,
|
vertical: 1,
|
||||||
});
|
});
|
||||||
|
|
||||||
if area.height < 4 {
|
if area.height == 0 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if area.height > self.max {
|
if area.height >= self.lines {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,12 +53,15 @@ impl Widget for Scrollbar {
|
|||||||
buf.set_string(right, y, THICK_VERTICAL, self.style_bar);
|
buf.set_string(right, y, THICK_VERTICAL, self.style_bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
let progress = f32::from(self.pos) / f32::from(self.max);
|
let max_pos = self.lines.saturating_sub(area.height);
|
||||||
let pos = f32::from(area.height.saturating_sub(1)) * progress;
|
let progress = f32::from(self.pos) / f32::from(max_pos);
|
||||||
|
let progress = if progress > 1.0 { 1.0 } else { progress };
|
||||||
|
let pos = f32::from(area.height) * progress;
|
||||||
|
|
||||||
//TODO: any better way for this?
|
//TODO: any better way for this?
|
||||||
#[allow(clippy::cast_sign_loss)]
|
#[allow(clippy::cast_sign_loss)]
|
||||||
#[allow(clippy::cast_possible_truncation)]
|
#[allow(clippy::cast_possible_truncation)]
|
||||||
let pos = pos as u16;
|
let pos = (pos as u16).saturating_sub(1);
|
||||||
|
|
||||||
buf.set_string(right, area.top() + pos, FULL, self.style_pos);
|
buf.set_string(right, area.top() + pos, FULL, self.style_pos);
|
||||||
}
|
}
|
||||||
@ -68,10 +71,10 @@ pub fn draw_scrollbar<B: Backend>(
|
|||||||
f: &mut Frame<B>,
|
f: &mut Frame<B>,
|
||||||
r: Rect,
|
r: Rect,
|
||||||
theme: &SharedTheme,
|
theme: &SharedTheme,
|
||||||
max: usize,
|
lines: usize,
|
||||||
pos: usize,
|
pos: usize,
|
||||||
) {
|
) {
|
||||||
let mut widget = Scrollbar::new(max, pos);
|
let mut widget = Scrollbar::new(lines, pos);
|
||||||
widget.style_pos = theme.scroll_bar_pos();
|
widget.style_pos = theme.scroll_bar_pos();
|
||||||
f.render_widget(widget, r)
|
f.render_widget(widget, r)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user