@@ -15,35 +15,33 @@ pub struct BrowserState<'a> {
1515 pub current_url : Option < & ' a GitHubUrl > ,
1616 pub cursor : usize ,
1717 pub scroll_offset : usize ,
18- #[ allow( dead_code) ]
1918 pub status_msg : & ' a str ,
2019 pub is_downloading : bool ,
2120 pub ascii_mode : bool ,
2221 pub folder_sizes : & ' a HashMap < String , u64 > ,
22+ pub is_searching : bool ,
23+ pub search_query : & ' a str ,
2324}
2425
2526pub fn render ( f : & mut Frame , area : Rect , state : & BrowserState ) {
26- let chunks = if state. is_downloading {
27- Layout :: default ( )
28- . direction ( Direction :: Vertical )
29- . constraints ( [
30- Constraint :: Length ( 3 ) , // Breadcrumb
31- Constraint :: Min ( 10 ) , // File list
32- Constraint :: Length ( 2 ) , // Download status
33- Constraint :: Length ( 2 ) ,
34- ] )
35- . split ( area)
36- } else {
37- Layout :: default ( )
38- . direction ( Direction :: Vertical )
39- . constraints ( [
40- Constraint :: Length ( 3 ) , // Breadcrumb
41- Constraint :: Min ( 10 ) , // File list
42- Constraint :: Length ( 1 ) , // Spacer
43- Constraint :: Length ( 2 ) ,
44- ] )
45- . split ( area)
46- } ;
27+ let chunks = Layout :: default ( )
28+ . direction ( Direction :: Vertical )
29+ . constraints ( [
30+ Constraint :: Length ( 3 ) , // Breadcrumb
31+ Constraint :: Min ( 10 ) , // File list
32+ if state. is_downloading {
33+ Constraint :: Length ( 2 )
34+ } else {
35+ Constraint :: Length ( 0 )
36+ } ,
37+ if state. is_searching {
38+ Constraint :: Length ( 3 )
39+ } else {
40+ Constraint :: Length ( 0 )
41+ } ,
42+ Constraint :: Length ( 2 ) , // Help
43+ ] )
44+ . split ( area) ;
4745
4846 let breadcrumb_text = if let Some ( url) = state. current_url {
4947 format ! ( " {}/{} : {}" , url. owner, url. repo, url. path)
@@ -161,20 +159,26 @@ pub fn render(f: &mut Frame, area: Rect, state: &BrowserState) {
161159 . unwrap_or_else ( || format ! ( "{:>12}" , "" ) )
162160 } ;
163161
164- let display_name = if item. name . len ( ) > 35 {
165- if let Some ( dot_pos) = item. name . rfind ( '.' ) {
166- let ext = & item. name [ dot_pos..] ;
167- let name_part = & item. name [ ..dot_pos] ;
162+ let source_name = if state. is_searching {
163+ & item. path
164+ } else {
165+ & item. name
166+ } ;
167+
168+ let display_name = if source_name. len ( ) > 35 {
169+ if let Some ( dot_pos) = source_name. rfind ( '.' ) {
170+ let ext = & source_name[ dot_pos..] ;
171+ let name_part = & source_name[ ..dot_pos] ;
168172 if name_part. len ( ) > 30 {
169173 format ! ( "{}.....{}" , & name_part[ ..30 ] , ext)
170174 } else {
171- item . name . clone ( )
175+ source_name . clone ( )
172176 }
173177 } else {
174- format ! ( "{}....." , & item . name [ ..35 ] )
178+ format ! ( "{}....." , & source_name [ ..35 ] )
175179 }
176180 } else {
177- item . name . clone ( )
181+ source_name . clone ( )
178182 } ;
179183
180184 let name_with_icon = format ! ( "{}{}" , icon, display_name) ;
@@ -244,6 +248,18 @@ pub fn render(f: &mut Frame, area: Rect, state: &BrowserState) {
244248 f. render_widget ( status, chunks[ 2 ] ) ;
245249 }
246250
251+ // Search Bar
252+ if state. is_searching {
253+ let search_text = state. search_query . to_string ( ) ;
254+ let search_bar = Paragraph :: new ( search_text) . block (
255+ Block :: default ( )
256+ . borders ( Borders :: ALL )
257+ . title ( " Search " )
258+ . border_style ( Style :: default ( ) . fg ( SUCCESS_COLOR ) ) ,
259+ ) ;
260+ f. render_widget ( search_bar, chunks[ 3 ] ) ;
261+ }
262+
247263 let help_spans = vec ! [
248264 Span :: styled( " " , Style :: default ( ) ) ,
249265 Span :: styled(
@@ -329,5 +345,5 @@ pub fn render(f: &mut Frame, area: Rect, state: &BrowserState) {
329345 let help = Paragraph :: new ( Line :: from ( help_spans) )
330346 . alignment ( ratatui:: layout:: Alignment :: Center )
331347 . style ( Style :: default ( ) . bg ( BG_COLOR ) ) ;
332- f. render_widget ( help, chunks[ 3 ] ) ;
348+ f. render_widget ( help, chunks[ 4 ] ) ;
333349}
0 commit comments