remove old AvatarBoundsStore
This commit is contained in:
parent
912ceb7646
commit
c434321376
5 changed files with 447 additions and 567 deletions
|
|
@ -22,14 +22,12 @@ use uuid::Uuid;
|
|||
|
||||
use chattyness_db::models::{ChannelMemberWithAvatar, LooseProp, Scene};
|
||||
|
||||
use super::avatar_canvas::{AvatarBoundsStore, AvatarCanvas, ScreenBounds, member_key};
|
||||
use super::avatar::{Avatar, member_key};
|
||||
#[cfg(feature = "hydrate")]
|
||||
use super::canvas_utils::hit_test_canvas;
|
||||
use super::chat_types::ActiveBubble;
|
||||
use super::context_menu::{ContextMenu, ContextMenuItem};
|
||||
use super::loose_prop_canvas::LoosePropCanvas;
|
||||
use super::speech_bubble::SpeechBubble;
|
||||
use super::username_label::UsernameLabel;
|
||||
use super::settings::{
|
||||
BASE_AVATAR_SCALE, BASE_PROP_SIZE, REFERENCE_HEIGHT, REFERENCE_WIDTH, ViewerSettings,
|
||||
calculate_min_zoom,
|
||||
|
|
@ -462,34 +460,6 @@ pub fn RealmSceneViewer(
|
|||
sorted_members.get().iter().map(member_key).collect::<Vec<_>>()
|
||||
});
|
||||
|
||||
// Shared store for avatar bounds - AvatarCanvas writes, SpeechBubble reads
|
||||
let avatar_bounds_store: AvatarBoundsStore = RwSignal::new(HashMap::new());
|
||||
|
||||
// Clean up bounds store when members change (prevent memory leak)
|
||||
Effect::new(move |_| {
|
||||
let current_member_ids: std::collections::HashSet<_> = members
|
||||
.get()
|
||||
.iter()
|
||||
.map(|m| m.member.user_id)
|
||||
.collect();
|
||||
|
||||
avatar_bounds_store.update(|map| {
|
||||
map.retain(|id, _| current_member_ids.contains(id));
|
||||
});
|
||||
});
|
||||
|
||||
// Scene bounds for clamping bubbles - computed once outside render loop
|
||||
let scene_bounds_signal = Signal::derive(move || {
|
||||
ScreenBounds::from_transform(
|
||||
scene_width_signal.get(),
|
||||
scene_height_signal.get(),
|
||||
scale_x_signal.get(),
|
||||
scale_y_signal.get(),
|
||||
offset_x_signal.get(),
|
||||
offset_y_signal.get(),
|
||||
)
|
||||
});
|
||||
|
||||
let scene_name = scene.name.clone();
|
||||
|
||||
view! {
|
||||
|
|
@ -524,7 +494,7 @@ pub fn RealmSceneViewer(
|
|||
}}
|
||||
</Show>
|
||||
</div>
|
||||
<div class="avatars-container absolute inset-0" style="z-index: 2; pointer-events: none;">
|
||||
<div class="avatars-container absolute inset-0" style="z-index: 2; pointer-events: none; overflow: visible;">
|
||||
<Show when=move || scales_ready.get() fallback=|| ()>
|
||||
{move || {
|
||||
member_keys.get().into_iter().map(|key| {
|
||||
|
|
@ -535,9 +505,13 @@ pub fn RealmSceneViewer(
|
|||
members_by_key.get().get(&key).map(|(idx, _)| (*idx as i32) + 10).unwrap_or(10)
|
||||
});
|
||||
let z = z_index_signal.get_untracked();
|
||||
// Derive bubble signal for this member
|
||||
let bubble_signal = Signal::derive(move || {
|
||||
active_bubbles.get().get(&key).cloned()
|
||||
});
|
||||
|
||||
view! {
|
||||
<AvatarCanvas
|
||||
<Avatar
|
||||
member=member_signal
|
||||
scale_x=scale_x_signal
|
||||
scale_y=scale_y_signal
|
||||
|
|
@ -548,7 +522,7 @@ pub fn RealmSceneViewer(
|
|||
text_em_size=text_em_size
|
||||
scene_width=scene_width_signal
|
||||
scene_height=scene_height_signal
|
||||
bounds_store=avatar_bounds_store
|
||||
active_bubble=bubble_signal
|
||||
/>
|
||||
}
|
||||
}).collect_view()
|
||||
|
|
@ -567,9 +541,9 @@ pub fn RealmSceneViewer(
|
|||
if elapsed < fading.fade_duration {
|
||||
let opacity = (1.0 - (elapsed as f64 / fading.fade_duration as f64)).max(0.0).min(1.0);
|
||||
let member_signal = Signal::derive({ let m = fading.member.clone(); move || m.clone() });
|
||||
// Note: fading members don't need to update bounds store
|
||||
// Fading members don't show bubbles
|
||||
Some(view! {
|
||||
<AvatarCanvas
|
||||
<Avatar
|
||||
member=member_signal
|
||||
scale_x=scale_x_signal
|
||||
scale_y=scale_y_signal
|
||||
|
|
@ -588,70 +562,6 @@ pub fn RealmSceneViewer(
|
|||
}}
|
||||
</Show>
|
||||
</div>
|
||||
<div class="labels-container absolute inset-0" style="z-index: 3; pointer-events: none; overflow: visible;">
|
||||
<Show when=move || scales_ready.get() fallback=|| ()>
|
||||
// Active members
|
||||
{move || {
|
||||
members_by_key.get().into_iter().map(|(_, (_, m))| {
|
||||
let user_id = m.member.user_id;
|
||||
let display_name = m.member.display_name.clone();
|
||||
view! {
|
||||
<UsernameLabel
|
||||
user_id=user_id
|
||||
display_name=display_name
|
||||
avatar_bounds_store=avatar_bounds_store
|
||||
text_em_size=text_em_size
|
||||
/>
|
||||
}
|
||||
}).collect_view()
|
||||
}}
|
||||
// Fading members
|
||||
{move || {
|
||||
let Some(fading_signal) = fading_members else {
|
||||
return Vec::new().into_iter().collect_view();
|
||||
};
|
||||
#[cfg(feature = "hydrate")]
|
||||
let now = js_sys::Date::now() as i64;
|
||||
#[cfg(not(feature = "hydrate"))]
|
||||
let now = 0i64;
|
||||
|
||||
fading_signal.get().into_iter().filter_map(|fading| {
|
||||
let elapsed = now - fading.fade_start;
|
||||
if elapsed < fading.fade_duration {
|
||||
let opacity = (1.0 - (elapsed as f64 / fading.fade_duration as f64)).max(0.0).min(1.0);
|
||||
let user_id = fading.member.member.user_id;
|
||||
let display_name = fading.member.member.display_name.clone();
|
||||
Some(view! {
|
||||
<UsernameLabel
|
||||
user_id=user_id
|
||||
display_name=display_name
|
||||
avatar_bounds_store=avatar_bounds_store
|
||||
text_em_size=text_em_size
|
||||
opacity=opacity
|
||||
/>
|
||||
})
|
||||
} else { None }
|
||||
}).collect_view()
|
||||
}}
|
||||
</Show>
|
||||
</div>
|
||||
<div class="bubbles-container absolute inset-0" style="z-index: 4; pointer-events: none; overflow: visible;">
|
||||
<Show when=move || scales_ready.get() fallback=|| ()>
|
||||
{move || {
|
||||
active_bubbles.get().into_iter().map(|(user_id, bubble)| {
|
||||
view! {
|
||||
<SpeechBubble
|
||||
user_id=user_id
|
||||
bubble=bubble
|
||||
avatar_bounds_store=avatar_bounds_store
|
||||
bounds=scene_bounds_signal
|
||||
text_em_size=text_em_size
|
||||
/>
|
||||
}
|
||||
}).collect_view()
|
||||
}}
|
||||
</Show>
|
||||
</div>
|
||||
<div
|
||||
class="click-overlay absolute inset-0"
|
||||
style="z-index: 5; cursor: pointer;"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue