Add toggles for displaying contacts, dates, traits, tiers, and relations

d539991 · gmorell · 2025-01-16 04:17

2 files +244 -142
Message
{commit_body(@commit)}

Files changed

modified src/do_tui.rs
+244 −142
@@ -44,6 +44,11 @@ struct Tui {
44 44 ppl_input_b: Input,
45 45 ppl_input_c: Input,
46 46 ppl_detail_state: ListState,
47 + ppl_show_contacts: bool,
48 + ppl_show_dates: bool,
49 + ppl_show_traits: bool,
50 + ppl_show_tiers: bool,
51 + ppl_show_relations: bool,
47 52 def_tier_list: Vec<tier_defaults::Model>,
48 53 def_tier_state: ListState,
49 54 def_trait_list: Vec<trait_defaults::Model>,
@@ -129,6 +134,11 @@ impl Default for Tui {
129 134 ppl_input_b: Input::default(),
130 135 ppl_input_c: Input::default(),
131 136 ppl_detail_state: ListState::default(),
137 + ppl_show_contacts: true,
138 + ppl_show_dates: true,
139 + ppl_show_traits: true,
140 + ppl_show_tiers: true,
141 + ppl_show_relations: true,
132 142 def_tier_list: vec![],
133 143 def_tier_state: ListState::default(),
134 144 def_trait_list: vec![],
@@ -218,6 +228,36 @@ pub async fn run_tui(
218 228 KeyCode::Char('f') => {
219 229 default_editing_handler(&mut app, &key_event);
220 230 }
231 + KeyCode::Char('c') => {
232 + match app.current_tab {
233 + Tabs::Ppl => { app.ppl_show_contacts = !app.ppl_show_contacts }
234 + _ => {}
235 + }
236 + }
237 + KeyCode::Char('d') => {
238 + match app.current_tab {
239 + Tabs::Ppl => { app.ppl_show_dates = !app.ppl_show_dates }
240 + _ => {}
241 + }
242 + }
243 + KeyCode::Char('r') => {
244 + match app.current_tab {
245 + Tabs::Ppl => { app.ppl_show_traits = !app.ppl_show_traits }
246 + _ => {}
247 + }
248 + }
249 + KeyCode::Char('i') => {
250 + match app.current_tab {
251 + Tabs::Ppl => { app.ppl_show_tiers = !app.ppl_show_tiers }
252 + _ => {}
253 + }
254 + }
255 + KeyCode::Char('l') => {
256 + match app.current_tab {
257 + Tabs::Ppl => { app.ppl_show_relations = !app.ppl_show_relations }
258 + _ => {}
259 + }
260 + }
221 261 KeyCode::Enter => {
222 262 if app.current_tab == Tabs::Ppl {
223 263 if app.ppl_editing && app.ppl_detail_state.selected().is_some() {
@@ -350,7 +390,7 @@ fn render(f: &mut Frame, app: &mut Tui) {
350 390 Constraint::Percentage(100),
351 391 Constraint::Length(1),
352 392 ]
353 − .as_ref(),
393 + .as_ref(),
354 394 )
355 395 .split(f.area());
356 396
@@ -387,12 +427,12 @@ fn render(f: &mut Frame, app: &mut Tui) {
387 427 f.render_widget(welcome, chunks[2]);
388 428 }
389 429 false => {
390 − let msgw = vec![
430 + let mut msgw = vec![
391 431 Span::styled(
392 432 "Tab",
393 433 Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
394 434 ),
395 − Span::raw(" to switch views"),
435 + Span::raw(" to switch views. "),
396 436 Span::styled(
397 437 "Enter",
398 438 Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
@@ -401,6 +441,43 @@ fn render(f: &mut Frame, app: &mut Tui) {
401 441 Span::styled("E", Style::default().add_modifier(Modifier::BOLD).fg(WHITE)),
402 442 Span::raw(" to edit the selected ppl. "),
403 443 ];
444 + if app.ppl_show_contacts {
445 + msgw.push(Span::styled("C", Style::default().add_modifier(Modifier::BOLD).fg(WHITE)));
446 + } else {
447 + msgw.push(Span::styled("C", Style::default().add_modifier(Modifier::BOLD).fg(SLATE.c500)));
448 + }
449 + msgw.push(Span::raw("/"));
450 +
451 + if app.ppl_show_dates {
452 + msgw.push(Span::styled("D", Style::default().add_modifier(Modifier::BOLD).fg(WHITE)));
453 + } else {
454 + msgw.push(Span::styled("D", Style::default().add_modifier(Modifier::BOLD).fg(SLATE.c500)));
455 + }
456 + msgw.push(Span::raw("/"));
457 +
458 + if app.ppl_show_traits {
459 + msgw.push(Span::styled("R", Style::default().add_modifier(Modifier::BOLD).fg(WHITE)));
460 + } else {
461 + msgw.push(Span::styled("R", Style::default().add_modifier(Modifier::BOLD).fg(SLATE.c500)));
462 + }
463 + msgw.push(Span::raw("/"));
464 +
465 + if app.ppl_show_tiers {
466 + msgw.push(Span::styled("I", Style::default().add_modifier(Modifier::BOLD).fg(WHITE)));
467 + } else {
468 + msgw.push(Span::styled("I", Style::default().add_modifier(Modifier::BOLD).fg(SLATE.c500)));
469 + }
470 + msgw.push(Span::raw("/"));
471 +
472 + if app.ppl_show_relations {
473 + msgw.push(Span::styled("L", Style::default().add_modifier(Modifier::BOLD).fg(WHITE)));
474 + } else {
475 + msgw.push(Span::styled("L", Style::default().add_modifier(Modifier::BOLD).fg(SLATE.c500)));
476 + }
477 +
478 +
479 + msgw.push(Span::raw(" to toggle Contacts/Dates/tRaits/tIers/reLations"));
480 +
404 481 let textw = Text::from(Line::from(msgw)).style(Style::default());
405 482 let welcome = Paragraph::new(textw);
406 483 f.render_widget(welcome, chunks[2]);
@@ -475,29 +552,31 @@ fn render(f: &mut Frame, app: &mut Tui) {
475 552 .iter()
476 553 .filter(|t| !t.is_date && !t.is_contact)
477 554 .collect::<Vec<&trait_defaults::Model>>();
478 − for t in &curr_traits {
479 − editables.push(Editable {
480 − tgt: Editablez::Trait,
481 − id: t.id,
482 − first: t.key.clone(),
483 − second: Option::from(t.value.clone()),
484 − third: t.hidden.clone().to_string().into(),
485 − });
486 − match trait_defaults.iter().find(|f| f.key == t.key) {
487 − None => msgs.push(Line::from(vec![
488 − Span::styled(
489 − format!("ℹ️ {}: ", t.key.clone()),
490 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
491 − ),
492 − Span::raw(t.value.clone()),
493 − ])),
494 − Some(td) => msgs.push(Line::from(vec![
495 − Span::styled(
496 − format!("{} {}: ", td.symbol, t.key.clone()),
497 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
498 − ),
499 − Span::raw(t.value.clone()),
500 − ])),
555 + if app.ppl_show_traits {
556 + for t in &curr_traits {
557 + editables.push(Editable {
558 + tgt: Editablez::Trait,
559 + id: t.id,
560 + first: t.key.clone(),
561 + second: Option::from(t.value.clone()),
562 + third: t.hidden.clone().to_string().into(),
563 + });
564 + match trait_defaults.iter().find(|f| f.key == t.key) {
565 + None => msgs.push(Line::from(vec![
566 + Span::styled(
567 + format!("ℹ️ {}: ", t.key.clone()),
568 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
569 + ),
570 + Span::raw(t.value.clone()),
571 + ])),
572 + Some(td) => msgs.push(Line::from(vec![
573 + Span::styled(
574 + format!("{} {}: ", td.symbol, t.key.clone()),
575 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
576 + ),
577 + Span::raw(t.value.clone()),
578 + ])),
579 + }
501 580 }
502 581 }
503 582
@@ -508,49 +587,51 @@ fn render(f: &mut Frame, app: &mut Tui) {
508 587 .map(|t| t.to_owned())
509 588 .collect::<Vec<tier::Model>>();
510 589
511 − for t in &curr_tiers {
512 − let othersym = app.def_tier_list.iter().find(|dt| dt.key == t.name);
513 − editables.push(Editable {
514 − id: t.id,
515 − tgt: Editablez::Tier,
516 − first: t.name.clone(),
517 − second: t.color.clone(),
518 − third: t.symbol.clone(),
519 − });
520 − match (&t.symbol, othersym) {
521 − (None, Some(other)) => msgs.push(Line::from(vec![
522 − Span::styled(
523 − format!(
524 − "{} {}: ",
525 − &other.symbol.clone().unwrap(),
526 − t.name.clone()
590 + if app.ppl_show_tiers {
591 + for t in &curr_tiers {
592 + let othersym = app.def_tier_list.iter().find(|dt| dt.key == t.name);
593 + editables.push(Editable {
594 + id: t.id,
595 + tgt: Editablez::Tier,
596 + first: t.name.clone(),
597 + second: t.color.clone(),
598 + third: t.symbol.clone(),
599 + });
600 + match (&t.symbol, othersym) {
601 + (None, Some(other)) => msgs.push(Line::from(vec![
602 + Span::styled(
603 + format!(
604 + "{} {}: ",
605 + &other.symbol.clone().unwrap(),
606 + t.name.clone()
607 + ),
608 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
527 609 ),
528 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
529 − ),
530 − Span::raw(t.name.clone()),
531 − ])),
532 − (Some(main), None) => msgs.push(Line::from(vec![
533 − Span::styled(
534 − format!("{} {}: ", main, t.name.clone()),
535 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
536 − ),
537 − Span::raw(t.name.clone()),
538 − ])),
539 − (None, None) => msgs.push(Line::from(vec![
540 − Span::styled(
541 − format!("ℹ️ {}: ", t.name.clone()),
542 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
543 − ),
544 − Span::raw(t.name.clone()),
545 − ])),
546 − // _ => {}
547 − (Some(main), Some(_other)) => msgs.push(Line::from(vec![
548 − Span::styled(
549 − format!("{} {}: ", main, t.name.clone()),
550 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
551 − ),
552 − Span::raw(t.name.clone()),
553 − ])),
610 + Span::raw(t.name.clone()),
611 + ])),
612 + (Some(main), None) => msgs.push(Line::from(vec![
613 + Span::styled(
614 + format!("{} {}: ", main, t.name.clone()),
615 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
616 + ),
617 + Span::raw(t.name.clone()),
618 + ])),
619 + (None, None) => msgs.push(Line::from(vec![
620 + Span::styled(
621 + format!("ℹ️ {}: ", t.name.clone()),
622 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
623 + ),
624 + Span::raw(t.name.clone()),
625 + ])),
626 + // _ => {}
627 + (Some(main), Some(_other)) => msgs.push(Line::from(vec![
628 + Span::styled(
629 + format!("{} {}: ", main, t.name.clone()),
630 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
631 + ),
632 + Span::raw(t.name.clone()),
633 + ])),
634 + }
554 635 }
555 636 }
556 637
@@ -560,24 +641,26 @@ fn render(f: &mut Frame, app: &mut Tui) {
560 641 .filter(|t| t.ppl_id_b == curr.id)
561 642 .map(|t| t.to_owned())
562 643 .collect::<Vec<relation::Model>>();
563 − for t in &curr_rels {
564 − let i2 = t.date_entered.map(|d| d.to_string());
565 − let i3 = t.date_ended.map(|d| d.to_string());
566 − editables.push(Editable {
567 − id: t.id,
568 − tgt: Editablez::Relation,
569 − first: t.r#type.clone(),
570 − second: i2,
571 − third: i3,
572 − });
573 −
574 − msgs.push(Line::from(vec![
575 − Span::styled(
576 − format!("🫂 {}: ", t.r#type.clone()),
577 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
578 − ),
579 − Span::raw(format!("{:?} - {:?}", t.date_entered, t.date_ended)),
580 − ]))
644 + if app.ppl_show_relations {
645 + for t in &curr_rels {
646 + let i2 = t.date_entered.map(|d| d.to_string());
647 + let i3 = t.date_ended.map(|d| d.to_string());
648 + editables.push(Editable {
649 + id: t.id,
650 + tgt: Editablez::Relation,
651 + first: t.r#type.clone(),
652 + second: i2,
653 + third: i3,
654 + });
655 +
656 + msgs.push(Line::from(vec![
657 + Span::styled(
658 + format!("🫂 {}: ", t.r#type.clone()),
659 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
660 + ),
661 + Span::raw(format!("{:?} - {:?}", t.date_entered, t.date_ended)),
662 + ]))
663 + }
581 664 }
582 665
583 666 let curr_dates = app
@@ -591,36 +674,38 @@ fn render(f: &mut Frame, app: &mut Tui) {
591 674 .iter()
592 675 .filter(|t| t.is_date && t.enabled)
593 676 .collect::<Vec<&trait_defaults::Model>>();
594 − for t in &curr_dates {
595 − editables.push(Editable {
596 − id: t.id,
597 − tgt: Editablez::SigDate,
598 − first: t.event.clone(),
599 − second: Option::from(t.date.to_string()),
600 − third: Option::from(t.do_remind.to_string()),
601 − });
602 − match (date_traits.iter().find(|f| f.key == t.event), t.do_remind) {
603 − (Some(dt), _) => msgs.push(Line::from(vec![
604 − Span::styled(
605 − format!("{} {}: ", dt.symbol, t.event.clone()),
606 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
607 − ),
608 − Span::raw(t.date.clone().to_string()),
609 − ])),
610 − (None, true) => msgs.push(Line::from(vec![
611 − Span::styled(
612 − format!("⏰ {}: ", t.event.clone()),
613 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
614 − ),
615 − Span::raw(t.date.clone().to_string()),
616 − ])),
617 − (None, false) => msgs.push(Line::from(vec![
618 − Span::styled(
619 − format!("📅 {}: ", t.event.clone()),
620 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
621 − ),
622 − Span::raw(t.date.clone().to_string()),
623 − ])),
677 + if app.ppl_show_dates {
678 + for t in &curr_dates {
679 + editables.push(Editable {
680 + id: t.id,
681 + tgt: Editablez::SigDate,
682 + first: t.event.clone(),
683 + second: Option::from(t.date.to_string()),
684 + third: Option::from(t.do_remind.to_string()),
685 + });
686 + match (date_traits.iter().find(|f| f.key == t.event), t.do_remind) {
687 + (Some(dt), _) => msgs.push(Line::from(vec![
688 + Span::styled(
689 + format!("{} {}: ", dt.symbol, t.event.clone()),
690 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
691 + ),
692 + Span::raw(t.date.clone().to_string()),
693 + ])),
694 + (None, true) => msgs.push(Line::from(vec![
695 + Span::styled(
696 + format!("⏰ {}: ", t.event.clone()),
697 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
698 + ),
699 + Span::raw(t.date.clone().to_string()),
700 + ])),
701 + (None, false) => msgs.push(Line::from(vec![
702 + Span::styled(
703 + format!("📅 {}: ", t.event.clone()),
704 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
705 + ),
706 + Span::raw(t.date.clone().to_string()),
707 + ])),
708 + }
624 709 }
625 710 }
626 711
@@ -635,30 +720,32 @@ fn render(f: &mut Frame, app: &mut Tui) {
635 720 .iter()
636 721 .filter(|t| t.is_contact && t.enabled)
637 722 .collect::<Vec<&trait_defaults::Model>>();
638 − for t in &contacts {
639 − editables.push(Editable {
640 − id: t.id,
641 − tgt: Editablez::Contact,
642 − first: t.r#type.clone(),
643 − second: Option::from(t.designator.clone().unwrap_or("".to_string())),
644 − third: Option::from(t.value.clone()),
645 − });
646 −
647 − match contact_traits.iter().find(|f| f.key == t.r#type) {
648 − Some(dt) => msgs.push(Line::from(vec![
649 − Span::styled(
650 − format!("{} {}: ", dt.symbol, t.r#type.clone()),
651 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
652 − ),
653 − Span::raw(t.value.clone().to_string()),
654 − ])),
655 − None => msgs.push(Line::from(vec![
656 − Span::styled(
657 − format!("📇 {}: ", t.r#type.clone()),
658 − Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
659 − ),
660 − Span::raw(t.value.clone().to_string()),
661 − ])),
723 + if app.ppl_show_contacts {
724 + for t in &contacts {
725 + editables.push(Editable {
726 + id: t.id,
727 + tgt: Editablez::Contact,
728 + first: t.r#type.clone(),
729 + second: Option::from(t.designator.clone().unwrap_or("".to_string())),
730 + third: Option::from(t.value.clone()),
731 + });
732 +
733 + match contact_traits.iter().find(|f| f.key == t.r#type) {
734 + Some(dt) => msgs.push(Line::from(vec![
735 + Span::styled(
736 + format!("{} {}: ", dt.symbol, t.r#type.clone()),
737 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
738 + ),
739 + Span::raw(t.value.clone().to_string()),
740 + ])),
741 + None => msgs.push(Line::from(vec![
742 + Span::styled(
743 + format!("📇 {}: ", t.r#type.clone()),
744 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
745 + ),
746 + Span::raw(t.value.clone().to_string()),
747 + ])),
748 + }
662 749 }
663 750 }
664 751
@@ -899,7 +986,7 @@ fn render(f: &mut Frame, app: &mut Tui) {
899 986 .bg(Color::Blue),
900 987 );
901 988
902 − for u in as_upcoming {
989 + for u in as_upcoming.into_iter().filter(|d| d.date.do_remind == true) {
903 990 event_list.add(
904 991 // Date::from_calendar_date(start.year(), Month::try_from(4 as u8).expect("oops"), 15 as u8).expect("doubleoops"),
905 992 Date::from_calendar_date(
@@ -907,7 +994,7 @@ fn render(f: &mut Frame, app: &mut Tui) {
907 994 Month::try_from(u.date.date.month() as u8).expect("oops"),
908 995 u.date.date.day() as u8,
909 996 )
910 − .expect("doubleoops"),
997 + .expect("doubleoops"),
911 998 Style::default()
912 999 .add_modifier(Modifier::BOLD)
913 1000 .fg(GREEN.c300)
@@ -953,6 +1040,21 @@ fn render(f: &mut Frame, app: &mut Tui) {
953 1040 // .margin(0)
954 1041 // .constraints([Constraint::Percentage(25), Constraint::Percentage(75)])
955 1042 // .split(chunks[1]);
1043 +
1044 + let msgw = vec![
1045 + Span::styled(
1046 + "Tab",
1047 + Style::default().add_modifier(Modifier::BOLD).fg(WHITE),
1048 + ),
1049 + Span::raw(" to switch views. "),
1050 + Span::styled("E", Style::default().add_modifier(Modifier::BOLD).fg(WHITE)),
1051 + Span::raw(" to edit the enabled tiers. "),
1052 + Span::styled("C", Style::default().add_modifier(Modifier::BOLD).fg(WHITE)),
1053 + Span::raw(" to enable/disable the various builtin calendars. "),
1054 + ];
1055 + let textw = Text::from(Line::from(msgw)).style(Style::default());
1056 + let welcome = Paragraph::new(textw);
1057 + f.render_widget(welcome, chunks[2]);
956 1058 }
957 1059 Tabs::TierSettings => {
958 1060 let ppl = List::new(&app.def_tier_list)

Parents: 8c36f5c