1
1
use std:: path:: PathBuf ;
2
2
use std:: sync:: atomic:: Ordering ;
3
3
4
- use super :: { add_deref_to_cell , ORANGE , PURPLE , RED } ;
4
+ use super :: { add_deref_to_span , apply_val_color , ORANGE , PURPLE , RED } ;
5
5
6
- use ratatui:: layout:: Constraint ;
7
6
use ratatui:: prelude:: Stylize ;
8
- use ratatui:: widgets:: { Block , Borders , Cell , Table } ;
9
- use ratatui:: { layout:: Rect , style:: Style , widgets:: Row , Frame } ;
7
+ use ratatui:: text:: { Line , Span , Text } ;
8
+ use ratatui:: widgets:: { Block , Borders , Paragraph } ;
9
+ use ratatui:: { layout:: Rect , style:: Style , Frame } ;
10
10
11
11
use crate :: register:: RegisterStorage ;
12
12
use crate :: App ;
@@ -15,7 +15,7 @@ use crate::App;
15
15
pub fn draw_registers ( app : & App , f : & mut Frame , register : Rect ) {
16
16
let block = Block :: default ( ) . borders ( Borders :: TOP ) . title ( "Registers" . fg ( ORANGE ) ) ;
17
17
18
- let mut rows = vec ! [ ] ;
18
+ let mut lines = vec ! [ ] ;
19
19
let mut longest_register_name = 0 ;
20
20
let mut longest_extra_val = 0 ;
21
21
@@ -25,8 +25,17 @@ pub fn draw_registers(app: &App, f: &mut Frame, register: Rect) {
25
25
return ;
26
26
}
27
27
28
+ // find longest register name
29
+ // TODO: cache this
28
30
let reg_changed_lock = app. register_changed . lock ( ) . unwrap ( ) ;
29
31
let filepath_lock = app. filepath . lock ( ) . unwrap ( ) ;
32
+ for RegisterStorage { name, register : _, deref : _ } in regs. iter ( ) {
33
+ if longest_register_name < name. len ( ) {
34
+ longest_register_name = name. len ( ) ;
35
+ }
36
+ }
37
+ let width: usize = if app. thirty_two_bit . load ( Ordering :: Relaxed ) { 11 } else { 19 } ;
38
+
30
39
let empty = PathBuf :: from ( "" ) ;
31
40
let binding = filepath_lock. as_ref ( ) . unwrap_or ( & empty) ;
32
41
let filepath = binding. to_string_lossy ( ) ;
@@ -38,44 +47,48 @@ pub fn draw_registers(app: &App, f: &mut Frame, register: Rect) {
38
47
if let Some ( reg_value) = & reg. value {
39
48
if let Ok ( val) = u64:: from_str_radix ( & reg_value[ 2 ..] , 16 ) {
40
49
let changed = reg_changed_lock. contains ( & ( i as u8 ) ) ;
41
- if longest_register_name < name . len ( ) {
42
- longest_register_name = name. len ( ) ;
43
- }
44
- let mut reg_name =
45
- Cell :: from ( format ! ( " {name}" ) ) . style ( Style :: new ( ) . fg ( PURPLE ) ) ;
50
+ let mut reg_name = Span :: from ( format ! (
51
+ " { name:width$}" ,
52
+ width = longest_register_name - 2
53
+ ) )
54
+ . style ( Style :: new ( ) . fg ( PURPLE ) ) ;
46
55
let ( is_stack, is_heap, is_text) = app. classify_val ( val, & filepath) ;
47
56
48
57
let mut extra_derefs = Vec :: new ( ) ;
49
- add_deref_to_cell (
58
+ add_deref_to_span (
50
59
deref,
51
60
& mut extra_derefs,
52
61
app,
53
62
& filepath,
54
63
& mut longest_extra_val,
64
+ width,
55
65
) ;
56
66
57
- let mut cell = Cell :: from ( format ! ( "➛ {}" , reg. value. clone( ) . unwrap( ) ) ) ;
58
- super :: apply_val_color ( & mut cell, is_stack, is_heap, is_text) ;
67
+ let hex_string = format ! ( "{}" , reg. value. as_ref( ) . unwrap( ) ) ;
68
+ let hex_width = hex_string. len ( ) ;
69
+ let padding_width = width. saturating_sub ( hex_width) ;
70
+ let mut span = Span :: from ( format ! (
71
+ "➛ {}{:padding$}" ,
72
+ hex_string,
73
+ "" ,
74
+ padding = padding_width
75
+ ) ) ;
76
+ apply_val_color ( & mut span, is_stack, is_heap, is_text) ;
59
77
60
78
// Apply color to reg name
61
79
if changed {
62
80
reg_name = reg_name. style ( Style :: new ( ) . fg ( RED ) ) ;
63
81
}
64
- let mut row = vec ! [ reg_name, cell ] ;
65
- row . append ( & mut extra_derefs) ;
66
- rows . push ( Row :: new ( row ) ) ;
82
+ let mut line = Line :: from ( vec ! [ reg_name, span ] ) ;
83
+ line . spans . append ( & mut extra_derefs) ;
84
+ lines . push ( line ) ;
67
85
}
68
86
}
69
87
}
70
88
}
71
89
}
72
90
73
- let mut widths = vec ! [ Constraint :: Length ( longest_register_name as u16 ) ] ;
74
- if app. thirty_two_bit . load ( Ordering :: Relaxed ) {
75
- widths. append ( & mut vec ! [ Constraint :: Length ( 11 ) ; longest_extra_val + 1 ] ) ;
76
- } else {
77
- widths. append ( & mut vec ! [ Constraint :: Length ( 20 ) ; longest_extra_val + 1 ] ) ;
78
- }
79
- let table = Table :: new ( rows, widths) . block ( block) ;
80
- f. render_widget ( table, register) ;
91
+ let text = Text :: from ( lines) ;
92
+ let paragraph = Paragraph :: new ( text) . block ( block) ;
93
+ f. render_widget ( paragraph, register) ;
81
94
}
0 commit comments