add transform signal to reduce 4 signals into one responsibility

This commit is contained in:
Evan Carroll 2026-01-26 23:30:32 -06:00
parent 30722bed8f
commit a4cf8d3df4
4 changed files with 83 additions and 86 deletions

View file

@ -22,7 +22,7 @@ use uuid::Uuid;
use chattyness_db::models::{ChannelMemberWithAvatar, LooseProp, Scene};
use super::avatar::{Avatar, ScreenBounds, member_key};
use super::avatar::{Avatar, ScreenBounds, SceneTransform, member_key};
#[cfg(feature = "hydrate")]
use super::canvas_utils::hit_test_canvas;
use super::chat_types::ActiveBubble;
@ -443,22 +443,25 @@ pub fn RealmSceneViewer(
});
let text_em_size = Signal::derive(move || settings.get().text_em_size);
let scale_x_signal = Signal::derive(move || scale_x.get());
let scale_y_signal = Signal::derive(move || scale_y.get());
let offset_x_signal = Signal::derive(move || offset_x.get());
let offset_y_signal = Signal::derive(move || offset_y.get());
let scene_width_signal = Signal::derive(move || scene_width_f);
let scene_height_signal = Signal::derive(move || scene_height_f);
// Compute ScreenBounds once for all avatars (instead of each avatar computing it)
// Compute SceneTransform once for all avatars and props
let scene_transform = Signal::derive(move || SceneTransform {
scale_x: scale_x.get(),
scale_y: scale_y.get(),
offset_x: offset_x.get(),
offset_y: offset_y.get(),
});
// Compute ScreenBounds once for all avatars (for clamping)
let screen_bounds = Signal::derive(move || {
let t = scene_transform.get();
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(),
scene_width_f,
scene_height_f,
t.scale_x,
t.scale_y,
t.offset_x,
t.offset_y,
)
});
@ -494,10 +497,7 @@ pub fn RealmSceneViewer(
view! {
<LoosePropCanvas
prop=prop_signal
scale_x=scale_x_signal
scale_y=scale_y_signal
offset_x=offset_x_signal
offset_y=offset_y_signal
transform=scene_transform
base_prop_size=prop_size
z_index=5
/>
@ -525,10 +525,7 @@ pub fn RealmSceneViewer(
view! {
<Avatar
member=member_signal
scale_x=scale_x_signal
scale_y=scale_y_signal
offset_x=offset_x_signal
offset_y=offset_y_signal
transform=scene_transform
prop_size=prop_size
z_index=z
text_em_size=text_em_size
@ -556,10 +553,7 @@ pub fn RealmSceneViewer(
Some(view! {
<Avatar
member=member_signal
scale_x=scale_x_signal
scale_y=scale_y_signal
offset_x=offset_x_signal
offset_y=offset_y_signal
transform=scene_transform
prop_size=prop_size
z_index=5
text_em_size=text_em_size
@ -736,10 +730,7 @@ pub fn RealmSceneViewer(
prop_scale=Signal::derive(move || move_mode_prop_scale.get())
loose_props=loose_props
prop_size=prop_size
scale_x=scale_x_signal
scale_y=scale_y_signal
offset_x=offset_x_signal
offset_y=offset_y_signal
transform=scene_transform
on_apply=on_prop_move.unwrap_or_else(|| Callback::new(|_| {}))
on_cancel=Callback::new(move |_: ()| {
set_move_mode_active.set(false);