Silence warnings, run cargo fmt
This commit is contained in:
parent
fe1c1d3655
commit
af1c767f5f
77 changed files with 1904 additions and 903 deletions
|
|
@ -17,11 +17,11 @@ use chattyness_db::models::{ChannelMemberWithAvatar, LooseProp, Scene};
|
|||
|
||||
#[cfg(feature = "hydrate")]
|
||||
use super::avatar_canvas::hit_test_canvas;
|
||||
use super::avatar_canvas::{member_key, AvatarCanvas};
|
||||
use super::avatar_canvas::{AvatarCanvas, member_key};
|
||||
use super::chat_types::ActiveBubble;
|
||||
use super::context_menu::{ContextMenu, ContextMenuItem};
|
||||
use super::settings::{
|
||||
calculate_min_zoom, ViewerSettings, BASE_PROP_SIZE, REFERENCE_HEIGHT, REFERENCE_WIDTH,
|
||||
BASE_PROP_SIZE, REFERENCE_HEIGHT, REFERENCE_WIDTH, ViewerSettings, calculate_min_zoom,
|
||||
};
|
||||
use super::ws_client::FadingMember;
|
||||
use crate::utils::parse_bounds_dimensions;
|
||||
|
|
@ -35,18 +35,12 @@ use crate::utils::parse_bounds_dimensions;
|
|||
#[component]
|
||||
pub fn RealmSceneViewer(
|
||||
scene: Scene,
|
||||
#[allow(unused)]
|
||||
realm_slug: String,
|
||||
#[prop(into)]
|
||||
members: Signal<Vec<ChannelMemberWithAvatar>>,
|
||||
#[prop(into)]
|
||||
active_bubbles: Signal<HashMap<(Option<Uuid>, Option<Uuid>), ActiveBubble>>,
|
||||
#[prop(into)]
|
||||
loose_props: Signal<Vec<LooseProp>>,
|
||||
#[prop(into)]
|
||||
on_move: Callback<(f64, f64)>,
|
||||
#[prop(into)]
|
||||
on_prop_click: Callback<Uuid>,
|
||||
#[prop(into)] members: Signal<Vec<ChannelMemberWithAvatar>>,
|
||||
#[prop(into)] active_bubbles: Signal<HashMap<(Option<Uuid>, Option<Uuid>), ActiveBubble>>,
|
||||
#[prop(into)] loose_props: Signal<Vec<LooseProp>>,
|
||||
#[prop(into)] on_move: Callback<(f64, f64)>,
|
||||
#[prop(into)] on_prop_click: Callback<Uuid>,
|
||||
/// Viewer settings for pan/zoom/enlarge modes.
|
||||
#[prop(optional)]
|
||||
settings: Option<Signal<ViewerSettings>>,
|
||||
|
|
@ -104,9 +98,7 @@ pub fn RealmSceneViewer(
|
|||
.clone()
|
||||
.unwrap_or_else(|| "#1a1a2e".to_string());
|
||||
|
||||
#[allow(unused_variables)]
|
||||
let has_background_image = scene.background_image_path.is_some();
|
||||
#[allow(unused_variables)]
|
||||
let image_path = scene.background_image_path.clone().unwrap_or_default();
|
||||
|
||||
// Canvas refs for background and props layers
|
||||
|
|
@ -217,15 +209,18 @@ pub fn RealmSceneViewer(
|
|||
// Parse the member ID to determine if it's a user_id or guest_session_id
|
||||
if let Ok(member_id) = member_id_str.parse::<Uuid>() {
|
||||
// Check if this is the current user's avatar
|
||||
let is_current_user = my_user_id == Some(member_id) ||
|
||||
my_guest_session_id == Some(member_id);
|
||||
let is_current_user = my_user_id == Some(member_id)
|
||||
|| my_guest_session_id == Some(member_id);
|
||||
|
||||
if !is_current_user {
|
||||
// Find the display name for this member
|
||||
let display_name = members.get().iter()
|
||||
let display_name = members
|
||||
.get()
|
||||
.iter()
|
||||
.find(|m| {
|
||||
m.member.user_id == Some(member_id) ||
|
||||
m.member.guest_session_id == Some(member_id)
|
||||
m.member.user_id == Some(member_id)
|
||||
|| m.member.guest_session_id
|
||||
== Some(member_id)
|
||||
})
|
||||
.map(|m| m.member.display_name.clone());
|
||||
|
||||
|
|
@ -256,7 +251,7 @@ pub fn RealmSceneViewer(
|
|||
{
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
use wasm_bindgen::{closure::Closure, JsCast};
|
||||
use wasm_bindgen::{JsCast, closure::Closure};
|
||||
|
||||
let image_path_clone = image_path.clone();
|
||||
let bg_color_clone = bg_color.clone();
|
||||
|
|
@ -395,7 +390,8 @@ pub fn RealmSceneViewer(
|
|||
canvas_width as f64,
|
||||
canvas_height as f64,
|
||||
);
|
||||
}) as Box<dyn FnOnce()>);
|
||||
})
|
||||
as Box<dyn FnOnce()>);
|
||||
|
||||
img.set_onload(Some(onload.as_ref().unchecked_ref()));
|
||||
onload.forget();
|
||||
|
|
@ -419,7 +415,8 @@ pub fn RealmSceneViewer(
|
|||
let canvas_aspect = display_width as f64 / display_height as f64;
|
||||
let scene_aspect = scene_width_f / scene_height_f;
|
||||
|
||||
let (draw_width, draw_height, draw_x, draw_y) = if canvas_aspect > scene_aspect {
|
||||
let (draw_width, draw_height, draw_x, draw_y) = if canvas_aspect > scene_aspect
|
||||
{
|
||||
let h = display_height as f64;
|
||||
let w = h * scene_aspect;
|
||||
let x = (display_width as f64 - w) / 2.0;
|
||||
|
|
@ -462,9 +459,14 @@ pub fn RealmSceneViewer(
|
|||
|
||||
let onload = Closure::once(Box::new(move || {
|
||||
let _ = ctx_clone.draw_image_with_html_image_element_and_dw_and_dh(
|
||||
&img_clone, draw_x, draw_y, draw_width, draw_height,
|
||||
&img_clone,
|
||||
draw_x,
|
||||
draw_y,
|
||||
draw_width,
|
||||
draw_height,
|
||||
);
|
||||
}) as Box<dyn FnOnce()>);
|
||||
})
|
||||
as Box<dyn FnOnce()>);
|
||||
|
||||
img.set_onload(Some(onload.as_ref().unchecked_ref()));
|
||||
onload.forget();
|
||||
|
|
@ -498,6 +500,12 @@ pub fn RealmSceneViewer(
|
|||
return;
|
||||
}
|
||||
|
||||
// Read scale factors inside the Effect (reactive context) before the closure
|
||||
let sx = scale_x.get();
|
||||
let sy = scale_y.get();
|
||||
let ox = offset_x.get();
|
||||
let oy = offset_y.get();
|
||||
|
||||
let Some(canvas) = props_canvas_ref.get() else {
|
||||
return;
|
||||
};
|
||||
|
|
@ -520,12 +528,6 @@ pub fn RealmSceneViewer(
|
|||
// Clear with transparency
|
||||
ctx.clear_rect(0.0, 0.0, canvas_width as f64, canvas_height as f64);
|
||||
|
||||
// Get stored scale factors
|
||||
let sx = scale_x.get();
|
||||
let sy = scale_y.get();
|
||||
let ox = offset_x.get();
|
||||
let oy = offset_y.get();
|
||||
|
||||
// Calculate prop size based on mode
|
||||
let prop_size = calculate_prop_size(
|
||||
current_pan_mode,
|
||||
|
|
@ -582,7 +584,9 @@ pub fn RealmSceneViewer(
|
|||
if canvas_width > 0 && canvas_height > 0 {
|
||||
if let Some(canvas) = props_canvas_ref.get() {
|
||||
let canvas_el: &web_sys::HtmlCanvasElement = &canvas;
|
||||
if canvas_el.width() != canvas_width || canvas_el.height() != canvas_height {
|
||||
if canvas_el.width() != canvas_width
|
||||
|| canvas_el.height() != canvas_height
|
||||
{
|
||||
canvas_el.set_width(canvas_width);
|
||||
canvas_el.set_height(canvas_height);
|
||||
}
|
||||
|
|
@ -631,39 +635,44 @@ pub fn RealmSceneViewer(
|
|||
let last_y_down = last_y.clone();
|
||||
|
||||
// Middle mouse down - start drag
|
||||
let onmousedown = Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |ev: web_sys::MouseEvent| {
|
||||
// Button 1 is middle mouse button
|
||||
if ev.button() == 1 {
|
||||
is_dragging_down.set(true);
|
||||
last_x_down.set(ev.client_x());
|
||||
last_y_down.set(ev.client_y());
|
||||
let _ = container_for_down.style().set_property("cursor", "grabbing");
|
||||
ev.prevent_default();
|
||||
}
|
||||
});
|
||||
let onmousedown =
|
||||
Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |ev: web_sys::MouseEvent| {
|
||||
// Button 1 is middle mouse button
|
||||
if ev.button() == 1 {
|
||||
is_dragging_down.set(true);
|
||||
last_x_down.set(ev.client_x());
|
||||
last_y_down.set(ev.client_y());
|
||||
let _ = container_for_down
|
||||
.style()
|
||||
.set_property("cursor", "grabbing");
|
||||
ev.prevent_default();
|
||||
}
|
||||
});
|
||||
|
||||
// Mouse move - drag scroll
|
||||
let onmousemove = Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |ev: web_sys::MouseEvent| {
|
||||
if is_dragging_move.get() {
|
||||
let dx = last_x_move.get() - ev.client_x();
|
||||
let dy = last_y_move.get() - ev.client_y();
|
||||
last_x_move.set(ev.client_x());
|
||||
last_y_move.set(ev.client_y());
|
||||
container_for_move.set_scroll_left(container_for_move.scroll_left() + dx);
|
||||
container_for_move.set_scroll_top(container_for_move.scroll_top() + dy);
|
||||
}
|
||||
});
|
||||
let onmousemove =
|
||||
Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |ev: web_sys::MouseEvent| {
|
||||
if is_dragging_move.get() {
|
||||
let dx = last_x_move.get() - ev.client_x();
|
||||
let dy = last_y_move.get() - ev.client_y();
|
||||
last_x_move.set(ev.client_x());
|
||||
last_y_move.set(ev.client_y());
|
||||
container_for_move.set_scroll_left(container_for_move.scroll_left() + dx);
|
||||
container_for_move.set_scroll_top(container_for_move.scroll_top() + dy);
|
||||
}
|
||||
});
|
||||
|
||||
let container_for_up = container_el.clone();
|
||||
let is_dragging_up = is_dragging.clone();
|
||||
|
||||
// Mouse up - stop drag
|
||||
let onmouseup = Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |_ev: web_sys::MouseEvent| {
|
||||
if is_dragging_up.get() {
|
||||
is_dragging_up.set(false);
|
||||
let _ = container_for_up.style().set_property("cursor", "");
|
||||
}
|
||||
});
|
||||
let onmouseup =
|
||||
Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |_ev: web_sys::MouseEvent| {
|
||||
if is_dragging_up.get() {
|
||||
is_dragging_up.set(false);
|
||||
let _ = container_for_up.style().set_property("cursor", "");
|
||||
}
|
||||
});
|
||||
|
||||
// Add event listeners
|
||||
let _ = container_el.add_event_listener_with_callback(
|
||||
|
|
@ -674,21 +683,20 @@ pub fn RealmSceneViewer(
|
|||
"mousemove",
|
||||
onmousemove.as_ref().unchecked_ref(),
|
||||
);
|
||||
let _ = container_el.add_event_listener_with_callback(
|
||||
"mouseup",
|
||||
onmouseup.as_ref().unchecked_ref(),
|
||||
);
|
||||
let _ = container_el
|
||||
.add_event_listener_with_callback("mouseup", onmouseup.as_ref().unchecked_ref());
|
||||
|
||||
// Also listen for mouseup on window (in case mouse released outside container)
|
||||
if let Some(window) = web_sys::window() {
|
||||
let is_dragging_window = is_dragging.clone();
|
||||
let container_for_window = container_el.clone();
|
||||
let onmouseup_window = Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |_ev: web_sys::MouseEvent| {
|
||||
if is_dragging_window.get() {
|
||||
is_dragging_window.set(false);
|
||||
let _ = container_for_window.style().set_property("cursor", "");
|
||||
}
|
||||
});
|
||||
let onmouseup_window =
|
||||
Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |_ev: web_sys::MouseEvent| {
|
||||
if is_dragging_window.get() {
|
||||
is_dragging_window.set(false);
|
||||
let _ = container_for_window.style().set_property("cursor", "");
|
||||
}
|
||||
});
|
||||
let _ = window.add_event_listener_with_callback(
|
||||
"mouseup",
|
||||
onmouseup_window.as_ref().unchecked_ref(),
|
||||
|
|
@ -697,11 +705,12 @@ pub fn RealmSceneViewer(
|
|||
}
|
||||
|
||||
// Prevent context menu on middle click
|
||||
let oncontextmenu = Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |ev: web_sys::MouseEvent| {
|
||||
if ev.button() == 1 {
|
||||
ev.prevent_default();
|
||||
}
|
||||
});
|
||||
let oncontextmenu =
|
||||
Closure::<dyn Fn(web_sys::MouseEvent)>::new(move |ev: web_sys::MouseEvent| {
|
||||
if ev.button() == 1 {
|
||||
ev.prevent_default();
|
||||
}
|
||||
});
|
||||
let _ = container_el.add_event_listener_with_callback(
|
||||
"auxclick",
|
||||
oncontextmenu.as_ref().unchecked_ref(),
|
||||
|
|
@ -713,7 +722,6 @@ pub fn RealmSceneViewer(
|
|||
onmouseup.forget();
|
||||
oncontextmenu.forget();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// Create wheel handler closure for use in view
|
||||
|
|
@ -861,7 +869,8 @@ pub fn RealmSceneViewer(
|
|||
// Create a map of members by key for efficient lookup
|
||||
let members_by_key = Signal::derive(move || {
|
||||
use std::collections::HashMap;
|
||||
sorted_members.get()
|
||||
sorted_members
|
||||
.get()
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(|(idx, m)| (member_key(&m), (idx, m)))
|
||||
|
|
@ -871,7 +880,8 @@ pub fn RealmSceneViewer(
|
|||
// Get the list of member keys - use Memo so it only updates when keys actually change
|
||||
// (not when member data like position changes)
|
||||
let member_keys = Memo::new(move |_| {
|
||||
sorted_members.get()
|
||||
sorted_members
|
||||
.get()
|
||||
.iter()
|
||||
.map(member_key)
|
||||
.collect::<Vec<_>>()
|
||||
|
|
@ -1111,7 +1121,6 @@ fn draw_loose_props(
|
|||
offset_y: f64,
|
||||
prop_size: f64,
|
||||
) {
|
||||
|
||||
for prop in props {
|
||||
let x = prop.position_x * scale_x + offset_x;
|
||||
let y = prop.position_y * scale_y + offset_y;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue