Files
MovementTests/addons/guide/remapping/guide_remapping_config.gd
2025-05-27 19:20:46 +02:00

86 lines
3.3 KiB
GDScript

@icon("res://addons/guide/guide_internal.svg")
## A remapping configuration. This only holds changes to the context mapping,
## so to get the full input map you need to apply this on top of one or more
## mapping contexts. The settings from this config take precedence over the
## settings from the mapping contexts.
class_name GUIDERemappingConfig
extends Resource
## Dictionary with remapped inputs. Structure is:
## {
## mapping_context : {
## action : {
## index : bound input
## ...
## }, ...
## }
## The bound input can be NULL which means that this was deliberately unbound.
@export var remapped_inputs:Dictionary = {}
## Dictionary for additional custom data to store (e.g. modifier settings, etc.)
## Note that this data is completely under application control and it's the responsibility
## of the application to ensure that this data is serializable and gets applied at
## the necessary point in time.
@export var custom_data:Dictionary = {}
## Binds the given input to the given action. Index can be given to have
## alternative bindings for the same action.
func _bind(mapping_context:GUIDEMappingContext, action:GUIDEAction, input:GUIDEInput, index:int = 0) -> void:
if not remapped_inputs.has(mapping_context):
remapped_inputs[mapping_context] = {}
if not remapped_inputs[mapping_context].has(action):
remapped_inputs[mapping_context][action] = {}
remapped_inputs[mapping_context][action][index] = input
## Unbinds the given input from the given action. This is a deliberate unbind
## which means that the action should not be triggerable by the input anymore. It
## its not the same as _clear.
func _unbind(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> void:
_bind(mapping_context, action, null, index)
## Removes the given input action binding from this configuration. The action will
## now have the default input that it has in the mapping_context. This is not the
## same as _unbind.
func _clear(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> void:
if not remapped_inputs.has(mapping_context):
return
if not remapped_inputs[mapping_context].has(action):
return
remapped_inputs[mapping_context][action].erase(index)
if remapped_inputs[mapping_context][action].is_empty():
remapped_inputs[mapping_context].erase(action)
if remapped_inputs[mapping_context].is_empty():
remapped_inputs.erase(mapping_context)
## Returns the bound input for the given action name and index. Returns null
## if there is matching binding.
func _get_bound_input_or_null(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> GUIDEInput:
if not remapped_inputs.has(mapping_context):
return null
if not remapped_inputs[mapping_context].has(action):
return null
return remapped_inputs[mapping_context][action].get(index, null)
## Returns whether or not this mapping has a configuration for the given combination (even if the
## combination is set to null).
func _has(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> bool:
if not remapped_inputs.has(mapping_context):
return false
if not remapped_inputs[mapping_context].has(action):
return false
return remapped_inputs[mapping_context][action].has(index)