Normalize cursor handoff across gameplay menus

This commit is contained in:
Alexander Sellite 2026-08-31 05:48:47 -04:00
parent 6578d3e870
commit 3be79fa3fc
5 changed files with 71 additions and 10 deletions

View file

@ -82,9 +82,11 @@ func open_shop() -> bool:
return false
_prior_movement_enabled = _player.is_movement_enabled()
_prior_camera_enabled = _player.is_camera_input_enabled()
_prior_mouse_mode = Input.mouse_mode
_player.set_movement_enabled(false)
# Release any active right-click drag first. The shop must not remember the
# drag's transient captured mode because release may happen inside the UI.
_player.set_camera_input_enabled(false)
_prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode)
_fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true)
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
_transaction_pending = (
@ -133,6 +135,12 @@ func close_for_session_end() -> void:
close_shop(false)
func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode:
if mouse_mode == Input.MOUSE_MODE_CAPTURED:
return Input.MOUSE_MODE_VISIBLE
return mouse_mode
func _unhandled_input(event: InputEvent) -> void:
if not visible or not event.is_action_pressed("ui_cancel"):
return

View file

@ -654,11 +654,14 @@ func open_shop() -> bool:
)
_prior_movement_enabled = _player.is_movement_enabled()
_prior_camera_enabled = _player.is_camera_input_enabled()
_prior_mouse_mode = Input.mouse_mode
_player.set_movement_enabled(false)
# Releasing an active camera drag before the snapshot prevents the close
# path from restoring a captured pointer after its matching button release
# has been consumed by the shop.
_player.set_camera_input_enabled(false)
_prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode)
_snapshot_stored = true
_mouse_snapshot_stored = true
_player.set_movement_enabled(false)
_player.set_camera_input_enabled(false)
_fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true)
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
_set_feedback("")
@ -1897,3 +1900,9 @@ func _apply_mouse_close_policy(reason: CloseReason) -> void:
CloseReason.TEARDOWN:
pass
_mouse_snapshot_stored = false
func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode:
if mouse_mode == Input.MOUSE_MODE_CAPTURED:
return Input.MOUSE_MODE_VISIBLE
return mouse_mode

View file

@ -1559,11 +1559,14 @@ func open_menu() -> void:
_cancel_page_tween()
_prior_movement_enabled = _player.is_movement_enabled()
_prior_camera_input_enabled = _player.is_camera_input_enabled()
_prior_mouse_mode = Input.mouse_mode
_player.set_movement_enabled(false)
# Ending an active right-click camera drag restores its ordinary pointer
# mode. Snapshot after that handoff so this menu never restores the drag's
# transient captured mode when it closes.
_player.set_camera_input_enabled(false)
_prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode)
_control_snapshot_stored = true
_mouse_snapshot_stored = true
_player.set_movement_enabled(false)
_player.set_camera_input_enabled(false)
_fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true)
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
visible = true
@ -1775,6 +1778,16 @@ func _apply_mouse_close_policy(reason: CloseReason) -> void:
_mouse_snapshot_stored = false
func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode:
# Mouse capture belongs to an in-progress camera drag, never to the player
# menu itself. A held right button can be released while this menu owns
# input, so restoring CAPTURED here would leave the pointer hidden without
# an active drag to release it.
if mouse_mode == Input.MOUSE_MODE_CAPTURED:
return Input.MOUSE_MODE_VISIBLE
return mouse_mode
func _on_bite_activated() -> void:
if visible:
close_menu(CloseReason.BITE_STARTED)

View file

@ -109,9 +109,12 @@ func _open_storage(
_decorate_button.visible = home_access and allow_decorating
_prior_movement_enabled = _player.is_movement_enabled()
_prior_camera_enabled = _player.is_camera_input_enabled()
_prior_mouse_mode = Input.mouse_mode
_player.set_movement_enabled(false)
# End an in-progress right-click camera drag before taking the snapshot.
# A held button can be released while this page owns input, so captured mode
# is never a valid mouse mode to restore when the page closes.
_player.set_camera_input_enabled(false)
_prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode)
_fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true)
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
_feedback.text = "select an item to move it · drag to choose a slot"
@ -153,6 +156,12 @@ func close_for_session_end() -> void:
close_storage(false)
func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode:
if mouse_mode == Input.MOUSE_MODE_CAPTURED:
return Input.MOUSE_MODE_VISIBLE
return mouse_mode
func consume_escape() -> bool:
if not visible:
return false