@@ -24,7 +24,16 @@ pub struct Tui {
2424 pub last_status : String ,
2525}
2626
27+ const HELP : & str = "j/▲⋮k/▼⋮l/o/▶ - CD⋮m - Mount⋮u - Unmount⋮e - Eject⋮q - Quit" ;
28+
2729impl Tui {
30+ fn set_status ( & mut self , res : udisks2:: Result < ( ) > ) {
31+ self . last_status = match res {
32+ Ok ( ( ) ) => String :: from ( "Ok" ) ,
33+ Err ( e) => format ! ( "Error: {e:?}" ) ,
34+ }
35+ }
36+
2837 pub async fn input ( & mut self , key : KeyEvent ) -> InputResult {
2938 match key. code {
3039 KeyCode :: Up | KeyCode :: Char ( 'k' ) => {
@@ -37,21 +46,31 @@ impl Tui {
3746 }
3847 KeyCode :: Char ( 'm' ) => {
3948 if let Some ( b) = & self . selected {
40- self . last_status = format ! ( "{:?}" , drives:: mount( b) . await ) ;
49+ self . set_status ( drives:: mount ( b) . await ) ;
4150 }
4251 InputResult :: None
4352 }
4453 KeyCode :: Char ( 'u' ) => {
4554 if let Some ( b) = & self . selected {
46- self . last_status = format ! ( "{:?}" , drives:: unmount( b) . await ) ;
55+ self . set_status ( drives:: unmount ( b) . await ) ;
4756 }
4857 InputResult :: None
4958 }
50- KeyCode :: Esc | KeyCode :: Char ( 'q' ) => InputResult :: Quit ,
51- KeyCode :: Enter => {
52- let output = self . selected . clone ( ) . unwrap ( ) . mount . unwrap ( ) ;
53- InputResult :: QuitChangeDirectory ( output)
59+ KeyCode :: Char ( 'e' ) => {
60+ if let Some ( b) = & self . selected {
61+ self . set_status ( drives:: eject ( b) . await ) ;
62+ }
63+ InputResult :: None
5464 }
65+ KeyCode :: Enter | KeyCode :: Char ( 'l' | 'o' ) => {
66+ if let Some ( s) = & self . selected {
67+ let output = s. clone ( ) . mount . unwrap_or_default ( ) ;
68+ InputResult :: QuitChangeDirectory ( output)
69+ } else {
70+ InputResult :: Quit
71+ }
72+ }
73+ KeyCode :: Esc | KeyCode :: Char ( 'q' ) => InputResult :: Quit ,
5574 _ => InputResult :: None ,
5675 }
5776 }
@@ -81,11 +100,20 @@ impl Tui {
81100 . and_then ( |n| rows. get ( n) . cloned ( ) )
82101 . clone_into ( & mut self . selected ) ;
83102
103+ let max_size_field_length: u16 = rows
104+ . iter ( )
105+ . map ( |r| r. size . len ( ) )
106+ . max ( )
107+ . unwrap_or ( 0 )
108+ . try_into ( )
109+ . unwrap_or ( 0 ) ;
110+
84111 let rows = rows. iter ( ) . map ( |i| {
85112 Row :: new ( vec ! [
86113 i. dev. clone( ) ,
87114 i. label. clone( ) ,
88115 i. mount. clone( ) . unwrap_or_default( ) ,
116+ i. size. clone( ) ,
89117 if i. mounted {
90118 "M" . to_owned( )
91119 } else {
@@ -97,7 +125,8 @@ impl Tui {
97125 Constraint :: Ratio ( 1 , 3 ) ,
98126 Constraint :: Ratio ( 1 , 3 ) ,
99127 Constraint :: Ratio ( 1 , 3 ) ,
100- Constraint :: Length ( 3 ) ,
128+ Constraint :: Length ( max_size_field_length) ,
129+ Constraint :: Length ( 1 ) ,
101130 ] ;
102131 let table = Table :: new ( rows, widths)
103132 . row_highlight_style ( Color :: Green )
@@ -123,18 +152,14 @@ impl Tui {
123152 } ;
124153
125154 format ! (
126- "dev: {:?} label: {:?} type: {:?} {mounted} " ,
127- s. dev, s. label, s. fstype
155+ "dev: {:?} label: {:?} type: {:?} size {} {mounted} " ,
156+ s. dev, s. label, s. fstype, s . size
128157 )
129158 }
130159 None => String :: new ( ) ,
131160 } ;
132161
133- let info = format ! (
134- "j - UP, k - DOWN, l - Goto mountpoint, m - Mount, u - Unmount, e - Eject\n {descr} {:?}" ,
135- self . last_status
136- ) ;
137-
162+ let info = format ! ( "{} | {HELP}\n {descr}" , self . last_status) ;
138163 let info = Paragraph :: new ( info) . wrap ( Wrap { trim : true } ) ;
139164 frame. render_widget ( info, layout[ 1 ] ) ;
140165 }
0 commit comments