fix: making picking up a prop a right click feature
This commit is contained in:
parent
98590f63e7
commit
5f543ca6c4
1 changed files with 22 additions and 10 deletions
|
|
@ -132,11 +132,10 @@ pub fn RealmSceneViewer(
|
||||||
let (move_mode_prop_scale, set_move_mode_prop_scale) = signal(1.0_f32);
|
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);
|
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")]
|
#[cfg(feature = "hydrate")]
|
||||||
let on_overlay_click = {
|
let on_overlay_click = {
|
||||||
let on_move = on_move.clone();
|
let on_move = on_move.clone();
|
||||||
let on_prop_click = on_prop_click.clone();
|
|
||||||
move |ev: web_sys::MouseEvent| {
|
move |ev: web_sys::MouseEvent| {
|
||||||
use wasm_bindgen::JsCast;
|
use wasm_bindgen::JsCast;
|
||||||
|
|
||||||
|
|
@ -164,9 +163,7 @@ pub fn RealmSceneViewer(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(prop_id) = clicked_prop {
|
if clicked_prop.is_none() {
|
||||||
on_prop_click.run(prop_id);
|
|
||||||
} else {
|
|
||||||
let target = ev.current_target().unwrap();
|
let target = ev.current_target().unwrap();
|
||||||
let element: web_sys::HtmlElement = target.dyn_into().unwrap();
|
let element: web_sys::HtmlElement = target.dyn_into().unwrap();
|
||||||
let rect = element.get_bounding_client_rect();
|
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 let Some(prop_id_str) = canvas.get_attribute("data-prop-id") {
|
||||||
if hit_test_canvas(&canvas, client_x, client_y) {
|
if hit_test_canvas(&canvas, client_x, client_y) {
|
||||||
if let Ok(prop_id) = prop_id_str.parse::<Uuid>() {
|
if let Ok(prop_id) = prop_id_str.parse::<Uuid>() {
|
||||||
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) {
|
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_scale_mode_initial_scale.set(prop.scale);
|
||||||
set_prop_context_is_locked.set(prop.is_locked);
|
set_prop_context_is_locked.set(prop.is_locked);
|
||||||
set_move_mode_prop_scale.set(prop.scale);
|
set_move_mode_prop_scale.set(prop.scale);
|
||||||
|
|
@ -599,6 +604,7 @@ pub fn RealmSceneViewer(
|
||||||
let is_locked = prop_context_is_locked.get();
|
let is_locked = prop_context_is_locked.get();
|
||||||
let mut items = Vec::new();
|
let mut items = Vec::new();
|
||||||
if !is_locked || is_mod {
|
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() });
|
items.push(ContextMenuItem { label: "Move".to_string(), action: "move".to_string() });
|
||||||
}
|
}
|
||||||
if is_mod {
|
if is_mod {
|
||||||
|
|
@ -612,8 +618,14 @@ pub fn RealmSceneViewer(
|
||||||
})
|
})
|
||||||
on_select=Callback::new({
|
on_select=Callback::new({
|
||||||
let on_prop_lock_toggle = on_prop_lock_toggle.clone();
|
let on_prop_lock_toggle = on_prop_lock_toggle.clone();
|
||||||
|
let on_prop_click = on_prop_click.clone();
|
||||||
move |action: String| {
|
move |action: String| {
|
||||||
match action.as_str() {
|
match action.as_str() {
|
||||||
|
"pick_up" => {
|
||||||
|
if let Some(prop_id) = prop_context_menu_target.get() {
|
||||||
|
on_prop_click.run(prop_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
"set_scale" => {
|
"set_scale" => {
|
||||||
if let Some(prop_id) = prop_context_menu_target.get() {
|
if let Some(prop_id) = prop_context_menu_target.get() {
|
||||||
set_scale_mode_prop_id.set(Some(prop_id));
|
set_scale_mode_prop_id.set(Some(prop_id));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue