From: Eduardo Date: Sat, 23 Sep 2023 18:03:36 +0000 (+0200) Subject: database and settings singletons X-Git-Url: http://git.edufdez.es/?a=commitdiff_plain;h=8431192b5146446620c1acd2968e056c6ded0934;p=The%20Cutests%20To-Do%20List.git database and settings singletons --- diff --git a/project.godot b/project.godot index 47bc857..2392f0e 100644 --- a/project.godot +++ b/project.godot @@ -18,6 +18,11 @@ run/max_fps=30 boot_splash/image="res://scenes/splash_screen/splash_image.png" config/icon="res://icon.svg" +[autoload] + +Settings="*res://singletons/settings_dao.gd" +DB="*res://singletons/database_dao.gd" + [display] window/size/viewport_width=1080 diff --git a/scenes/splash_screen/SplashScreen.gd b/scenes/splash_screen/SplashScreen.gd index 1a68576..a35f6c6 100644 --- a/scenes/splash_screen/SplashScreen.gd +++ b/scenes/splash_screen/SplashScreen.gd @@ -1,32 +1,24 @@ extends Node -const SCENE_SWITCHER = "res://scene_switcher/SceneSwitcher.tscn" +const SCENE_SWITCHER := "res://scene_switcher/SceneSwitcher.tscn" -@onready var fade_curtain = $FadeCurtain -@onready var animation_player = $AnimationPlayer -@onready var load_percentage = $LoadPercentage +@onready var animation_player := $AnimationPlayer +@onready var load_percentage := $LoadPercentage -var settings_thread: Thread -var database_thread: Thread - -func _ready(): - ResourceLoader.load_threaded_request(SCENE_SWITCHER) - - settings_thread = Thread.new() - database_thread = Thread.new() - settings_thread.start(load_settings) - database_thread.start(preload_database) - -func _exit_tree(): - settings_thread.wait_to_finish() - database_thread.wait_to_finish() +var bg: Thread func _process(_delta): - var percentageArr = [] + var percentageArr := [] ResourceLoader.load_threaded_get_status(SCENE_SWITCHER, percentageArr) load_percentage.text = str(int(percentageArr[0] * 100)) + "%" +func _on_ready(): + bg = Thread.new() + bg.start(do_in_background) + ResourceLoader.load_threaded_request(SCENE_SWITCHER) + func _on_splash_time_timeout(): + bg.wait_to_finish() animation_player.play("fade_out") func _on_animation_player_animation_finished(anim_name): @@ -36,11 +28,10 @@ func _on_animation_player_animation_finished(anim_name): get_tree().change_scene_to_packed(scene) queue_free() +func do_in_background(): + load_settings() + DB.instanciate() + func load_settings(): - var dao = SettingsDAO.new() - print(dao.get_setting("theme", "clasic")) + print(Settings.get_setting("theme", "clasic")) # TODO: set settings to do whatever they may do - -func preload_database(): - var db = DatabaseDAO.new() - diff --git a/scenes/splash_screen/SplashScreen.tscn b/scenes/splash_screen/SplashScreen.tscn index 5880076..909ed83 100644 --- a/scenes/splash_screen/SplashScreen.tscn +++ b/scenes/splash_screen/SplashScreen.tscn @@ -105,7 +105,7 @@ expand_mode = 5 stretch_mode = 3 [node name="SplashTime" type="Timer" parent="."] -wait_time = 0.5 +wait_time = 0.2 one_shot = true autostart = true @@ -122,5 +122,6 @@ libraries = { "": SubResource("AnimationLibrary_6sio5") } +[connection signal="ready" from="." to="." method="_on_ready"] [connection signal="timeout" from="SplashTime" to="." method="_on_splash_time_timeout"] [connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_player_animation_finished"] diff --git a/singletons/database_dao.gd b/singletons/database_dao.gd index c167eb3..eb29f5a 100644 --- a/singletons/database_dao.gd +++ b/singletons/database_dao.gd @@ -1,29 +1,65 @@ -class_name DatabaseDAO extends Node +extends Node -const DB_NAME = "user://the-cutest-database" +const DB_NAME := "user://the-cutest-database" const DB_VERSION: int = 1 -const VERBOSITY_LELVEL = SQLite.NORMAL +const VERBOSITY_LELVEL := SQLite.NORMAL -var db +var _db: SQLite -func _init(): - db = SQLite.new() - db.path = DB_NAME - db.verbosity_level = VERBOSITY_LELVEL - var success = db.open_db() - if not success: - printerr("Failed to open database: ", DB_NAME) +func _get_instance() -> SQLite: + if not _is_instanced(): + _db = SQLite.new() + _db.path = DB_NAME + _db.verbosity_level = VERBOSITY_LELVEL + + var success := _db.open_db() + if not success: + printerr("Failed to open database: ", DB_NAME) + + _migrate() - _migrate() + return _db + +func _is_instanced() -> bool: + if _db is SQLite: + return true + else: + return false + + +## PUBLIC METHODS + +## instanciate and checks for database upgrade migrations +func instanciate(): + _get_instance() + +## get todo list +## if done is null will return all tasks, else it will return the done ones or not done ones +func get_todo_tasks(done = null) -> Array[Dictionary]: + var query := "SELECT task, done, position, priority FROM todo" + if done: + query += " WHERE done = 1;" + elif done == false: + query += " WHERE done = 0;" + else: + query += ";" + + var success := _get_instance().query(query) + if success: + return _get_instance().query_result + else: + printerr("Query didnt work (DB.get_todo_tasks()): ", query) + return [Dictionary()] + ## MIGRATIONS func _migrate(): # get database version from metadata table - var current_version = 0 - var success = db.query("SELECT value FROM metadata WHERE key = 'version';") + var current_version := 0 + var success := _db.query("SELECT value FROM metadata WHERE key = 'version';") if success: - current_version = int(db.query_result[0]["value"]) + current_version = int(_db.query_result[0]["value"]) if current_version < DB_VERSION: while current_version < DB_VERSION: @@ -40,28 +76,28 @@ func _migrate(): current_version = current_version + 1 # save to database the new version - db.update_rows("metadata", "key='version'", {"value": current_version}) + _db.update_rows("metadata", "key='version'", {"value": current_version}) ## generates the new database, as 0 means there was no database present func _migrate_database_from_0_to_1(): # metadata table - var table_name = "metadata" - var columns = { + var table_name := "metadata" + var columns := { "key": { "data_type": "text", "primary_key": true }, "value": {"data_type": "text"} } - var data = [ + var data := [ {"key": "version", "value": "1"}, {"key": "install_time", "value": Time.get_unix_time_from_system()} ] - db.create_table(table_name, columns) + _db.create_table(table_name, columns) for row in data: - db.insert_row(table_name, row) + _db.insert_row(table_name, row) # todo table table_name = "todo" @@ -74,7 +110,7 @@ func _migrate_database_from_0_to_1(): "updated_at": {"data_type": "text"} } - db.create_table(table_name, columns) + _db.create_table(table_name, columns) # calendar table table_name = "calendar" @@ -88,4 +124,4 @@ func _migrate_database_from_0_to_1(): "updated_at": {"data_type": "text"} } - db.create_table(table_name, columns) + _db.create_table(table_name, columns) diff --git a/singletons/settings_dao.gd b/singletons/settings_dao.gd index 9ab9c53..2d2bab5 100644 --- a/singletons/settings_dao.gd +++ b/singletons/settings_dao.gd @@ -1,11 +1,11 @@ extends Node const FILE_PATH := "user://settings.cfg" -const SECTION := "settings" +const _SECTION := "settings" var _config: ConfigFile -func get_instance() -> ConfigFile: - if not is_instanced(): +func _get_instance() -> ConfigFile: + if not _is_instanced(): _config = ConfigFile.new() if FileAccess.file_exists(FILE_PATH): @@ -15,17 +15,17 @@ func get_instance() -> ConfigFile: return _config -func is_instanced() -> bool: +func _is_instanced() -> bool: if _config is ConfigFile: return true else: return false func save(): - get_instance().save(FILE_PATH) + _get_instance().save(FILE_PATH) func set_setting(propertie: String, value): - get_instance().set_value(SECTION, propertie, value) + _get_instance().set_value(_SECTION, propertie, value) func get_setting(propertie: String, default = null): - return get_instance().get_value(SECTION, propertie, default) + return _get_instance().get_value(_SECTION, propertie, default)