@@ -136,7 +136,7 @@ impl From<Kind<'_>> for history::Kind {
136136
137137pub trait LayoutMessage < ' a > {
138138 fn format (
139- & self ,
139+ & mut self ,
140140 message : & ' a data:: Message ,
141141 right_aligned_width : Option < f32 > ,
142142 max_prefix_width : Option < f32 > ,
@@ -147,7 +147,7 @@ pub trait LayoutMessage<'a> {
147147
148148impl < ' a , T > LayoutMessage < ' a > for T
149149where
150- T : Fn (
150+ T : FnMut (
151151 & ' a data:: Message ,
152152 Option < f32 > ,
153153 Option < f32 > ,
@@ -156,7 +156,7 @@ where
156156 ) -> Option < Element < ' a , Message > > ,
157157{
158158 fn format (
159- & self ,
159+ & mut self ,
160160 message : & ' a data:: Message ,
161161 right_aligned_width : Option < f32 > ,
162162 max_prefix_width : Option < f32 > ,
@@ -255,7 +255,7 @@ pub fn view<'a>(
255255 reserve_bottom_line_for_typing : bool ,
256256 config : & ' a Config ,
257257 theme : & ' a Theme ,
258- formatter : impl LayoutMessage < ' a > + ' a ,
258+ mut formatter : impl LayoutMessage < ' a > + ' a ,
259259) -> Element < ' a , Message > {
260260 let divider_font_size =
261261 config. font . size . map_or ( theme:: TEXT_SIZE , f32:: from) - 1.0 ;
@@ -348,29 +348,31 @@ pub fn view<'a>(
348348 let max_prefix_width = max_prefix_chars
349349 . map ( |len| font:: width_from_chars ( len, & config. font ) + 1.0 ) ;
350350
351- let message_rows = |last_date : Option < NaiveDate > ,
352- messages : & [ & ' a data:: Message ] | {
353- messages
354- . iter ( )
355- . scan ( Option :: < & data:: Message > :: None , |prev_message, message| {
356- let hide_timestamp =
357- if let HideConsecutiveEnabled :: Enabled ( duration) =
358- config. buffer . timestamp . hide_consecutive . enabled
359- {
360- is_consecutive_user_message (
361- message,
362- * prev_message,
363- duration,
364- )
365- } else {
366- false
367- } ;
351+ let mut message_rows =
352+ |last_date : Option < NaiveDate > , messages : & [ & ' a data:: Message ] | {
353+ messages
354+ . iter ( )
355+ . scan (
356+ Option :: < & data:: Message > :: None ,
357+ |prev_message, message| {
358+ let hide_timestamp =
359+ if let HideConsecutiveEnabled :: Enabled ( duration) =
360+ config. buffer . timestamp . hide_consecutive . enabled
361+ {
362+ is_consecutive_user_message (
363+ message,
364+ * prev_message,
365+ duration,
366+ )
367+ } else {
368+ false
369+ } ;
368370
369- let hide_nickname =
370- if let HideConsecutiveEnabled :: Enabled ( duration) =
371- config. buffer . nickname . hide_consecutive . enabled
372- {
373- !config. buffer . nickname . alignment . is_top ( )
371+ let hide_nickname =
372+ if let HideConsecutiveEnabled :: Enabled ( duration) =
373+ config. buffer . nickname . hide_consecutive . enabled
374+ {
375+ !config. buffer . nickname . alignment . is_top ( )
374376 && is_consecutive_user_message (
375377 message,
376378 * prev_message,
@@ -390,146 +392,153 @@ pub fn view<'a>(
390392 & visible_for_source,
391393 )
392394 } ) )
393- } else {
394- false
395- } ;
396-
397- * prev_message = Some ( message) ;
398-
399- Some (
400- formatter
401- . format (
402- message,
403- right_aligned_width,
404- max_prefix_width,
405- hide_timestamp,
406- hide_nickname,
395+ } else {
396+ false
397+ } ;
398+
399+ * prev_message = Some ( message) ;
400+
401+ Some (
402+ formatter
403+ . format (
404+ message,
405+ right_aligned_width,
406+ max_prefix_width,
407+ hide_timestamp,
408+ hide_nickname,
409+ )
410+ . map ( |element| ( message, element) ) ,
407411 )
408- . map ( |element| ( message , element ) ) ,
412+ } ,
409413 )
410- } )
411- . flatten ( )
412- . scan ( last_date, |last_date, ( message, element) | {
413- let date =
414- message. server_time . with_timezone ( & Local ) . date_naive ( ) ;
414+ . flatten ( )
415+ . scan ( last_date, |last_date, ( message, element) | {
416+ let date =
417+ message. server_time . with_timezone ( & Local ) . date_naive ( ) ;
415418
416- let is_new_day = last_date. is_none_or ( |prev| date != prev) ;
419+ let is_new_day = last_date. is_none_or ( |prev| date != prev) ;
417420
418- * last_date = Some ( date) ;
421+ * last_date = Some ( date) ;
419422
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. iter ( ) . filter_map ( message:: Fragment :: url) ,
427- & message. hidden_urls ,
428- config. preview . max_per_message ,
429- ) ;
423+ let content = if let (
424+ message:: Content :: Fragments ( fragments) ,
425+ Some ( previews) ,
426+ ) = ( & message. content , previews)
427+ {
428+ let urls = eligible_preview_urls (
429+ fragments. iter ( ) . filter_map ( message:: Fragment :: url) ,
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