@@ -497,7 +497,7 @@ impl Tab {
497497 Self :: display_text ( & mut req. draw_ctx , buffered) . await ?;
498498 None
499499 } else {
500- Self :: display_download ( & mut req . draw_ctx , req. url . clone ( ) , buffered) . await ?;
500+ self . display_download ( req. url . clone ( ) , buffered) . await ?;
501501 None
502502 }
503503 }
@@ -515,13 +515,7 @@ impl Tab {
515515 Ok ( link_url)
516516 }
517517
518- fn download_path ( url : & Url ) -> anyhow:: Result < std:: path:: PathBuf > {
519- let file_name = url
520- . path_segments ( )
521- . context ( "Can't divide url in segments" ) ?
522- . last ( )
523- . context ( "Can't get last url segment" ) ?;
524-
518+ fn download_path ( file_name : & str ) -> anyhow:: Result < std:: path:: PathBuf > {
525519 let mut file_name = std:: path:: PathBuf :: from ( file_name) ;
526520 loop {
527521 let mut d_path = common:: DOWNLOAD_PATH . join ( & file_name) ;
@@ -544,29 +538,32 @@ impl Tab {
544538 }
545539 }
546540 async fn display_download < T : AsyncRead + Unpin > (
547- ctx : & mut DrawCtx ,
541+ & self ,
548542 url : Url ,
549543 mut stream : T ,
550544 ) -> anyhow:: Result < ( ) > {
551- let d_path = Self :: download_path ( & url) ?;
545+ let imp = self . imp ( ) ;
546+
547+ let file_name = url
548+ . path_segments ( )
549+ . context ( "Can't divide url in segments" ) ?
550+ . last ( )
551+ . context ( "Can't get last url segment" ) ?;
552+ let d_path = Self :: download_path ( file_name) ?;
553+
554+ let page = crate :: download_page:: DownloadPage :: new ( ) ;
555+ page. imp ( ) . label . set_label ( file_name) ;
556+ imp. stack . add_child ( & page) ;
557+ imp. stack . set_visible_child ( & page) ;
558+
559+
552560
553561 let mut buffer = Vec :: with_capacity ( 8192 ) ;
554562 buffer. extend_from_slice ( & [ 0 ; 8192 ] ) ;
555563
556564 let mut read = 0 ;
557- let mut text_iter = ctx. text_buffer . end_iter ( ) ;
558- ctx. insert_paragraph (
559- & mut text_iter,
560- & format ! ( "writing to {:?}\n " , d_path. as_os_str( ) ) ,
561- ) ;
562- ctx. insert_paragraph (
563- & mut text_iter,
564- "to interrupt the download, leave this page\n " ,
565- ) ;
566-
567- let mark = ctx. text_buffer . create_mark ( None , & text_iter, true ) ;
568-
569- ctx. insert_paragraph ( & mut text_iter, "downloaded\t KB\n " ) ;
565+ let mut last_update_time = glib:: real_time ( ) ;
566+ const THROTTLE_TIME : i64 = 300_000 ; // 0.3s
570567
571568 let mut file = File :: create ( & d_path) . await ?;
572569 loop {
@@ -575,30 +572,28 @@ impl Tab {
575572 Ok ( n) => {
576573 file. write_all ( & buffer[ ..n] ) . await ?;
577574 read += n;
578- debug ! ( "lines {}" , ctx. text_buffer. line_count( ) ) ;
579- let mut progress_info_iter = ctx. text_buffer . iter_at_mark ( & mark) ;
580- ctx. text_buffer
581- . delete ( & mut progress_info_iter, & mut ctx. text_buffer . end_iter ( ) ) ;
582- ctx. insert_paragraph (
583- & mut progress_info_iter,
584- & format ! ( "downloaded\t {}KB\n " , read / 1000 ) ,
585- ) ;
575+
576+ let t = glib:: real_time ( ) ;
577+ if t - last_update_time > THROTTLE_TIME {
578+ page. imp ( ) . progress_bar . pulse ( ) ;
579+ page. imp ( ) . label_downloaded . set_text ( & format ! ( "{}KB" , read / 1000 ) ) ;
580+ last_update_time = t;
581+ }
586582 }
587583 Err ( e) if e. kind ( ) == std:: io:: ErrorKind :: Interrupted => {
588584 continue ;
589585 }
590586 Err ( e) => return Err ( e. into ( ) ) ,
591587 }
592588 }
593- let mut text_iter = ctx. text_buffer . end_iter ( ) ;
594- ctx. insert_paragraph ( & mut text_iter, "download finished!\n " ) ;
589+ page. imp ( ) . label_downloaded . set_text ( & format ! ( "{}KB" , read / 1000 ) ) ;
590+ page. imp ( ) . progress_bar . set_fraction ( 1.0 ) ;
591+ page. imp ( ) . open_btn . set_opacity ( 1.0 ) ;
592+
595593 let downloaded_file_url = format ! ( "file://{}" , d_path. as_os_str( ) . to_str( ) . unwrap( ) ) ;
596- let button = gtk:: Button :: with_label ( "Open With Default Program" ) ;
597- button. add_css_class ( "suggested-action" ) ;
598- button. connect_clicked ( move |_| {
594+ page. imp ( ) . open_btn . connect_clicked ( move |_| {
599595 gtk:: show_uri ( None :: < & gtk:: Window > , & downloaded_file_url, 0 ) ;
600596 } ) ;
601- ctx. insert_widget ( & mut text_iter, & button) ;
602597
603598 Ok ( ( ) )
604599 }
0 commit comments