Files
notedeck/crates/notedeck_columns/src/thread.rs
Ken Sedgwick e193e00539 Mute rendering instead of ingress
Previous approach was to keep muted content from getting inserted.

Instead, this version alters it's display.  This makes toggling mutes
on and off externally much more stable (the display changes but we
don't have to rebuild content trees)

For now muted content is collapsed to a red "Muted" tombstone w/ a reason.
2025-01-02 15:21:14 -08:00

93 lines
2.2 KiB
Rust

use crate::{
multi_subscriber::MultiSubscriber,
notes_holder::NotesHolder,
timeline::{TimelineTab, ViewFilter},
};
use nostrdb::{Filter, FilterBuilder, Ndb, Transaction};
use notedeck::{NoteCache, NoteRef};
#[derive(Default)]
pub struct Thread {
view: TimelineTab,
pub multi_subscriber: Option<MultiSubscriber>,
}
impl Thread {
pub fn new(notes: Vec<NoteRef>) -> Self {
let mut cap = ((notes.len() as f32) * 1.5) as usize;
if cap == 0 {
cap = 25;
}
let mut view = TimelineTab::new_with_capacity(ViewFilter::NotesAndReplies, cap);
view.notes = notes;
Thread {
view,
multi_subscriber: None,
}
}
pub fn view(&self) -> &TimelineTab {
&self.view
}
pub fn view_mut(&mut self) -> &mut TimelineTab {
&mut self.view
}
fn filters_raw(root: &[u8; 32]) -> Vec<FilterBuilder> {
vec![
nostrdb::Filter::new().kinds([1]).event(root),
nostrdb::Filter::new().ids([root]).limit(1),
]
}
pub fn filters_since(root: &[u8; 32], since: u64) -> Vec<Filter> {
Self::filters_raw(root)
.into_iter()
.map(|fb| fb.since(since).build())
.collect()
}
pub fn filters(root: &[u8; 32]) -> Vec<Filter> {
Self::filters_raw(root)
.into_iter()
.map(|mut fb| fb.build())
.collect()
}
}
impl NotesHolder for Thread {
fn get_multi_subscriber(&mut self) -> Option<&mut MultiSubscriber> {
self.multi_subscriber.as_mut()
}
fn filters(for_id: &[u8; 32]) -> Vec<Filter> {
Thread::filters(for_id)
}
fn new_notes_holder(
_: &Transaction,
_: &Ndb,
_: &mut NoteCache,
_: &[u8; 32],
_: Vec<Filter>,
notes: Vec<NoteRef>,
) -> Self {
Thread::new(notes)
}
fn get_view(&mut self) -> &mut TimelineTab {
&mut self.view
}
fn filters_since(for_id: &[u8; 32], since: u64) -> Vec<Filter> {
Thread::filters_since(for_id, since)
}
fn set_multi_subscriber(&mut self, subscriber: MultiSubscriber) {
self.multi_subscriber = Some(subscriber);
}
}