From 7ec31d0eaee2aa816d4a40f5ec8a6ad4646b6570 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Tue, 23 Apr 2024 20:43:30 -0700 Subject: [PATCH] fun large profile grid preview Signed-off-by: William Casarin --- preview | 2 +- src/ui/profile/picture.rs | 62 ++++++++++++++++++++++++++++++++++++++- src/ui/relay.rs | 2 +- src/ui_preview/main.rs | 4 +-- 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/preview b/preview index 07be5d2..6746da8 100755 --- a/preview +++ b/preview @@ -1,2 +1,2 @@ #!/usr/bin/env bash -cargo run --bin ui_preview -- "$@" +cargo run --bin ui_preview --release -- "$@" diff --git a/src/ui/profile/picture.rs b/src/ui/profile/picture.rs index bd18472..ac14474 100644 --- a/src/ui/profile/picture.rs +++ b/src/ui/profile/picture.rs @@ -1,5 +1,5 @@ use crate::imgcache::ImageCache; - +use crate::ui::{Preview, View}; use egui::{vec2, Sense, TextureHandle}; pub struct ProfilePic<'cache, 'url> { @@ -97,3 +97,63 @@ fn paint_circle(ui: &mut egui::Ui, size: f32) -> egui::Response { response } + +mod preview { + use super::*; + use nostrdb::*; + use std::collections::HashSet; + + pub struct ProfilePicPreview { + cache: ImageCache, + urls: Vec, + } + + impl ProfilePicPreview { + fn new() -> Self { + let config = Config::new(); + let ndb = Ndb::new(".", &config).expect("ndb"); + let txn = Transaction::new(&ndb).unwrap(); + let filters = vec![Filter::new().kinds(vec![0]).build()]; + let cache = ImageCache::new("cache/img".into()); + let mut pks = HashSet::new(); + let mut urls = HashSet::new(); + + for query_result in ndb.query(&txn, filters, 1000).unwrap() { + pks.insert(query_result.note.pubkey()); + } + + for pk in pks { + let profile = if let Ok(profile) = ndb.get_profile_by_pubkey(&txn, pk) { + profile + } else { + continue; + }; + if let Some(url) = profile.record().profile().and_then(|p| p.picture()) { + urls.insert(url.to_string()); + } + } + + let urls = urls.into_iter().collect(); + + ProfilePicPreview { cache, urls } + } + } + + impl View for ProfilePicPreview { + fn ui(&mut self, ui: &mut egui::Ui) { + ui.horizontal_wrapped(|ui| { + for url in &self.urls { + ui.add(ProfilePic::new(&mut self.cache, &url)); + } + }); + } + } + + impl<'cache, 'url> Preview for ProfilePic<'cache, 'url> { + type Prev = ProfilePicPreview; + + fn preview() -> Self::Prev { + ProfilePicPreview::new() + } + } +} diff --git a/src/ui/relay.rs b/src/ui/relay.rs index 8d0a920..329f826 100644 --- a/src/ui/relay.rs +++ b/src/ui/relay.rs @@ -193,7 +193,7 @@ mod preview { impl View for RelayViewPreview { fn ui(&mut self, ui: &mut egui::Ui) { self.pool.try_recv(); - RelayView::new(RelayPoolManager::new(&mut self.pool)).ui(ui) + RelayView::new(RelayPoolManager::new(&mut self.pool)).ui(ui); } } diff --git a/src/ui_preview/main.rs b/src/ui_preview/main.rs index 26ef126..12dc080 100644 --- a/src/ui_preview/main.rs +++ b/src/ui_preview/main.rs @@ -2,7 +2,7 @@ use notedeck::account_login_view::AccountLoginView; use notedeck::app_creation::{ generate_mobile_emulator_native_options, generate_native_options, setup_cc, }; -use notedeck::ui::{Preview, PreviewApp, ProfilePreview, RelayView}; +use notedeck::ui::{Preview, PreviewApp, ProfilePreview, RelayView, ProfilePic}; use std::env; struct PreviewRunner { @@ -73,5 +73,5 @@ async fn main() { let runner = PreviewRunner::new(is_mobile); - previews!(runner, name, RelayView, AccountLoginView, ProfilePreview,); + previews!(runner, name, RelayView, AccountLoginView, ProfilePreview, ProfilePic); }