How to keep those GlobalScene Data persistent?

Godot Version

4.7.1

Question

Just trying to figure out what be sensible approach to keep values in configfile for SettingsContainer in GameDev.tv character_controller project.

current snippet how it’s handle it : →

extends MarginContainer

signal exit()

@export_category("Mouse Sensitivity")
@export var very_low_sens: float = 0.00025
@export var low_sens: float = 0.0005
@export var medium_sens: float = 0.00075
@export var high_sens: float = 0.001
@export var very_high_sens: float = 0.00125

# A reference to the player for maintaining settings. ( Yes till you reload game :-) ) 
var _player: Player

func _ready() -> void:
	# Default sensitivity to medium.
	sensitivity_dropdown.select(sensitivity_dropdown.selected)

func _on_option_button_item_selected(index: int) -> void:
	match index:
		0:
			_player.mouse_sensitivity = very_low_sens
		1:
			_player.mouse_sensitivity = low_sens
		2:
			_player.mouse_sensitivity = medium_sens
		3:
			_player.mouse_sensitivity = high_sens
		4:
			_player.mouse_sensitivity = very_high_sens

# When the player node changes apply the latest gameplay settings.
func update_player(player_in: Player) -> void:
	_player = player_in
	_on_option_button_item_selected(sensitivity_dropdown.selected)
	

This works while you play game, but keep those settings persistent, would I need to shift autoload and make new autoload for ConfigFile — Godot Engine (latest) documentation in English ?

currently this scene is autoload because it hold other settings like AA, FOV etc.

SavingSystem →

class_name SaveSystemClass
extends Node


func save_data() -> void:
	var config = ConfigFile.new()
	config.save("user://settings.cfg")

func load_data() -> void:
	var config = ConfigFile.new()
	var err = config.load("user://settings.cfg")

	# If the file didn't load, ignore it.
	if err != OK:
		return

How would I need to adapt UI script and call save_data and load_data to keep setting persistent for this mouse_sensitivity ?

System itself →

class_name SaveSystemClass
extends Node

const SETTINGS_PATH := "user://settings.cfg"
var config = ConfigFile.new()

func _ready() -> void:
	load_data()

func save_data() -> void:
	var err = config.save(SETTINGS_PATH)
	if err != OK:
		push_warning("Failed to save: %s" % err)

func load_data() -> void:
	var err = config.load(SETTINGS_PATH)
	if err != OK:
		return
		
func set_setting(section: String, key: String, value: Variant) -> void:
	config.set_value(section, key, value)
	save_data()
	
func get_setting(section: String, key: String, value: Variant) -> Variant:
	return config.get_value(section, key, value)

Mouse →

extends MarginContainer

signal exit()

@export_category("Mouse Sensitivity")
@export var very_low_sens: float = 0.00025
@export var low_sens: float = 0.0005
@export var medium_sens: float = 0.00075
@export var high_sens: float = 0.001
@export var very_high_sens: float = 0.00125
var _sensitivity_values: Array[float]



func focus() -> void:
	button.grab_focus()

func _ready() -> void:

	_sensitivity_values = [very_low_sens, low_sens, medium_sens, high_sens, very_high_sens]

	var saved_sens_index: int = SavingSytem.get_setting("mouse", "sensitivity_index", 2)
	sensitivity_dropdown.select(saved_sens_index)
	_apply_sensitivity(saved_sens_index)

#signal part
func _on_option_button_item_selected(index: int) -> void:
	_apply_sensitivity(index)
	SavingSytem.set_setting("mouse", "sensitivity_index", index)

# function to apply sensitivity for index 
func _apply_sensitivity(index: int) -> void:
	if _player:
		_player.mouse_sensitivity = _sensitivity_values[index]
	
# when return back to level it will be applied already to player 
func update_player(player_in: Player) -> void:
	_player = player_in
	_apply_sensitivity(sensitivity_dropdown.selected)