@@ -48,6 +48,8 @@ pub struct App { |
| 48 | show_legend: bool, | 48 | show_legend: bool, |
| 49 | /// Freeze mode - pause process list updates for navigation | 49 | /// Freeze mode - pause process list updates for navigation |
| 50 | frozen: bool, | 50 | frozen: bool, |
| | 51 | + /// Tree view mode - show process hierarchy |
| | 52 | + tree_view: bool, |
| 51 | /// Search mode - filter processes by name | 53 | /// Search mode - filter processes by name |
| 52 | search_mode: bool, | 54 | search_mode: bool, |
| 53 | /// Search query string | 55 | /// Search query string |
@@ -149,6 +151,7 @@ impl App { |
| 149 | refresh_interval, | 151 | refresh_interval, |
| 150 | show_legend, | 152 | show_legend, |
| 151 | frozen: false, | 153 | frozen: false, |
| | 154 | + tree_view: false, |
| 152 | search_mode: false, | 155 | search_mode: false, |
| 153 | search_query: String::new(), | 156 | search_query: String::new(), |
| 154 | show_help: false, | 157 | show_help: false, |
@@ -473,6 +476,7 @@ impl App { |
| 473 | ("Home / End", "First / last"), | 476 | ("Home / End", "First / last"), |
| 474 | ("PgUp/PgDn", "Jump 10 rows"), | 477 | ("PgUp/PgDn", "Jump 10 rows"), |
| 475 | ("Enter", "Process detail"), | 478 | ("Enter", "Process detail"), |
| | 479 | + ("t", "Tree view toggle"), |
| 476 | ("", ""), | 480 | ("", ""), |
| 477 | ("Alt+f", "Freeze list"), | 481 | ("Alt+f", "Freeze list"), |
| 478 | ("/", "Search filter"), | 482 | ("/", "Search filter"), |
@@ -1099,7 +1103,7 @@ impl App { |
| 1099 | }; | 1103 | }; |
| 1100 | | 1104 | |
| 1101 | // Render process list with filtered processes | 1105 | // Render process list with filtered processes |
| 1102 | - self.process_list.render(&self.renderer, &self.theme, &display_processes)?; | 1106 | + self.process_list.render(&self.renderer, &self.theme, &display_processes, self.tree_view)?; |
| 1103 | | 1107 | |
| 1104 | Ok(()) | 1108 | Ok(()) |
| 1105 | } | 1109 | } |
@@ -1418,6 +1422,10 @@ impl App { |
| 1418 | Key::Char('r') => { | 1422 | Key::Char('r') => { |
| 1419 | self.last_refresh = Instant::now() - std::time::Duration::from_secs(10); | 1423 | self.last_refresh = Instant::now() - std::time::Duration::from_secs(10); |
| 1420 | } | 1424 | } |
| | 1425 | + Key::Char('t') => { |
| | 1426 | + self.tree_view = !self.tree_view; |
| | 1427 | + ev_loop.request_redraw(); |
| | 1428 | + } |
| 1421 | Key::Char('1') => { | 1429 | Key::Char('1') => { |
| 1422 | self.tab_bar.set_active(Tab::Cpu); | 1430 | self.tab_bar.set_active(Tab::Cpu); |
| 1423 | self.sort_processes(SortField::Cpu); | 1431 | self.sort_processes(SortField::Cpu); |