@@ -47,14 +47,15 @@ pub struct BodyRequest {
4747 pub generation : u64 ,
4848 pub source : BodySource ,
4949 pub mode : ReadingMode ,
50+ pub art_images : bool ,
5051}
5152
5253pub struct PreparedBody {
5354 pub classic : TextScreen ,
5455 pub modern : Option < Vec < PreparedItem > > ,
5556}
5657
57- fn prepare_body ( package : & QwkPackage , source : BodySource , mode : ReadingMode ) -> icy_mail:: Res < PreparedBody > {
58+ fn prepare_body ( package : & QwkPackage , source : BodySource , mode : ReadingMode , art_images : bool ) -> icy_mail:: Res < PreparedBody > {
5859 let ( classic, wide) = match source {
5960 BodySource :: Message ( index) => {
6061 let message = package. get_message ( index) ?;
@@ -69,7 +70,7 @@ fn prepare_body(package: &QwkPackage, source: BodySource, mode: ReadingMode) ->
6970 ( classic, wide)
7071 }
7172 } ;
72- let modern = wide. map ( |wide| modern_view:: prepare_items ( & classic, modern_view:: blocks ( & classic, & wide) ) ) ;
73+ let modern = wide. map ( |wide| modern_view:: prepare_items ( & classic, modern_view:: blocks ( & classic, & wide) , art_images ) ) ;
7374 Ok ( PreparedBody { classic, modern } )
7475}
7576
@@ -157,7 +158,7 @@ impl Default for Loader {
157158 Some ( Event :: Package ( generation, path, result) )
158159 } ) ;
159160 let bodies = latest_worker ( sender. clone ( ) , |( request, package) : ( BodyRequest , Arc < QwkPackage > ) | {
160- let result = prepare_body ( & package, request. source , request. mode ) . map_err ( |error| error. to_string ( ) ) ;
161+ let result = prepare_body ( & package, request. source , request. mode , request . art_images ) . map_err ( |error| error. to_string ( ) ) ;
161162 Some ( Event :: Body ( request, result) )
162163 } ) ;
163164 let preload_generation = Arc :: new ( AtomicU64 :: new ( 0 ) ) ;
@@ -233,13 +234,14 @@ impl Loader {
233234 . send ( ( ( self . package_generation , path, cache_directory, retention_days) , context. clone ( ) ) ) ;
234235 }
235236
236- pub fn body ( & mut self , package : Arc < QwkPackage > , source : BodySource , mode : ReadingMode , context : & egui:: Context ) {
237+ pub fn body ( & mut self , package : Arc < QwkPackage > , source : BodySource , mode : ReadingMode , art_images : bool , context : & egui:: Context ) {
237238 self . cancel_preload ( ) ;
238239 self . body_generation = self . body_generation . wrapping_add ( 1 ) ;
239240 let request = BodyRequest {
240241 generation : self . body_generation ,
241242 source,
242243 mode,
244+ art_images,
243245 } ;
244246 self . body_request = Some ( request) ;
245247 if let Err ( error) = self . bodies . send ( ( ( request, package) , context. clone ( ) ) ) {
@@ -446,6 +448,24 @@ fn latest_worker<T: Send + 'static>(events: mpsc::Sender<Event>, mut load: impl
446448mod tests {
447449 use super :: * ;
448450
451+ #[ test]
452+ fn body_worker_prepares_unicode_art_without_generating_images ( ) {
453+ let ( _dir, mut package) = crate :: packet_tests:: load ( ) ;
454+ Arc :: make_mut ( & mut package. files ) [ 0 ] . data = b"\x1b [31m\xdb \xdb \xdb \r \n \xdb \xdb \xdb \x1b [0m" . to_vec ( ) ;
455+ let context = egui:: Context :: default ( ) ;
456+ let mut loader = Loader :: default ( ) ;
457+ loader. body ( Arc :: new ( package) , BodySource :: File ( 0 , 0 ) , ReadingMode :: Modern , false , & context) ;
458+ let Event :: Body ( request, Ok ( prepared) ) = loader. receiver . recv_timeout ( std:: time:: Duration :: from_secs ( 10 ) ) . unwrap ( ) else {
459+ panic ! ( "body worker failed to prepare Unicode art" ) ;
460+ } ;
461+ assert ! ( !request. art_images) ;
462+ let items = prepared. modern . unwrap ( ) ;
463+ assert ! ( items. iter( ) . all( |item| matches!( item, PreparedItem :: Text ( _) ) ) ) ;
464+ assert ! ( items
465+ . iter( )
466+ . any( |item| matches!( item, PreparedItem :: Text ( line) if line. unwrapped && line. spans. iter( ) . any( |span| span. text. contains( '\u{2588}' ) ) ) ) ) ;
467+ }
468+
449469 #[ test]
450470 fn body_worker_prepares_modern_message_and_bulletin_content ( ) {
451471 let ( _dir, mut package) = crate :: packet_tests:: load ( ) ;
@@ -459,7 +479,7 @@ mod tests {
459479 for source in [ BodySource :: Message ( 2 ) , BodySource :: File ( 0 , 0 ) ] {
460480 for mode in [ ReadingMode :: Classic , ReadingMode :: Modern ] {
461481 let previous_preload = loader. preload_generation ( ) ;
462- loader. body ( package. clone ( ) , source, mode, & context) ;
482+ loader. body ( package. clone ( ) , source, mode, true , & context) ;
463483 assert_ne ! (
464484 loader. preload_generation( ) ,
465485 previous_preload,
@@ -477,7 +497,7 @@ mod tests {
477497 BodySource :: Message ( index) => render_body_wide ( & package. get_message ( index) . unwrap ( ) . text ) . unwrap ( ) ,
478498 BodySource :: File ( index, page) => render_file_page_wide ( & package. files [ index] . data , page) . unwrap ( ) ,
479499 } ;
480- let expected = modern_view:: prepare_items ( & prepared. classic , modern_view:: blocks ( & prepared. classic , & wide) ) ;
500+ let expected = modern_view:: prepare_items ( & prepared. classic , modern_view:: blocks ( & prepared. classic , & wide) , true ) ;
481501 assert_eq ! ( items. len( ) , expected. len( ) ) ;
482502 for ( actual, expected) in items. iter ( ) . zip ( & expected) {
483503 match ( actual, expected) {
0 commit comments