Skip to content

Commit 8c0bab5

Browse files
committed
top: tui impl ^e
1 parent 6af80ef commit 8c0bab5

File tree

4 files changed

+101
-37
lines changed

4 files changed

+101
-37
lines changed

src/uu/top/src/picker.rs

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// For the full copyright and license information, please view the LICENSE
44
// file that was distributed with this source code.
55

6-
use crate::tui::stat::TuiStat;
6+
use crate::tui::stat::{TimeScale, TuiStat};
77
use crate::Settings;
88
use std::any::Any;
99
use std::cmp::Ordering;
@@ -24,13 +24,13 @@ pub fn sysinfo() -> &'static RwLock<System> {
2424
}
2525

2626
pub trait Column {
27-
fn as_string(&self, show_zeros: bool) -> String;
27+
fn as_string(&self, tui_stat: &TuiStat) -> String;
2828
fn cmp_dyn(&self, other: &dyn Column) -> Ordering;
2929
fn as_any(&self) -> &dyn Any;
3030
}
3131

3232
impl Column for String {
33-
fn as_string(&self, _show_zeros: bool) -> String {
33+
fn as_string(&self, _tui_stat: &TuiStat) -> String {
3434
self.clone()
3535
}
3636

@@ -47,8 +47,8 @@ impl Column for String {
4747
}
4848

4949
impl Column for u32 {
50-
fn as_string(&self, show_zeros: bool) -> String {
51-
if !show_zeros && self == &0 {
50+
fn as_string(&self, tui_stat: &TuiStat) -> String {
51+
if !tui_stat.show_zeros && self == &0 {
5252
return String::new();
5353
}
5454
self.to_string()
@@ -67,8 +67,8 @@ impl Column for u32 {
6767
}
6868

6969
impl Column for Option<i32> {
70-
fn as_string(&self, show_zeros: bool) -> String {
71-
if !show_zeros && self == &Some(0) {
70+
fn as_string(&self, tui_stat: &TuiStat) -> String {
71+
if !tui_stat.show_zeros && self == &Some(0) {
7272
return String::new();
7373
}
7474
self.map(|v| v.to_string()).unwrap_or_default()
@@ -102,8 +102,8 @@ impl PercentValue {
102102
}
103103

104104
impl Column for PercentValue {
105-
fn as_string(&self, show_zeros: bool) -> String {
106-
if !show_zeros && self.value == 0.0 {
105+
fn as_string(&self, tui_stat: &TuiStat) -> String {
106+
if !tui_stat.show_zeros && self.value == 0.0 {
107107
return String::new();
108108
}
109109
format!("{:.1}", self.value)
@@ -132,8 +132,8 @@ impl MemValue {
132132
}
133133

134134
impl Column for MemValue {
135-
fn as_string(&self, show_zeros: bool) -> String {
136-
if !show_zeros && self.value == 0 {
135+
fn as_string(&self, tui_stat: &TuiStat) -> String {
136+
if !tui_stat.show_zeros && self.value == 0 {
137137
return String::new();
138138
}
139139
let mem_mb = self.value as f64 / bytesize::MIB as f64;
@@ -156,33 +156,63 @@ impl Column for MemValue {
156156
}
157157
}
158158

159-
struct TimeMSValue {
160-
min: u64,
159+
struct TimeValue {
161160
sec: f64,
162161
}
163162

164-
impl TimeMSValue {
165-
fn new_boxed(min: u64, sec: f64) -> Box<Self> {
166-
Box::new(Self { min, sec })
163+
impl TimeValue {
164+
fn new_boxed(sec: f64) -> Box<Self> {
165+
Box::new(Self { sec })
167166
}
168167
}
169168

170-
impl Column for TimeMSValue {
171-
fn as_string(&self, show_zeros: bool) -> String {
172-
if !show_zeros && self.min == 0 && self.sec < 0.01 {
169+
impl Column for TimeValue {
170+
fn as_string(&self, tui_stat: &TuiStat) -> String {
171+
if !tui_stat.show_zeros && self.sec < 0.01 {
173172
return String::new();
174173
}
175-
format!("{}:{:0>5.2}", self.min, self.sec)
174+
match tui_stat.time_scale {
175+
TimeScale::MinSecondCent => {
176+
let min = (self.sec / 60.0).floor() as u32;
177+
let sec = self.sec - (min * 60) as f64;
178+
format!("{}:{:0>5.2}", min, sec)
179+
}
180+
TimeScale::MinSecond => {
181+
let min = (self.sec / 60.0).floor() as u32;
182+
let sec = (self.sec - (min * 60) as f64).floor() as u32;
183+
format!("{}:{:0>2}", min, sec)
184+
}
185+
TimeScale::HourMin => {
186+
let hour = (self.sec / 3600.0).floor() as u32;
187+
let min = ((self.sec - (hour * 3600) as f64) / 60.0).floor() as u32;
188+
format!("{},{:0>2}", hour, min)
189+
}
190+
TimeScale::DayHour => {
191+
let day = (self.sec / 86400.0).floor() as u32;
192+
let hour = ((self.sec - (day * 86400) as f64) / 3600.0).floor() as u32;
193+
format!("{}d+{}h", day, hour)
194+
}
195+
TimeScale::Day => {
196+
let day = (self.sec / 86400.0).floor() as u32;
197+
format!("{}d", day)
198+
}
199+
TimeScale::WeekDay => {
200+
let week = (self.sec / 604800.0).floor() as u32;
201+
let day = ((self.sec - (week * 604800) as f64) / 86400.0).floor() as u32;
202+
format!("{}w+{}d", week, day)
203+
}
204+
TimeScale::Week => {
205+
let week = (self.sec / 604800.0).floor() as u32;
206+
format!("{}w", week)
207+
}
208+
}
176209
}
177210

178211
fn cmp_dyn(&self, other: &dyn Column) -> Ordering {
179212
other
180213
.as_any()
181-
.downcast_ref::<TimeMSValue>()
182-
.map(|o| match self.min.cmp(&o.min) {
183-
Ordering::Equal => self.sec.partial_cmp(&o.sec).unwrap_or(Ordering::Equal),
184-
ord => ord,
185-
})
214+
.downcast_ref::<TimeValue>()
215+
.map(|o| self.sec.partial_cmp(&o.sec).unwrap_or(Ordering::Equal))
186216
.unwrap_or(Ordering::Equal)
187217
}
188218
fn as_any(&self) -> &dyn Any {
@@ -383,18 +413,12 @@ fn s(pid: u32, _stat: Stat) -> Box<dyn Column> {
383413
fn time_plus(pid: u32, _stat: Stat) -> Box<dyn Column> {
384414
let binding = sysinfo().read().unwrap();
385415
let Some(proc) = binding.process(Pid::from_u32(pid)) else {
386-
return TimeMSValue::new_boxed(0, 0.0);
416+
return TimeValue::new_boxed(0.0);
387417
};
388418

389-
let (min, sec) = {
390-
let total = proc.accumulated_cpu_time();
391-
let minute = total / (60 * 1000);
392-
let second = (total % (60 * 1000)) as f64 / 1000.0;
393-
394-
(minute, second)
395-
};
419+
let second = proc.accumulated_cpu_time() as f64 / 1000.0;
396420

397-
TimeMSValue::new_boxed(min, sec)
421+
TimeValue::new_boxed(second)
398422
}
399423

400424
fn mem(pid: u32, _stat: Stat) -> Box<dyn Column> {

src/uu/top/src/top.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ fn collect(settings: &Settings, fields: &[String], tui_stat: &TuiStat) -> Vec<Ve
233233
.into_iter()
234234
.map(|it| {
235235
it.into_iter()
236-
.map(|c| c.as_string(tui_stat.show_zeros))
236+
.map(|c| c.as_string(tui_stat))
237237
.collect()
238238
})
239239
.collect()

src/uu/top/src/tui/input.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,19 @@ pub fn handle_input(
8484

8585
should_update.store(true, Ordering::Relaxed);
8686
}
87+
Event::Key(KeyEvent {
88+
code: KeyCode::Char('e'),
89+
modifiers: KeyModifiers::CONTROL,
90+
..
91+
}) => {
92+
{
93+
let mut stat = tui_stat.write().unwrap();
94+
stat.time_scale = stat.time_scale.next();
95+
}
96+
97+
data.write().unwrap().1 = ProcList::new(settings, &tui_stat.read().unwrap());
98+
should_update.store(true, Ordering::Relaxed);
99+
}
87100
char!('I') => {
88101
{
89102
let mut stat = tui_stat.write().unwrap();

src/uu/top/src/tui/stat.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub(crate) struct TuiStat {
3232
pub show_zeros: bool,
3333
pub irix_mode: bool,
3434
pub width_increment: Option<usize>, // None means auto
35+
pub time_scale: TimeScale,
3536

3637
pub filter: Option<crate::Filter>,
3738
}
@@ -69,7 +70,8 @@ impl TuiStat {
6970
show_coordinates: false,
7071
show_zeros: true,
7172
irix_mode: true,
72-
width_increment: None,
73+
width_increment: Some(0), // fixed
74+
time_scale: TimeScale::default(),
7375

7476
filter: None,
7577
}
@@ -123,7 +125,6 @@ impl CpuValueMode {
123125
}
124126
}
125127

126-
#[allow(unused)]
127128
#[derive(Debug, Default, PartialEq)]
128129
pub enum MemoryGraphMode {
129130
#[default]
@@ -143,3 +144,29 @@ impl MemoryGraphMode {
143144
}
144145
}
145146
}
147+
148+
#[derive(Debug, Default, PartialEq)]
149+
pub enum TimeScale {
150+
#[default]
151+
MinSecondCent, // 00:00.00
152+
MinSecond, // 00:00
153+
HourMin, // 0,00
154+
DayHour, // 0d+0h
155+
Day, // 0d
156+
WeekDay, // 0w+0d
157+
Week, // 0w
158+
}
159+
160+
impl TimeScale {
161+
pub fn next(&self) -> TimeScale {
162+
match self {
163+
TimeScale::MinSecondCent => TimeScale::MinSecond,
164+
TimeScale::MinSecond => TimeScale::HourMin,
165+
TimeScale::HourMin => TimeScale::DayHour,
166+
TimeScale::DayHour => TimeScale::Day,
167+
TimeScale::Day => TimeScale::WeekDay,
168+
TimeScale::WeekDay => TimeScale::Week,
169+
TimeScale::Week => TimeScale::MinSecondCent,
170+
}
171+
}
172+
}

0 commit comments

Comments
 (0)