ui: add initial Profile hover previews

The idea with these is that on notedeck you can just hover your cursor
over a profile link to see the profile. I just have a stub for now, but
full design coming soon after.

Also simplify the preview system even further with a macro. In the
future I imagine we can grep every preview in the codebase, and then
include this as a string inside this macro. This is some kind of
template metaprogramming insanity but in theory it could work.

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2024-04-19 22:00:19 -07:00
parent 2d566cc637
commit 05fe164a49
13 changed files with 148 additions and 28 deletions

View File

@@ -123,16 +123,27 @@ fn render_note_contents(
match block.blocktype() {
BlockType::MentionBech32 => match block.as_mention().unwrap() {
Mention::Pubkey(npub) => {
ui.colored_label(colors::PURPLE, "@");
let profile = damus.ndb.get_profile_by_pubkey(txn, npub.pubkey()).ok();
if let Some(name) = profile
.as_ref()
.and_then(|p| crate::profile::get_profile_name(p))
{
ui.colored_label(colors::PURPLE, name);
} else {
ui.colored_label(colors::PURPLE, "nostrich");
}
ui.horizontal(|ui| {
let profile = damus.ndb.get_profile_by_pubkey(txn, npub.pubkey()).ok();
let name: String = if let Some(name) =
profile.as_ref().and_then(crate::profile::get_profile_name)
{
format!("@{}", name)
} else {
"@nostrich".to_string()
};
let resp = ui.colored_label(colors::PURPLE, &name);
if let Some(rec) = profile.as_ref() {
resp.on_hover_ui_at_pointer(|ui| {
egui::Frame::default().show(ui, |ui| {
ui.add(ui::ProfilePreview::new(rec));
});
});
}
});
}
Mention::Note(note) if options.has_note_previews() => {

View File

@@ -106,7 +106,7 @@ impl<'a> Note<'a> {
match profile
.as_ref()
.ok()
.and_then(|p| p.record.profile()?.picture())
.and_then(|p| p.record().profile()?.picture())
{
// these have different lifetimes and types,
// so the calls must be separate