fix: making picking up a prop a right click feature

This commit is contained in:
Evan Carroll 2026-01-23 21:06:54 -06:00
parent 98590f63e7
commit 5f543ca6c4

View file

@ -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::<Uuid>() {
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);
if let Some(prop) = loose_props.get().iter().find(|p| p.id == prop_id) {
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));