From 5f543ca6c41950868fc7f1e16b76279ccbf018e790cf43f73cb736d9be9abae5 Mon Sep 17 00:00:00 2001 From: Evan Carroll Date: Fri, 23 Jan 2026 21:06:54 -0600 Subject: [PATCH] fix: making picking up a prop a right click feature --- .../src/components/scene_viewer.rs | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/crates/chattyness-user-ui/src/components/scene_viewer.rs b/crates/chattyness-user-ui/src/components/scene_viewer.rs index e0a6b33..211c964 100644 --- a/crates/chattyness-user-ui/src/components/scene_viewer.rs +++ b/crates/chattyness-user-ui/src/components/scene_viewer.rs @@ -132,11 +132,10 @@ pub fn RealmSceneViewer( let (move_mode_prop_scale, set_move_mode_prop_scale) = signal(1.0_f32); let (prop_context_is_locked, set_prop_context_is_locked) = signal(false); - // Click handler for movement or prop pickup + // Click handler for movement (props are now handled via context menu) #[cfg(feature = "hydrate")] let on_overlay_click = { let on_move = on_move.clone(); - let on_prop_click = on_prop_click.clone(); move |ev: web_sys::MouseEvent| { use wasm_bindgen::JsCast; @@ -164,9 +163,7 @@ pub fn RealmSceneViewer( } } - if let Some(prop_id) = clicked_prop { - on_prop_click.run(prop_id); - } else { + if clicked_prop.is_none() { let target = ev.current_target().unwrap(); let element: web_sys::HtmlElement = target.dyn_into().unwrap(); let rect = element.get_bounding_client_rect(); @@ -208,12 +205,20 @@ pub fn RealmSceneViewer( if let Some(prop_id_str) = canvas.get_attribute("data-prop-id") { if hit_test_canvas(&canvas, client_x, client_y) { if let Ok(prop_id) = prop_id_str.parse::() { - ev.prevent_default(); - set_prop_context_menu_position.set((client_x, client_y)); - set_prop_context_menu_target.set(Some(prop_id)); - set_prop_context_menu_open.set(true); - if let Some(prop) = loose_props.get().iter().find(|p| p.id == prop_id) { + let is_mod = is_moderator.map(|s| s.get()).unwrap_or(false); + + // Don't show menu if prop is locked and user is not a moderator + if prop.is_locked && !is_mod { + ev.prevent_default(); + return; + } + + ev.prevent_default(); + set_prop_context_menu_position.set((client_x, client_y)); + set_prop_context_menu_target.set(Some(prop_id)); + set_prop_context_menu_open.set(true); + set_scale_mode_initial_scale.set(prop.scale); set_prop_context_is_locked.set(prop.is_locked); set_move_mode_prop_scale.set(prop.scale); @@ -599,6 +604,7 @@ pub fn RealmSceneViewer( let is_locked = prop_context_is_locked.get(); let mut items = Vec::new(); if !is_locked || is_mod { + items.push(ContextMenuItem { label: "Pick Up".to_string(), action: "pick_up".to_string() }); items.push(ContextMenuItem { label: "Move".to_string(), action: "move".to_string() }); } if is_mod { @@ -612,8 +618,14 @@ pub fn RealmSceneViewer( }) on_select=Callback::new({ let on_prop_lock_toggle = on_prop_lock_toggle.clone(); + let on_prop_click = on_prop_click.clone(); move |action: String| { match action.as_str() { + "pick_up" => { + if let Some(prop_id) = prop_context_menu_target.get() { + on_prop_click.run(prop_id); + } + } "set_scale" => { if let Some(prop_id) = prop_context_menu_target.get() { set_scale_mode_prop_id.set(Some(prop_id));