From 5148eb5b406e2690ebdcc02669009319e32ed154 Mon Sep 17 00:00:00 2001 From: Bluemangoo Date: Fri, 10 Oct 2025 19:01:34 +0800 Subject: [PATCH] top: tui impl info bar --- src/uu/top/src/top.rs | 16 ++++++++++------ src/uu/top/src/tui/input.rs | 6 +++--- src/uu/top/src/tui/mod.rs | 34 ++++++++++++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/uu/top/src/top.rs b/src/uu/top/src/top.rs index a32f866..26d4919 100644 --- a/src/uu/top/src/top.rs +++ b/src/uu/top/src/top.rs @@ -66,6 +66,11 @@ impl ProcList { } } +pub(crate) struct InfoBar { + pub title: String, + pub content: String, +} + #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uu_app().try_get_matches_from(args)?; @@ -107,6 +112,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let data = Arc::new(RwLock::new(( Header::new(&tui_stat.read().unwrap()), ProcList::new(&settings, &tui_stat.read().unwrap()), + None, ))); // update @@ -122,7 +128,9 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let header = Header::new(&tui_stat.read().unwrap()); let proc_list = ProcList::new(&settings, &tui_stat.read().unwrap()); tui_stat.write().unwrap().input_message = None; - *data.write().unwrap() = (header, proc_list); + let mut data = data.write().unwrap(); + data.0 = header; + data.1 = proc_list; should_update.store(true, Ordering::Relaxed); } }); @@ -231,11 +239,7 @@ fn collect(settings: &Settings, fields: &[String], tui_stat: &TuiStat) -> Vec, - data: &RwLock<(Header, ProcList)>, + data: &RwLock<(Header, ProcList, Option)>, should_update: &AtomicBool, ) -> bool { let input_mode = { tui_stat.read().unwrap().input_mode }; @@ -338,7 +338,7 @@ fn handle_input_value( input_event: InputEvent, settings: &Settings, tui_stat: &RwLock, - data: &RwLock<(Header, ProcList)>, + data: &RwLock<(Header, ProcList, Option)>, should_update: &AtomicBool, ) { match input_event { diff --git a/src/uu/top/src/tui/mod.rs b/src/uu/top/src/tui/mod.rs index fcc492a..ddd74d7 100644 --- a/src/uu/top/src/tui/mod.rs +++ b/src/uu/top/src/tui/mod.rs @@ -13,7 +13,7 @@ use std::borrow::Cow; use crate::header::{format_memory, Header}; use crate::tui::color::TuiColor; use crate::tui::stat::{CpuGraphMode, MemoryGraphMode, TuiStat}; -use crate::ProcList; +use crate::{InfoBar, ProcList}; use ratatui::prelude::*; use ratatui::widgets::{Cell, Paragraph, Row, Table, TableState}; use std::cmp::min; @@ -22,19 +22,21 @@ pub struct Tui<'a> { settings: &'a crate::Settings, header: &'a Header, proc_list: &'a ProcList, + info_bar: &'a Option, stat: &'a mut TuiStat, } impl<'a> Tui<'a> { pub fn new( settings: &'a crate::Settings, - data: &'a (Header, ProcList), + data: &'a (Header, ProcList, Option), stat: &'a mut TuiStat, ) -> Self { Self { settings, header: &data.0, proc_list: &data.1, + info_bar: &data.2, stat, } } @@ -66,6 +68,19 @@ impl<'a> Tui<'a> { height } + fn calc_info_bar_height(&self, width: u16) -> u16 { + if let Some(info_bar) = &self.info_bar { + let lines: u16 = info_bar + .content + .lines() + .map(|s| (s.len() as u16).div_ceil(width)) + .sum(); + lines + 1 // 1 for title + } else { + 0 + } + } + fn calc_list_coordinates(&self) -> (usize, usize) { let list_total = self.proc_list.collected.len(); let list_offset = self.stat.list_offset; @@ -506,6 +521,19 @@ impl<'a> Tui<'a> { let table = Table::new(rows, constraints.clone()).header(header); StatefulWidget::render(table, area, buf, &mut state); } + + fn render_info_bar(&self, area: Rect, buf: &mut Buffer) { + if let Some(info_bar) = self.info_bar.as_ref() { + let constraints = [Constraint::Length(1), Constraint::Min(1)]; + let layout = Layout::new(Direction::Vertical, constraints).split(area); + Line::from(Span::styled( + format!("{: { @@ -524,6 +552,7 @@ impl Widget for Tui<'_> { Constraint::Length(self.calc_header_height()), Constraint::Length(1), Constraint::Min(0), + Constraint::Length(self.calc_info_bar_height(area.width)), ], ) .split(area); @@ -536,5 +565,6 @@ impl Widget for Tui<'_> { list_area.height = list_height; } self.render_list(list_area, buf); + self.render_info_bar(layout[3], buf); } }