Pfp integration to side panel

Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
kernelkind
2024-05-26 22:05:45 -04:00
committed by William Casarin
parent 7ebd694f11
commit df0377cb89
5 changed files with 109 additions and 30 deletions

View File

@@ -8,6 +8,7 @@ use crate::notecache::{CachedNote, NoteCache};
use crate::relay_pool_manager::create_wakeup; use crate::relay_pool_manager::create_wakeup;
use crate::timeline; use crate::timeline;
use crate::timeline::{NoteRef, Timeline, ViewFilter}; use crate::timeline::{NoteRef, Timeline, ViewFilter};
use crate::ui::profile::SimpleProfilePreviewController;
use crate::ui::{is_mobile, DesktopGlobalPopup, DesktopSidePanel, View}; use crate::ui::{is_mobile, DesktopGlobalPopup, DesktopSidePanel, View};
use crate::Result; use crate::Result;
@@ -853,7 +854,11 @@ fn render_damus_desktop(ctx: &egui::Context, app: &mut Damus) {
if app.timelines.len() == 1 { if app.timelines.len() == 1 {
DesktopSidePanel::panel().show(ctx, |ui| { DesktopSidePanel::panel().show(ctx, |ui| {
DesktopSidePanel::inner(ui); DesktopSidePanel::new(
&mut app.account_manager,
SimpleProfilePreviewController::new(&app.ndb, &mut app.img_cache),
)
.inner(ui);
}); });
main_panel(&ctx.style()).show(ctx, |ui| { main_panel(&ctx.style()).show(ctx, |ui| {
DesktopGlobalPopup::new(app).ui(ui); DesktopGlobalPopup::new(app).ui(ui);
@@ -882,7 +887,13 @@ fn timelines_view(ui: &mut egui::Ui, sizes: Size, app: &mut Damus, timelines: us
.sizes(sizes, timelines) .sizes(sizes, timelines)
.clip(true) .clip(true)
.horizontal(|mut strip| { .horizontal(|mut strip| {
strip.cell(crate::ui::DesktopSidePanel::inner); strip.cell(|ui| {
DesktopSidePanel::new(
&mut app.account_manager,
SimpleProfilePreviewController::new(&app.ndb, &mut app.img_cache),
)
.inner(ui)
});
for timeline_ind in 0..timelines { for timeline_ind in 0..timelines {
strip.cell(|ui| timeline::timeline_view(ui, app, timeline_ind)); strip.cell(|ui| timeline::timeline_view(ui, app, timeline_ind));

View File

@@ -126,7 +126,7 @@ impl<'a> DesktopGlobalPopup<'a> {
mod preview { mod preview {
use crate::{ use crate::{
test_data, test_data,
ui::{DesktopSidePanel, Preview, View}, ui::{profile::SimpleProfilePreviewController, DesktopSidePanel, Preview, View},
Damus, Damus,
}; };
@@ -157,7 +157,10 @@ mod preview {
impl View for GlobalPopupPreview { impl View for GlobalPopupPreview {
fn ui(&mut self, ui: &mut egui::Ui) { fn ui(&mut self, ui: &mut egui::Ui) {
let mut panel = DesktopSidePanel::new(); let mut panel = DesktopSidePanel::new(
&mut self.app.account_manager,
SimpleProfilePreviewController::new(&self.app.ndb, &mut self.app.img_cache),
);
DesktopSidePanel::panel().show(ui.ctx(), |ui| panel.ui(ui)); DesktopSidePanel::panel().show(ui.ctx(), |ui| panel.ui(ui));
DesktopGlobalPopup::new(&mut self.app).ui(ui); DesktopGlobalPopup::new(&mut self.app).ui(ui);
} }

View File

@@ -156,7 +156,7 @@ pub fn get_display_name<'a>(profile: &'a ProfileRecord<'a>) -> DisplayName<'a> {
} }
} }
fn get_profile_url<'a>(profile: &'a ProfileRecord<'a>) -> &'a str { pub fn get_profile_url<'a>(profile: &'a ProfileRecord<'a>) -> &'a str {
if let Some(url) = profile.record().profile().and_then(|p| p.picture()) { if let Some(url) = profile.record().profile().and_then(|p| p.picture()) {
url url
} else { } else {

View File

@@ -6,7 +6,10 @@ use crate::{
ui::state_in_memory::STATE_ACCOUNT_SWITCHER, DisplayName, ui::state_in_memory::STATE_ACCOUNT_SWITCHER, DisplayName,
}; };
use super::preview::{get_display_name, SimpleProfilePreview}; use super::{
preview::{get_display_name, get_profile_url, SimpleProfilePreview},
ProfilePic,
};
pub struct SimpleProfilePreviewController<'a> { pub struct SimpleProfilePreviewController<'a> {
ndb: &'a Ndb, ndb: &'a Ndb,
@@ -117,7 +120,7 @@ impl<'a> SimpleProfilePreviewController<'a> {
} }
pub fn show_with_nickname( pub fn show_with_nickname(
&'a self, &self,
ui: &mut egui::Ui, ui: &mut egui::Ui,
key: &Pubkey, key: &Pubkey,
ui_element: fn(ui: &mut egui::Ui, username: &DisplayName) -> egui::Response, ui_element: fn(ui: &mut egui::Ui, username: &DisplayName) -> egui::Response,
@@ -133,10 +136,21 @@ impl<'a> SimpleProfilePreviewController<'a> {
} }
pub fn show_with_pfp( pub fn show_with_pfp(
&'a self, &mut self,
ui: &mut egui::Ui, ui: &mut egui::Ui,
key: &Pubkey, key: &Pubkey,
ui_element: fn(ui: &mut egui::Ui, preview: SimpleProfilePreview) -> egui::Response, ui_element: fn(ui: &mut egui::Ui, pfp: ProfilePic) -> egui::Response,
) { ) -> Option<egui::Response> {
if let Ok(txn) = Transaction::new(self.ndb) {
let profile = self.ndb.get_profile_by_pubkey(&txn, key.bytes());
if let Ok(profile) = profile {
return Some(ui_element(
ui,
ProfilePic::new(self.img_cache, get_profile_url(&profile)),
));
}
}
None
} }
} }

View File

@@ -1,37 +1,43 @@
use egui::{Button, Layout, SidePanel, Vec2}; use egui::{Button, Layout, SidePanel, Vec2, Widget};
use crate::ui::global_popup::GlobalPopupType; use crate::{account_manager::AccountManager, ui::global_popup::GlobalPopupType};
use super::{ use super::{
profile::SimpleProfilePreviewController,
state_in_memory::{STATE_ACCOUNT_SWITCHER, STATE_SIDE_PANEL}, state_in_memory::{STATE_ACCOUNT_SWITCHER, STATE_SIDE_PANEL},
View, ProfilePic, View,
}; };
#[derive(Default)] pub struct DesktopSidePanel<'a> {
pub struct DesktopSidePanel {} account_manager: &'a mut AccountManager,
simple_preview_controller: SimpleProfilePreviewController<'a>,
}
static ID: &str = "left panel"; static ID: &str = "left panel";
impl View for DesktopSidePanel { impl<'a> View for DesktopSidePanel<'a> {
fn ui(&mut self, ui: &mut egui::Ui) { fn ui(&mut self, ui: &mut egui::Ui) {
DesktopSidePanel::inner(ui); self.inner(ui);
} }
} }
impl DesktopSidePanel { impl<'a> DesktopSidePanel<'a> {
pub fn new() -> Self { pub fn new(
DesktopSidePanel::default() account_manager: &'a mut AccountManager,
simple_preview_controller: SimpleProfilePreviewController<'a>,
) -> Self {
DesktopSidePanel {
account_manager,
simple_preview_controller,
}
} }
pub fn inner(ui: &mut egui::Ui) { pub fn inner(&mut self, ui: &mut egui::Ui) {
let dark_mode = ui.ctx().style().visuals.dark_mode; let dark_mode = ui.ctx().style().visuals.dark_mode;
let spacing_amt = 16.0; let spacing_amt = 16.0;
ui.with_layout(Layout::bottom_up(egui::Align::Center), |ui| { ui.with_layout(Layout::bottom_up(egui::Align::Center), |ui| {
ui.add_space(spacing_amt); ui.add_space(spacing_amt);
if ui if self.pfp_button(ui).clicked() {
.add_sized(Vec2::new(32.0, 32.0), Button::new("A"))
.clicked()
{
STATE_SIDE_PANEL.set_state(ui.ctx(), Some(GlobalPopupType::AccountSwitcher)); STATE_SIDE_PANEL.set_state(ui.ctx(), Some(GlobalPopupType::AccountSwitcher));
let previous_val = STATE_ACCOUNT_SWITCHER.get_state(ui.ctx()); let previous_val = STATE_ACCOUNT_SWITCHER.get_state(ui.ctx());
STATE_ACCOUNT_SWITCHER.set_state(ui.ctx(), !previous_val); STATE_ACCOUNT_SWITCHER.set_state(ui.ctx(), !previous_val);
@@ -44,11 +50,32 @@ impl DesktopSidePanel {
}); });
} }
fn pfp_button(&mut self, ui: &mut egui::Ui) -> egui::Response {
if let Some(selected_account) = self.account_manager.get_selected_account() {
if let Some(response) = self.simple_preview_controller.show_with_pfp(
ui,
&selected_account.key.pubkey,
show_pfp(),
) {
return response;
}
}
add_button_to_ui(ui, no_account_pfp())
}
pub fn panel() -> SidePanel { pub fn panel() -> SidePanel {
egui::SidePanel::left(ID).resizable(false).exact_width(40.0) egui::SidePanel::left(ID).resizable(false).exact_width(40.0)
} }
} }
fn show_pfp() -> fn(ui: &mut egui::Ui, pfp: ProfilePic) -> egui::Response {
|ui, pfp| {
let response = pfp.ui(ui);
ui.allocate_rect(response.rect, egui::Sense::click())
}
}
fn settings_button(dark_mode: bool) -> egui::Button<'static> { fn settings_button(dark_mode: bool) -> egui::Button<'static> {
let _ = dark_mode; let _ = dark_mode;
let img_data = egui::include_image!("../../assets/icons/settings_dark_4x.png"); let img_data = egui::include_image!("../../assets/icons/settings_dark_4x.png");
@@ -56,6 +83,16 @@ fn settings_button(dark_mode: bool) -> egui::Button<'static> {
egui::Button::image(egui::Image::new(img_data).max_width(32.0)).frame(false) egui::Button::image(egui::Image::new(img_data).max_width(32.0)).frame(false)
} }
fn add_button_to_ui(ui: &mut egui::Ui, button: Button) -> egui::Response {
ui.add_sized(Vec2::new(32.0, 32.0), button)
}
fn no_account_pfp() -> Button<'static> {
Button::new("A")
.rounding(20.0)
.min_size(Vec2::new(38.0, 38.0))
}
fn add_column_button(dark_mode: bool) -> egui::Button<'static> { fn add_column_button(dark_mode: bool) -> egui::Button<'static> {
let _ = dark_mode; let _ = dark_mode;
let img_data = egui::include_image!("../../assets/icons/add_column_dark_4x.png"); let img_data = egui::include_image!("../../assets/icons/add_column_dark_4x.png");
@@ -64,26 +101,40 @@ fn add_column_button(dark_mode: bool) -> egui::Button<'static> {
} }
mod preview { mod preview {
use crate::ui::Preview; use nostrdb::Ndb;
use crate::{imgcache::ImageCache, test_data, ui::Preview};
use super::*; use super::*;
pub struct DesktopSidePanelPreview {} pub struct DesktopSidePanelPreview {
account_manager: AccountManager,
ndb: Ndb,
img_cache: ImageCache,
}
impl DesktopSidePanelPreview { impl DesktopSidePanelPreview {
fn new() -> Self { fn new() -> Self {
DesktopSidePanelPreview {} let (account_manager, ndb, img_cache) = test_data::get_accmgr_and_ndb_and_imgcache();
DesktopSidePanelPreview {
account_manager,
ndb,
img_cache,
}
} }
} }
impl View for DesktopSidePanelPreview { impl View for DesktopSidePanelPreview {
fn ui(&mut self, ui: &mut egui::Ui) { fn ui(&mut self, ui: &mut egui::Ui) {
let mut panel = DesktopSidePanel::new(); let mut panel = DesktopSidePanel::new(
&mut self.account_manager,
SimpleProfilePreviewController::new(&self.ndb, &mut self.img_cache),
);
DesktopSidePanel::panel().show(ui.ctx(), |ui| panel.ui(ui)); DesktopSidePanel::panel().show(ui.ctx(), |ui| panel.ui(ui));
} }
} }
impl Preview for DesktopSidePanel { impl<'a> Preview for DesktopSidePanel<'a> {
type Prev = DesktopSidePanelPreview; type Prev = DesktopSidePanelPreview;
fn preview() -> Self::Prev { fn preview() -> Self::Prev {