Scrollbar initial values
This commit is contained in:
parent
4e17ef1e09
commit
df1d1dddc6
3 changed files with 27 additions and 14 deletions
|
|
@ -116,13 +116,19 @@ impl App {
|
||||||
fn render(&mut self) {
|
fn render(&mut self) {
|
||||||
let _ = self.terminal.draw(|frame| {
|
let _ = self.terminal.draw(|frame| {
|
||||||
let area = frame.area();
|
let area = frame.area();
|
||||||
|
|
||||||
|
const HEADER_HEIGHT: u16 = 3;
|
||||||
|
const FOOTER_HEIGHT: u16 = 3;
|
||||||
|
|
||||||
|
let max_content_height = area.height.saturating_sub(HEADER_HEIGHT + FOOTER_HEIGHT);
|
||||||
|
|
||||||
let chunks = Layout::default()
|
let chunks = Layout::default()
|
||||||
.direction(Direction::Vertical)
|
.direction(Direction::Vertical)
|
||||||
.margin(1)
|
.margin(1)
|
||||||
.constraints([
|
.constraints([
|
||||||
Constraint::Length(3),
|
Constraint::Length(HEADER_HEIGHT),
|
||||||
Constraint::Min(1),
|
Constraint::Length(max_content_height.max(1)),
|
||||||
Constraint::Length(3),
|
Constraint::Length(FOOTER_HEIGHT),
|
||||||
])
|
])
|
||||||
.split(area);
|
.split(area);
|
||||||
|
|
||||||
|
|
@ -177,7 +183,13 @@ impl App {
|
||||||
.begin_symbol(Some("↑"))
|
.begin_symbol(Some("↑"))
|
||||||
.end_symbol(Some("↓"));
|
.end_symbol(Some("↓"));
|
||||||
|
|
||||||
frame.render_stateful_widget(scrollbar, area[1], &mut state.scroll_state);
|
frame.render_stateful_widget(
|
||||||
|
scrollbar,
|
||||||
|
area[1],
|
||||||
|
&mut state
|
||||||
|
.scroll_state
|
||||||
|
.viewport_content_length(area[0].height as usize),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_events(&mut self) -> io::Result<()> {
|
fn handle_events(&mut self) -> io::Result<()> {
|
||||||
|
|
@ -191,12 +203,10 @@ impl App {
|
||||||
|
|
||||||
match key.code {
|
match key.code {
|
||||||
KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true,
|
KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true,
|
||||||
KeyCode::Up | KeyCode::Char('k') => {
|
KeyCode::Up | KeyCode::Char('k') => self.state.scroll_state.prev(),
|
||||||
self.state.scroll_state.prev();
|
KeyCode::Down | KeyCode::Char('j') => self.state.scroll_state.next(),
|
||||||
}
|
KeyCode::Home => self.state.scroll_state.first(),
|
||||||
KeyCode::Down | KeyCode::Char('j') => {
|
KeyCode::End => self.state.scroll_state.last(),
|
||||||
self.state.scroll_state.next();
|
|
||||||
}
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ use std::cmp::min;
|
||||||
use crate::i18n::t;
|
use crate::i18n::t;
|
||||||
use crate::ui::dashboard::{
|
use crate::ui::dashboard::{
|
||||||
MonitorStatus, MonitorViewState,
|
MonitorStatus, MonitorViewState,
|
||||||
model::{DashboardViewState, GroupViewState},
|
model::{DashboardViewState, GroupViewState, BORDER_LINES_VIEW},
|
||||||
};
|
};
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
Frame,
|
Frame,
|
||||||
|
|
@ -21,7 +21,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &Dashboard
|
||||||
.groups
|
.groups
|
||||||
.iter()
|
.iter()
|
||||||
.map(|g| {
|
.map(|g| {
|
||||||
let height_neeed = 3 + g.monitors.len();
|
let height_neeed = BORDER_LINES_VIEW + g.monitors.len();
|
||||||
Constraint::Length(height_neeed as u16)
|
Constraint::Length(height_neeed as u16)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use crate::i18n::t;
|
||||||
use ratatui::widgets::ScrollbarState;
|
use ratatui::widgets::ScrollbarState;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
|
||||||
const BORDER_LINES_VIEW: usize = 3;
|
pub const BORDER_LINES_VIEW: usize = 3;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub enum MonitorStatus {
|
pub enum MonitorStatus {
|
||||||
|
|
@ -37,6 +37,7 @@ pub struct DashboardViewState {
|
||||||
pub error_message: Option<String>,
|
pub error_message: Option<String>,
|
||||||
pub auto_refresh_interval: u32,
|
pub auto_refresh_interval: u32,
|
||||||
pub scroll_state: ScrollbarState,
|
pub scroll_state: ScrollbarState,
|
||||||
|
content_length: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DashboardViewState {
|
impl DashboardViewState {
|
||||||
|
|
@ -49,6 +50,7 @@ impl DashboardViewState {
|
||||||
error_message: None,
|
error_message: None,
|
||||||
auto_refresh_interval: 300,
|
auto_refresh_interval: 300,
|
||||||
scroll_state: ScrollbarState::new(0),
|
scroll_state: ScrollbarState::new(0),
|
||||||
|
content_length: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,6 +77,7 @@ impl DashboardViewState {
|
||||||
error_message: None,
|
error_message: None,
|
||||||
auto_refresh_interval: data.auto_refresh_interval.max(30),
|
auto_refresh_interval: data.auto_refresh_interval.max(30),
|
||||||
scroll_state: ScrollbarState::new(content_length.saturating_sub(1)),
|
scroll_state: ScrollbarState::new(content_length.saturating_sub(1)),
|
||||||
|
content_length,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -83,7 +86,7 @@ impl DashboardViewState {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn show_vertical_scrollbar(&self, height: u16) -> bool {
|
pub fn show_vertical_scrollbar(&self, height: u16) -> bool {
|
||||||
height < self.get_all_monitors().len() as u16
|
height < self.content_length as u16
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue