username.rs (2881B)
1 use egui::{Color32, RichText, Widget}; 2 use nostrdb::ProfileRecord; 3 use notedeck::{fonts::NamedFontFamily, tr, Localization}; 4 5 pub struct Username<'a> { 6 i18n: &'a mut Localization, 7 profile: Option<&'a ProfileRecord<'a>>, 8 pk: &'a [u8; 32], 9 pk_colored: bool, 10 abbrev: usize, 11 } 12 13 impl<'a> Username<'a> { 14 pub fn pk_colored(mut self, pk_colored: bool) -> Self { 15 self.pk_colored = pk_colored; 16 self 17 } 18 19 pub fn abbreviated(mut self, amount: usize) -> Self { 20 self.abbrev = amount; 21 self 22 } 23 24 pub fn new( 25 i18n: &'a mut Localization, 26 profile: Option<&'a ProfileRecord>, 27 pk: &'a [u8; 32], 28 ) -> Self { 29 let pk_colored = false; 30 let abbrev: usize = 1000; 31 Username { 32 i18n, 33 profile, 34 pk, 35 pk_colored, 36 abbrev, 37 } 38 } 39 } 40 41 impl Widget for Username<'_> { 42 fn ui(self, ui: &mut egui::Ui) -> egui::Response { 43 ui.horizontal(|ui| { 44 ui.spacing_mut().item_spacing.x = 0.0; 45 46 let color = if self.pk_colored { 47 Some(pk_color(self.pk)) 48 } else { 49 None 50 }; 51 52 if let Some(profile) = self.profile { 53 if let Some(prof) = profile.record().profile() { 54 if prof.display_name().is_some() && prof.display_name().unwrap() != "" { 55 ui_abbreviate_name(ui, prof.display_name().unwrap(), self.abbrev, color); 56 } else if let Some(name) = prof.name() { 57 ui_abbreviate_name(ui, name, self.abbrev, color); 58 } 59 } 60 } else { 61 let mut txt = RichText::new(tr!( 62 self.i18n, 63 "nostrich", 64 "Default username when profile is not available" 65 )) 66 .family(NamedFontFamily::Medium.as_family()); 67 if let Some(col) = color { 68 txt = txt.color(col) 69 } 70 ui.label(txt); 71 } 72 }) 73 .response 74 } 75 } 76 77 fn colored_name(name: &str, color: Option<Color32>) -> RichText { 78 let mut txt = RichText::new(name).family(NamedFontFamily::Medium.as_family()); 79 80 if let Some(color) = color { 81 txt = txt.color(color); 82 } 83 84 txt 85 } 86 87 fn ui_abbreviate_name(ui: &mut egui::Ui, name: &str, len: usize, color: Option<Color32>) { 88 let should_abbrev = name.len() > len; 89 let name = if should_abbrev { 90 let closest = notedeck::abbrev::floor_char_boundary(name, len); 91 &name[..closest] 92 } else { 93 name 94 }; 95 96 ui.label(colored_name(name, color)); 97 98 if should_abbrev { 99 ui.label(colored_name("..", color)); 100 } 101 } 102 103 fn pk_color(pk: &[u8; 32]) -> Color32 { 104 Color32::from_rgb(pk[8], pk[10], pk[12]) 105 }