@@ -468,3 +468,153 @@ where
468
468
)
469
469
}
470
470
}
471
+
472
+ /// A single-line component, that displays multiple spans containing
473
+ /// context information.
474
+ pub struct Context {
475
+ props : Props ,
476
+ }
477
+
478
+ impl Default for Context {
479
+ fn default ( ) -> Self {
480
+ Self {
481
+ props : Props :: default ( ) ,
482
+ }
483
+ . height ( 1 )
484
+ }
485
+ }
486
+
487
+ impl Context {
488
+ pub fn context ( mut self , context : String ) -> Self {
489
+ self . attr ( Attribute :: Custom ( "context" ) , AttrValue :: String ( context) ) ;
490
+ self
491
+ }
492
+
493
+ pub fn id ( mut self , id : String ) -> Self {
494
+ self . attr ( Attribute :: Custom ( "id" ) , AttrValue :: String ( id) ) ;
495
+ self
496
+ }
497
+
498
+ pub fn title ( mut self , title : String ) -> Self {
499
+ self . attr ( Attribute :: Custom ( "title" ) , AttrValue :: String ( title) ) ;
500
+ self
501
+ }
502
+
503
+ pub fn author ( mut self , author : String ) -> Self {
504
+ self . attr ( Attribute :: Custom ( "author" ) , AttrValue :: String ( author) ) ;
505
+ self
506
+ }
507
+
508
+ pub fn count ( mut self , count : String ) -> Self {
509
+ self . attr ( Attribute :: Custom ( "count" ) , AttrValue :: String ( count) ) ;
510
+ self
511
+ }
512
+
513
+ pub fn height ( mut self , h : u16 ) -> Self {
514
+ self . attr ( Attribute :: Height , AttrValue :: Size ( h) ) ;
515
+ self
516
+ }
517
+ }
518
+
519
+ impl MockComponent for Context {
520
+ fn view ( & mut self , render : & mut Frame , area : Rect ) {
521
+ if self . props . get_or ( Attribute :: Display , AttrValue :: Flag ( true ) ) == AttrValue :: Flag ( true ) {
522
+ let context = self
523
+ . props
524
+ . get_or (
525
+ Attribute :: Custom ( "context" ) ,
526
+ AttrValue :: String ( String :: new ( ) ) ,
527
+ )
528
+ . unwrap_string ( ) ;
529
+ let id = self
530
+ . props
531
+ . get_or ( Attribute :: Custom ( "id" ) , AttrValue :: String ( String :: new ( ) ) )
532
+ . unwrap_string ( ) ;
533
+ let title = self
534
+ . props
535
+ . get_or ( Attribute :: Custom ( "title" ) , AttrValue :: String ( String :: new ( ) ) )
536
+ . unwrap_string ( ) ;
537
+ let author = self
538
+ . props
539
+ . get_or (
540
+ Attribute :: Custom ( "author" ) ,
541
+ AttrValue :: String ( String :: new ( ) ) ,
542
+ )
543
+ . unwrap_string ( ) ;
544
+ let count = self
545
+ . props
546
+ . get_or ( Attribute :: Custom ( "count" ) , AttrValue :: String ( String :: new ( ) ) )
547
+ . unwrap_string ( ) ;
548
+
549
+ let context_w = context. len ( ) as u16 ;
550
+ let id_w = id. len ( ) as u16 ;
551
+ let author_w = author. len ( ) as u16 ;
552
+ let count_w = count. len ( ) as u16 ;
553
+ let title_w = area
554
+ . width
555
+ . saturating_sub ( context_w + id_w + count_w + author_w) ;
556
+
557
+ let area = TuiLayout :: default ( )
558
+ . direction ( LayoutDirection :: Horizontal )
559
+ . constraints (
560
+ [
561
+ Constraint :: Length ( context_w) ,
562
+ Constraint :: Length ( id_w) ,
563
+ Constraint :: Length ( title_w) ,
564
+ Constraint :: Length ( author_w) ,
565
+ Constraint :: Length ( count_w) ,
566
+ ]
567
+ . as_ref ( ) ,
568
+ )
569
+ . split ( area) ;
570
+
571
+ let context =
572
+ Paragraph :: new ( context) . style ( Style :: default ( ) . bg ( Color :: Rgb ( 238 , 111 , 248 ) ) ) ;
573
+ render. render_widget ( context, area[ 0 ] ) ;
574
+
575
+ let id = Paragraph :: new ( id) . style (
576
+ Style :: default ( )
577
+ . fg ( Color :: Rgb ( 117 , 113 , 249 ) )
578
+ . bg ( Color :: Rgb ( 40 , 40 , 40 ) ) ,
579
+ ) ;
580
+ render. render_widget ( id, area[ 1 ] ) ;
581
+
582
+ let title = Paragraph :: new ( title) . style (
583
+ Style :: default ( )
584
+ . fg ( Color :: Rgb ( 70 , 70 , 70 ) )
585
+ . bg ( Color :: Rgb ( 40 , 40 , 40 ) ) ,
586
+ ) ;
587
+ render. render_widget ( title, area[ 2 ] ) ;
588
+
589
+ let author = Paragraph :: new ( author) . style (
590
+ Style :: default ( )
591
+ . fg ( Color :: Rgb ( 117 , 113 , 249 ) )
592
+ . bg ( Color :: Rgb ( 40 , 40 , 40 ) ) ,
593
+ ) ;
594
+ render. render_widget ( author, area[ 3 ] ) ;
595
+
596
+ let count = Paragraph :: new ( count) . style (
597
+ Style :: default ( )
598
+ . fg ( Color :: Rgb ( 70 , 70 , 70 ) )
599
+ . bg ( Color :: Rgb ( 50 , 50 , 50 ) ) ,
600
+ ) ;
601
+ render. render_widget ( count, area[ 4 ] ) ;
602
+ }
603
+ }
604
+
605
+ fn query ( & self , attr : Attribute ) -> Option < AttrValue > {
606
+ self . props . get ( attr)
607
+ }
608
+
609
+ fn attr ( & mut self , attr : Attribute , value : AttrValue ) {
610
+ self . props . set ( attr, value)
611
+ }
612
+
613
+ fn state ( & self ) -> State {
614
+ State :: None
615
+ }
616
+
617
+ fn perform ( & mut self , _cmd : Cmd ) -> CmdResult {
618
+ CmdResult :: None
619
+ }
620
+ }
0 commit comments