@@ -134,7 +134,7 @@ impl From<Kind<'_>> for history::Kind {
134134
135135pub trait LayoutMessage < ' a > {
136136 fn format (
137- & self ,
137+ & mut self ,
138138 message : & ' a data:: Message ,
139139 right_aligned_width : Option < f32 > ,
140140 max_prefix_width : Option < f32 > ,
@@ -145,7 +145,7 @@ pub trait LayoutMessage<'a> {
145145
146146impl < ' a , T > LayoutMessage < ' a > for T
147147where
148- T : Fn (
148+ T : FnMut (
149149 & ' a data:: Message ,
150150 Option < f32 > ,
151151 Option < f32 > ,
@@ -154,7 +154,7 @@ where
154154 ) -> Option < Element < ' a , Message > > ,
155155{
156156 fn format (
157- & self ,
157+ & mut self ,
158158 message : & ' a data:: Message ,
159159 right_aligned_width : Option < f32 > ,
160160 max_prefix_width : Option < f32 > ,
@@ -252,7 +252,7 @@ pub fn view<'a>(
252252 reserve_bottom_line_for_typing : bool ,
253253 config : & ' a Config ,
254254 theme : & ' a Theme ,
255- formatter : impl LayoutMessage < ' a > + ' a ,
255+ mut formatter : impl LayoutMessage < ' a > + ' a ,
256256) -> Element < ' a , Message > {
257257 let divider_font_size =
258258 config. font . size . map_or ( theme:: TEXT_SIZE , f32:: from) - 1.0 ;
@@ -345,29 +345,31 @@ pub fn view<'a>(
345345 let max_prefix_width = max_prefix_chars
346346 . map ( |len| font:: width_from_chars ( len, & config. font ) + 1.0 ) ;
347347
348- let message_rows = |last_date : Option < NaiveDate > ,
349- messages : & [ & ' a data:: Message ] | {
350- messages
351- . iter ( )
352- . scan ( Option :: < & data:: Message > :: None , |prev_message, message| {
353- let hide_timestamp =
354- if let HideConsecutiveEnabled :: Enabled ( duration) =
355- config. buffer . timestamp . hide_consecutive . enabled
356- {
357- is_consecutive_user_message (
358- message,
359- * prev_message,
360- duration,
361- )
362- } else {
363- false
364- } ;
348+ let mut message_rows =
349+ |last_date : Option < NaiveDate > , messages : & [ & ' a data:: Message ] | {
350+ messages
351+ . iter ( )
352+ . scan (
353+ Option :: < & data:: Message > :: None ,
354+ |prev_message, message| {
355+ let hide_timestamp =
356+ if let HideConsecutiveEnabled :: Enabled ( duration) =
357+ config. buffer . timestamp . hide_consecutive . enabled
358+ {
359+ is_consecutive_user_message (
360+ message,
361+ * prev_message,
362+ duration,
363+ )
364+ } else {
365+ false
366+ } ;
365367
366- let hide_nickname =
367- if let HideConsecutiveEnabled :: Enabled ( duration) =
368- config. buffer . nickname . hide_consecutive . enabled
369- {
370- !config. buffer . nickname . alignment . is_top ( )
368+ let hide_nickname =
369+ if let HideConsecutiveEnabled :: Enabled ( duration) =
370+ config. buffer . nickname . hide_consecutive . enabled
371+ {
372+ !config. buffer . nickname . alignment . is_top ( )
371373 && is_consecutive_user_message (
372374 message,
373375 * prev_message,
@@ -387,149 +389,156 @@ pub fn view<'a>(
387389 & visible_for_source,
388390 )
389391 } ) )
390- } else {
391- false
392- } ;
393-
394- * prev_message = Some ( message) ;
395-
396- Some (
397- formatter
398- . format (
399- message,
400- right_aligned_width,
401- max_prefix_width,
402- hide_timestamp,
403- hide_nickname,
392+ } else {
393+ false
394+ } ;
395+
396+ * prev_message = Some ( message) ;
397+
398+ Some (
399+ formatter
400+ . format (
401+ message,
402+ right_aligned_width,
403+ max_prefix_width,
404+ hide_timestamp,
405+ hide_nickname,
406+ )
407+ . map ( |element| ( message, element) ) ,
404408 )
405- . map ( |element| ( message , element ) ) ,
409+ } ,
406410 )
407- } )
408- . flatten ( )
409- . scan ( last_date, |last_date, ( message, element) | {
410- let date =
411- message. server_time . with_timezone ( & Local ) . date_naive ( ) ;
411+ . flatten ( )
412+ . scan ( last_date, |last_date, ( message, element) | {
413+ let date =
414+ message. server_time . with_timezone ( & Local ) . date_naive ( ) ;
412415
413- let is_new_day = last_date. is_none_or ( |prev| date != prev) ;
416+ let is_new_day = last_date. is_none_or ( |prev| date != prev) ;
414417
415- * last_date = Some ( date) ;
418+ * last_date = Some ( date) ;
416419
417- let content = if let (
418- message:: Content :: Fragments ( fragments) ,
419- Some ( previews) ,
420- ) = ( & message. content , previews)
421- {
422- let urls = eligible_preview_urls (
423- fragments
424- . iter ( )
425- . filter_map ( message:: Fragment :: url)
426- . cloned ( ) ,
427- & message. hidden_urls ,
428- config. preview . max_per_message ,
429- ) ;
420+ let content = if let (
421+ message:: Content :: Fragments ( fragments) ,
422+ Some ( previews) ,
423+ ) = ( & message. content , previews)
424+ {
425+ let urls = eligible_preview_urls (
426+ fragments
427+ . iter ( )
428+ . filter_map ( message:: Fragment :: url)
429+ . cloned ( ) ,
430+ & message. hidden_urls ,
431+ config. preview . max_per_message ,
432+ ) ;
430433
431- if !urls. is_empty ( ) {
432- let is_message_visible = state
433- . visible_url_messages
434- . contains_key ( & message. hash ) ;
434+ if !urls. is_empty ( ) {
435+ let is_message_visible = state
436+ . visible_url_messages
437+ . contains_key ( & message. hash ) ;
435438
436- let mut column = column ! [ element] . spacing ( 2 ) ;
439+ let mut column = column ! [ element] . spacing ( 2 ) ;
437440
438- for ( idx, url) in urls. iter ( ) . enumerate ( ) {
439- if let (
440- true ,
441- Some ( preview:: State :: Loaded ( preview) ) ,
442- ) = ( is_message_visible, previews. get ( url) )
443- {
444- let is_hovered =
445- state. hovered_preview . is_some_and (
446- |( a, b) | a == message. hash && b == idx,
447- ) ;
441+ for ( idx, url) in urls. iter ( ) . enumerate ( ) {
442+ if let (
443+ true ,
444+ Some ( preview:: State :: Loaded ( preview) ) ,
445+ ) = ( is_message_visible, previews. get ( url) )
446+ {
447+ let is_hovered = state
448+ . hovered_preview
449+ . is_some_and ( |( a, b) | {
450+ a == message. hash && b == idx
451+ } ) ;
452+
453+ let is_visible_for_source =
454+ if let Some ( visible_for_source) =
455+ & visible_for_source
456+ {
457+ visible_for_source (
458+ preview,
459+ message. target . source ( ) ,
460+ )
461+ } else {
462+ true
463+ } ;
448464
449- let is_visible_for_source =
450- if let Some ( visible_for_source) =
451- & visible_for_source
452- {
453- visible_for_source (
465+ if is_visible_for_source {
466+ column = column. push ( preview_row (
467+ message,
454468 preview,
455- message. target . source ( ) ,
456- )
457- } else {
458- true
459- } ;
460-
461- if is_visible_for_source {
462- column = column. push ( preview_row (
463- message,
464- preview,
465- url,
466- idx,
467- right_aligned_width,
468- max_prefix_width,
469- is_hovered,
470- config,
471- theme,
472- ) ) ;
469+ url,
470+ idx,
471+ right_aligned_width,
472+ max_prefix_width,
473+ is_hovered,
474+ config,
475+ theme,
476+ ) ) ;
477+ }
473478 }
474479 }
475- }
476480
477- if is_message_visible {
478- notify_visibility (
479- column,
480- 2000.0 ,
481- notify_visibility:: When :: NotVisible ,
482- message. hash ,
483- Message :: ExitingViewport ( message. hash ) ,
484- )
481+ if is_message_visible {
482+ notify_visibility (
483+ column,
484+ 2000.0 ,
485+ notify_visibility:: When :: NotVisible ,
486+ message. hash ,
487+ Message :: ExitingViewport ( message. hash ) ,
488+ )
489+ } else {
490+ notify_visibility (
491+ column,
492+ 1000.0 ,
493+ notify_visibility:: When :: Visible ,
494+ message. hash ,
495+ Message :: EnteringViewport (
496+ message. hash ,
497+ urls,
498+ ) ,
499+ )
500+ }
485501 } else {
486- notify_visibility (
487- column,
488- 1000.0 ,
489- notify_visibility:: When :: Visible ,
490- message. hash ,
491- Message :: EnteringViewport ( message. hash , urls) ,
492- )
502+ element
493503 }
494504 } else {
495505 element
496- }
497- } else {
498- element
499- } ;
506+ } ;
500507
501- let content = if is_new_day
502- && config. buffer . date_separators . show
503- {
504- column ! [
505- row![
506- container( rule:: horizontal( 1 ) )
507- . width( Length :: Fill )
508- . padding( padding:: right( 6 ) ) ,
509- text( config. buffer. format_date_separator( & date) )
508+ let content = if is_new_day
509+ && config. buffer . date_separators . show
510+ {
511+ column ! [
512+ row![
513+ container( rule:: horizontal( 1 ) )
514+ . width( Length :: Fill )
515+ . padding( padding:: right( 6 ) ) ,
516+ text(
517+ config. buffer. format_date_separator( & date)
518+ )
510519 . size( divider_font_size)
511520 . style( theme:: text:: secondary)
512521 . font_maybe(
513522 theme:: font_style:: secondary( theme)
514523 . map( font:: get)
515524 ) ,
516- container( rule:: horizontal( 1 ) )
517- . width( Length :: Fill )
518- . padding( padding:: left( 6 ) )
525+ container( rule:: horizontal( 1 ) )
526+ . width( Length :: Fill )
527+ . padding( padding:: left( 6 ) )
528+ ]
529+ . padding( 2 )
530+ . align_y( iced:: Alignment :: Center ) ,
531+ content
519532 ]
520- . padding ( 2 )
521- . align_y ( iced :: Alignment :: Center ) ,
533+ . into ( )
534+ } else {
522535 content
523- ]
524- . into ( )
525- } else {
526- content
527- } ;
536+ } ;
528537
529- Some ( keyed ( keyed:: Key :: message ( message) , content) )
530- } )
531- . collect :: < Vec < _ > > ( )
532- } ;
538+ Some ( keyed ( keyed:: Key :: message ( message) , content) )
539+ } )
540+ . collect :: < Vec < _ > > ( )
541+ } ;
533542
534543 let line_spacing = config. buffer . line_spacing ;
535544
0 commit comments