diff options
Diffstat (limited to 'logic')
| -rw-r--r-- | logic/database.gd | 1 | ||||
| -rw-r--r-- | logic/menu.gd | 8 | ||||
| -rw-r--r-- | logic/settings.gd | 118 |
3 files changed, 125 insertions, 2 deletions
diff --git a/logic/database.gd b/logic/database.gd index ed80ae7..5d8792f 100644 --- a/logic/database.gd +++ b/logic/database.gd @@ -15,6 +15,7 @@ onready var add_button := get_node("actions/add") as Button onready var popup := get_node("/root/main/popup") as ModalPopup onready var dialog := get_node("/root/main/dialog") as Dialog + func _init(): selected_idx = -1 staged_idx = -1 diff --git a/logic/menu.gd b/logic/menu.gd index 4b0b7b3..cc461b9 100644 --- a/logic/menu.gd +++ b/logic/menu.gd @@ -2,6 +2,7 @@ extends MenuButton const LOGS_FILE_PATH: String = "user://logs/godot.log" const menu_items: Array = [ + { label = "Toggle Theme", action = "toggle_theme_action" }, { label = "Import Option Sets", action = "import_option_sets_action" }, { label = "Export Option Sets", action = "export_option_sets_action" }, { label = "Clear Option Sets", action = "clear_option_sets_action" }, @@ -11,9 +12,8 @@ const menu_items: Array = [ { label = "Export App Log", action = "export_app_log_action" }, { label = "About", action = "about_action" }, ] -const license_font_b612: String = "res://licenses/font_b612.txt" -const license_godot: String = "res://licenses/godot.txt" +onready var main := get_node("/root/main") as Control onready var menu := get_popup() as PopupMenu onready var popup := get_node("/root/main/popup") as ModalPopup onready var dialog := get_node("/root/main/dialog") as Dialog @@ -32,6 +32,10 @@ func id_pressed(id: int): self.call_deferred(menu_items[id].action) +func toggle_theme_action(): + main.toggle_theme() + + func import_option_sets_action(): dialog.setup("All option sets from the dropdown menus will be replaced.", "Continue", "No") dialog.connect("accepted", self, "import_option_sets_action_accepted") diff --git a/logic/settings.gd b/logic/settings.gd new file mode 100644 index 0000000..51f0e30 --- /dev/null +++ b/logic/settings.gd @@ -0,0 +1,118 @@ +extends Reference +class_name Settings + +const SETTINGS_FILE_PATH := "user://settings.json" +const SETTINGS_FILE_VERSION := "SETTINGS_V1" + +var settings : Dictionary +var defer_save := false + + +func _init(): + load_settings() + + +func set_value(name: String, value) -> void: + settings[name] = value + if defer_save == false: + save_settings() + + +func get_value(name: String, default = null): + if settings.has(name) == false: + printerr("Setting '%s' not found." % name) + + return settings.get(name, default) + + +func remove_value(name: String) -> void: + settings.erase(name) + if defer_save == false: + save_settings() + + +func save_settings(file_path: String = SETTINGS_FILE_PATH): + match file_path.get_extension(): + "json": + export_json(file_path, settings) + + _: + printerr("Invalid settings file extension '%s', expected 'json'." % file_path.get_file()) + return + + +static func export_json(file_path: String, data: Dictionary): + var settings_file := { + "version": SETTINGS_FILE_VERSION, + "settings": data, + } + var indentation_char := "" if file_path == SETTINGS_FILE_PATH else "\t" + var file_content := JSON.print(settings_file, indentation_char) + + var file := File.new() + file.open(file_path, File.WRITE) + file.store_string(file_content) + file.close() + + +func load_settings(file_path: String = SETTINGS_FILE_PATH): + match file_path.get_extension(): + "json": + settings = import_json(file_path) + + _: + printerr("Invalid settings file extension '%s', expected 'json'." % file_path.get_file()) + return + + +static func import_json(file_path: String) -> Dictionary: + var result := {} + + var file := File.new() + var error := file.open(file_path, File.READ_WRITE) + if error != OK: + printerr("Failed to open settings file '%s' (error %d)." % [file_path, error]) + return result + var file_content = file.get_as_text() + file.close() + var parse_result = JSON.parse(file_content) + + # @DAM All these import/export json functions in database/state/settings could maybe be abstracted!? + +# if parse_result.error != OK: +# printerr("Failed to parse settings file '%s' (error %d)." % [file_path, parse_result.error]) +# elif typeof(parse_result.result) != TYPE_DICTIONARY: +# printerr("Invalid settings file type '%s', expected '%s'." % [typeof(parse_result.result), TYPE_DICTIONARY]) +# elif parse_result.result["version"] != SETTINGS_FILE_VERSION: +# printerr("Invalid settings file version '%s', expected '%s'." % [parse_result.result["version"], SETTINGS_FILE_VERSION]) +# elif typeof(parse_result.result["settings"]) != TYPE_ARRAY: +# printerr("Invalid settings content type '%s', expected '%s'." % [typeof(parse_result.result["settings"]), TYPE_DICTIONARY]) +# else: +# result = parse_result.result["settings"] + + +# WIP WIP WIP +# Decide on how to print errors. +# Maybe use error checking as defined above. +# Maybe create parameterized functions to import/export JSON files. + + if parse_result.error != OK: + printerr("Failed to parse settings file '%s' (error %d)." % [file_path, parse_result.error]) + return result + + if typeof(parse_result.result) != TYPE_DICTIONARY: + print_stack() # @DAM Decide on how to print errors ... once and for all! + printerr("Invalid settings file type '%s', expected '%s'." % [typeof(parse_result.result), TYPE_DICTIONARY]) + return result + + if parse_result.result["version"] != SETTINGS_FILE_VERSION: + printerr("Invalid settings file version '%s', expected '%s'." % [parse_result.result["version"], SETTINGS_FILE_VERSION]) + return result + + if typeof(parse_result.result["settings"]) != TYPE_DICTIONARY: + printerr("Invalid settings content type '%s', expected '%s'." % [typeof(parse_result.result["settings"]), TYPE_DICTIONARY]) + return result + + result = parse_result.result["settings"] + return result + |
