diff options
-rw-r--r-- | client/gui/menus/settings/input/input_manager.gd | 59 | ||||
-rw-r--r-- | client/gui/menus/settings/input/input_setting.gd | 2 | ||||
-rw-r--r-- | client/gui/overlays/popup_message/popup_message.gd | 4 | ||||
-rw-r--r-- | client/system/settings.gd | 8 |
4 files changed, 15 insertions, 58 deletions
diff --git a/client/gui/menus/settings/input/input_manager.gd b/client/gui/menus/settings/input/input_manager.gd index da148e8d..b0b80a39 100644 --- a/client/gui/menus/settings/input/input_manager.gd +++ b/client/gui/menus/settings/input/input_manager.gd @@ -22,64 +22,21 @@ enum EventType { OTHER } -var default_input_map = {} -var input_map: Dictionary +func action_list() -> Array: # Array[String] + return InputMap.get_actions().filter(func isBuiltIn(k: String): return !k.begins_with("ui_")).map(func (x): return str(x)) -func _init(): - default_input_map = get_input_map() - input_map = default_input_map.duplicate(true) - -func get_input_map() -> Dictionary: - var actions = InputMap.get_actions().filter(func isBuiltIn(k: String): return !k.begins_with("ui_")) - var kb = {} - for a in actions: - var input_events: Array[InputEvent] = InputMap.action_get_events(a).duplicate(true) - kb[a] = input_events - return kb - -func get_events(action_name: String) -> Array: - if not input_map.has(action_name): - push_error("Tried to get action %s in input map which does not exist" % action_name) - return [] - return input_map[action_name] +func update_input_map(action: String): + if not action in action_list(): return + InputMap.action_erase_events(action) + for event in Settings.read("input.%s" % action): + InputMap.action_add_event(action, event) func settings(extra) -> Array: # Array[GameSetting] var entries := [] - for k in input_map.keys(): entries.append(InputSetting.new(k)) + for k in action_list(): entries.append(InputSetting.new(k)) entries.append_array(extra) return entries -func change_input_map_action(action_name: String, events: Array, save: bool = true): - if !InputMap.has_action(action_name): - push_error("Action %s does not exist" % action_name, false) - return - # Erase previous keybindings - InputMap.action_erase_events(action_name) - # Add new keybindings - for e in events: - InputMap.action_add_event(action_name, e) - - if save: - # Update input map dictionary - input_map = get_input_map() - # Save settings - Settings.write("input_map", input_map.duplicate(true)) - -func apply_input_map(new_input_map: Dictionary): - # Load into input map dictionary - for k in new_input_map.keys(): - input_map[k] = [] - for a in new_input_map[k]: - input_map[k].append(a) - - # Apply keybindings - for k in input_map.keys(): - change_input_map_action(k, input_map[k], false) - -func reset_input_map(): - Settings.write("input_map", default_input_map.duplicate()) - apply_input_map(Settings.read("input_map")) - func get_event_type(input_event: InputEvent) -> EventType: if input_event is InputEventKey or input_event is InputEventMouseButton: return EventType.KEYBOARD diff --git a/client/gui/menus/settings/input/input_setting.gd b/client/gui/menus/settings/input/input_setting.gd index 3367ac8e..3533cddf 100644 --- a/client/gui/menus/settings/input/input_setting.gd +++ b/client/gui/menus/settings/input/input_setting.gd @@ -20,7 +20,7 @@ const INPUT_VALUE_NODE_SCENE = preload("res://gui/menus/settings/input/input_val func _init(new_id: String): super(new_id) - default = InputManager.default_input_map[new_id] + default = InputMap.action_get_events(new_id).duplicate(true) func create_row(): var row = super() diff --git a/client/gui/overlays/popup_message/popup_message.gd b/client/gui/overlays/popup_message/popup_message.gd index 6a3d8273..74268958 100644 --- a/client/gui/overlays/popup_message/popup_message.gd +++ b/client/gui/overlays/popup_message/popup_message.gd @@ -178,8 +178,8 @@ func _on_zoom_timeout(): )])) func display_keybind(action_name: String) -> String: - var events := InputManager.get_events(action_name) - + var events = Settings.read("input.%s" % action_name) + if events.size() == 0: # There are no events which match the action return tr("c.settings.input.unknown_event") diff --git a/client/system/settings.gd b/client/system/settings.gd index 97546c68..e1ef5c0d 100644 --- a/client/system/settings.gd +++ b/client/system/settings.gd @@ -127,7 +127,7 @@ static func save(): static func trigger_hook(key: String, value): for slot in change_hooks.get(key, {}): change_hooks[key][slot].callv([value] if value != null else []) - if key.find(".") != -1: trigger_hook(key.rsplit(".", false, 1)[0], null) + if key.find(".") != -1: trigger_hook(key.rsplit(".", false, 1)[0], key.rsplit(".", false, 1)[1]) static func hook_changed(key: String, slot: String, callable: Callable): if not change_hooks.has(key): change_hooks[key] = {} @@ -188,6 +188,9 @@ static func h_language(language: String): if language == "system": language = OS.get_locale_language() TranslationServer.set_locale(language) +static func h_input(key: String): + InputManager.update_input_map(key) + static func h_fullscreen(mode: String): match mode: "keep": pass @@ -195,9 +198,6 @@ static func h_fullscreen(mode: String): "never": if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) -static func h_input(): - InputManager.apply_input_map(Settings.get_category_dict("input")) - static func h_hints_started(started: bool): if not started: for k in Profile.values["hints"].keys(): |