notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 6232a8429e9ac2764b5a245ed2595ff607d0d7f4
parent a0be5f0173116a4d4b54bd844115125b591d246a
Author: William Casarin <jb55@jb55.com>
Date:   Sun,  9 Jul 2023 11:11:03 -0700

timeline: add ui_abbrev_name

This is a simple and fast function for abbreviating usernames in the
timeline. If they are too large they make the timeline too wide. We'll
probably need to make this adjustable based on the timeline width, but
this is ok for now.

Changelog-Added: Abbreviate usernames in timelines

Diffstat:
Asrc/abbrev.rs | 20++++++++++++++++++++
Msrc/app.rs | 13++++++++++++-
Msrc/lib.rs | 1+
3 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/src/abbrev.rs b/src/abbrev.rs @@ -0,0 +1,20 @@ +#[inline] +pub fn floor_char_boundary(s: &str, index: usize) -> usize { + if index >= s.len() { + s.len() + } else { + let lower_bound = index.saturating_sub(3); + let new_index = s.as_bytes()[lower_bound..=index] + .iter() + .rposition(|b| is_utf8_char_boundary(*b)); + + // SAFETY: we know that the character boundary will be within four bytes + unsafe { lower_bound + new_index.unwrap_unchecked() } + } +} + +#[inline] +fn is_utf8_char_boundary(c: u8) -> bool { + // This is bit magic equivalent to: b < 128 || b >= 192 + (c as i8) >= -0x40 +} diff --git a/src/app.rs b/src/app.rs @@ -1,3 +1,4 @@ +use crate::abbrev; use crate::contacts::Contacts; use crate::fonts::setup_fonts; use crate::images::fetch_img; @@ -321,6 +322,16 @@ fn pfp_image(ui: &mut egui::Ui, img: TextureId, size: f32) -> egui::Response { //.with_options() } +fn ui_abbreviate_name(ui: &mut egui::Ui, name: &str, len: usize) { + if name.len() > len { + let closest = abbrev::floor_char_boundary(name, len); + ui.strong(&name[..closest]); + ui.strong("..."); + } else { + ui.strong(name); + } +} + fn render_username(ui: &mut egui::Ui, contacts: &Contacts, pk: &Pubkey) { #[cfg(feature = "profiling")] puffin::profile_function!(); @@ -329,7 +340,7 @@ fn render_username(ui: &mut egui::Ui, contacts: &Contacts, pk: &Pubkey) { //ui.spacing_mut().item_spacing.x = 0.0; if let Some(prof) = contacts.profiles.get(pk) { if let Some(display_name) = prof.display_name() { - ui.strong(display_name); + ui_abbreviate_name(ui, &display_name, 20); } } else { ui.strong("nostrich"); diff --git a/src/lib.rs b/src/lib.rs @@ -4,6 +4,7 @@ mod contacts; mod error; //mod note; //mod block; +mod abbrev; mod fonts; mod images; mod result;