event_new tracking/highlighting

This commit is contained in:
Mike Dilger 2022-12-30 16:37:59 +13:00
parent bd7363b40e
commit 11784b33eb
4 changed files with 123 additions and 96 deletions

View File

@ -66,6 +66,9 @@ pub struct Globals {
/// Dismissed Events /// Dismissed Events
pub dismissed: RwLock<Vec<Id>>, pub dismissed: RwLock<Vec<Id>>,
/// Event is new
pub event_is_new: RwLock<Vec<Id>>,
/// Feed /// Feed
pub feed: Mutex<Feed>, pub feed: Mutex<Feed>,
} }
@ -95,6 +98,7 @@ lazy_static! {
settings: RwLock::new(Settings::default()), settings: RwLock::new(Settings::default()),
signer: RwLock::new(Signer::default()), signer: RwLock::new(Signer::default()),
dismissed: RwLock::new(Vec::new()), dismissed: RwLock::new(Vec::new()),
event_is_new: RwLock::new(Vec::new()),
feed: Mutex::new(Feed::new()), feed: Mutex::new(Feed::new()),
} }
}; };

View File

@ -484,6 +484,9 @@ impl Overlord {
self.post_reply(content, reply_to).await?; self.post_reply(content, reply_to).await?;
} }
"process_incoming_events" => { "process_incoming_events" => {
// Clear new events
GLOBALS.event_is_new.write().await.clear();
let _ = tokio::spawn(async move { let _ = tokio::spawn(async move {
for (event, url) in GLOBALS.incoming_events.write().await.drain(..) { for (event, url) in GLOBALS.incoming_events.write().await.drain(..) {
let _ = let _ =

View File

@ -263,5 +263,8 @@ pub async fn process_new_event(
// FIXME: Handle EventKind::ContactList // FIXME: Handle EventKind::ContactList
// Save in event_is_new
GLOBALS.event_is_new.write().await.push(event.id);
Ok(()) Ok(())
} }

View File

@ -148,7 +148,7 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, frame: &mut eframe::Fram
fn render_post( fn render_post(
app: &mut GossipUi, app: &mut GossipUi,
_ctx: &Context, ctx: &Context,
_frame: &mut eframe::Frame, _frame: &mut eframe::Frame,
ui: &mut Ui, ui: &mut Ui,
id: Id, id: Id,
@ -206,115 +206,132 @@ fn render_post(
let threaded = GLOBALS.settings.blocking_read().view_threaded; let threaded = GLOBALS.settings.blocking_read().view_threaded;
ui.horizontal(|ui| { #[allow(clippy::collapsible_else_if)]
// Indents first (if threaded) let bgcolor = if GLOBALS.event_is_new.blocking_read().contains(&event.id) {
if threaded { if ctx.style().visuals.dark_mode {
#[allow(clippy::collapsible_else_if)] Color32::from_rgb(60, 0, 0)
if app.hides.contains(&id) { } else {
if ui.add(Label::new("").sense(Sense::click())).clicked() { Color32::LIGHT_YELLOW
app.hides.retain(|e| *e != id)
}
} else {
if ui.add(Label::new("").sense(Sense::click())).clicked() {
app.hides.push(id);
}
}
let space = 16.0 * (10.0 - (100.0 / (indent as f32 + 10.0)));
ui.add_space(space);
if indent > 0 {
ui.separator();
}
} }
} else {
if ctx.style().visuals.dark_mode {
Color32::BLACK
} else {
Color32::WHITE
}
};
// Avatar first Frame::none().fill(bgcolor).show(ui, |ui| {
ui.image(&app.placeholder_avatar, Vec2 { x: 36.0, y: 36.0 }); ui.horizontal(|ui| {
// Indents first (if threaded)
// Everything else next if threaded {
ui.vertical(|ui| { #[allow(clippy::collapsible_else_if)]
// First row if app.hides.contains(&id) {
ui.horizontal(|ui| { if ui.add(Label::new("").sense(Sense::click())).clicked() {
if let Some(person) = maybe_person { app.hides.retain(|e| *e != id)
if let Some(name) = &person.name {
ui.label(RichText::new(name).strong());
} else {
ui.label(RichText::new(GossipUi::pubkey_short(&event.pubkey)).weak());
} }
} else {
if ui.add(Label::new("").sense(Sense::click())).clicked() {
app.hides.push(id);
}
}
if let Some(dns_id) = &person.dns_id { let space = 16.0 * (10.0 - (100.0 / (indent as f32 + 10.0)));
if person.dns_id_valid > 0 { ui.add_space(space);
ui.label(RichText::new(dns_id).monospace().small()); if indent > 0 {
ui.separator();
}
}
// Avatar first
ui.image(&app.placeholder_avatar, Vec2 { x: 36.0, y: 36.0 });
// Everything else next
ui.vertical(|ui| {
// First row
ui.horizontal(|ui| {
if let Some(person) = maybe_person {
if let Some(name) = &person.name {
ui.label(RichText::new(name).strong());
} else { } else {
ui.label(RichText::new(dns_id).monospace().small().strikethrough()); ui.label(RichText::new(GossipUi::pubkey_short(&event.pubkey)).weak());
}
if let Some(dns_id) = &person.dns_id {
if person.dns_id_valid > 0 {
ui.label(RichText::new(dns_id).monospace().small());
} else {
ui.label(RichText::new(dns_id).monospace().small().strikethrough());
}
} }
} }
}
ui.add_space(8.0); ui.add_space(8.0);
ui.label(RichText::new("🔑").text_style(TextStyle::Small).weak()); ui.label(RichText::new("🔑").text_style(TextStyle::Small).weak());
if ui.add(CopyButton {}).clicked() { if ui.add(CopyButton {}).clicked() {
ui.output().copied_text = GossipUi::pubkey_long(&event.pubkey); ui.output().copied_text = GossipUi::pubkey_long(&event.pubkey);
} }
if event.pow() > 0 { if event.pow() > 0 {
ui.label(format!("POW={}", event.pow())); ui.label(format!("POW={}", event.pow()));
} }
ui.with_layout(Layout::right_to_left(Align::TOP), |ui| { ui.with_layout(Layout::right_to_left(Align::TOP), |ui| {
ui.menu_button(RichText::new("").size(28.0), |ui| { ui.menu_button(RichText::new("").size(28.0), |ui| {
if ui.button("Copy ID").clicked() { if ui.button("Copy ID").clicked() {
ui.output().copied_text = event.id.as_hex_string(); ui.output().copied_text = event.id.as_hex_string();
}
if ui.button("Dismiss").clicked() {
GLOBALS.dismissed.blocking_write().push(event.id);
}
});
ui.label(
RichText::new(crate::date_ago::date_ago(event.created_at))
.italics()
.weak(),
);
});
});
// Second row
ui.horizontal(|ui| {
for (ch, count) in reactions.iter() {
if *ch == '+' {
ui.label(
RichText::new(format!("{} {}", ch, count))
.strong()
.color(Color32::DARK_GREEN),
);
} else if *ch == '-' {
ui.label(
RichText::new(format!("{} {}", ch, count))
.strong()
.color(Color32::DARK_RED),
);
} else {
ui.label(RichText::new(format!("{} {}", ch, count)).strong());
} }
if ui.button("Dismiss").clicked() { }
GLOBALS.dismissed.blocking_write().push(event.id); });
ui.label(&event.content);
// Under row
if !as_reply_to {
ui.horizontal(|ui| {
if ui.add(CopyButton {}).clicked() {
ui.output().copied_text = event.content.clone();
}
ui.add_space(24.0);
if ui.add(ReplyButton {}).clicked() {
app.replying_to = Some(event.id);
} }
}); });
ui.label(
RichText::new(crate::date_ago::date_ago(event.created_at))
.italics()
.weak(),
);
});
});
// Second row
ui.horizontal(|ui| {
for (ch, count) in reactions.iter() {
if *ch == '+' {
ui.label(
RichText::new(format!("{} {}", ch, count))
.strong()
.color(Color32::DARK_GREEN),
);
} else if *ch == '-' {
ui.label(
RichText::new(format!("{} {}", ch, count))
.strong()
.color(Color32::DARK_RED),
);
} else {
ui.label(RichText::new(format!("{} {}", ch, count)).strong());
}
} }
}); });
ui.label(&event.content);
// Under row
if !as_reply_to {
ui.horizontal(|ui| {
if ui.add(CopyButton {}).clicked() {
ui.output().copied_text = event.content.clone();
}
ui.add_space(24.0);
if ui.add(ReplyButton {}).clicked() {
app.replying_to = Some(event.id);
}
});
}
}); });
}); });
@ -322,7 +339,7 @@ fn render_post(
if threaded && !as_reply_to && !app.hides.contains(&id) { if threaded && !as_reply_to && !app.hides.contains(&id) {
for reply_id in replies { for reply_id in replies {
render_post(app, _ctx, _frame, ui, reply_id, indent + 1, as_reply_to); render_post(app, ctx, _frame, ui, reply_id, indent + 1, as_reply_to);
} }
} }
} }