database and settings singletons
authorEduardo <[email protected]>
Sat, 23 Sep 2023 18:03:36 +0000 (20:03 +0200)
committerEduardo <[email protected]>
Sat, 23 Sep 2023 18:03:36 +0000 (20:03 +0200)
project.godot
scenes/splash_screen/SplashScreen.gd
scenes/splash_screen/SplashScreen.tscn
singletons/database_dao.gd
singletons/settings_dao.gd

index 47bc8573c2134978de44ff992291592a51125915..2392f0ec55aaa4fc6e6d851c0d14c32d033d91f3 100644 (file)
@@ -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
index 1a68576fc31d63e16866599e98df7b4df0d0d437..a35f6c6909b951839c9c4be3b175285dbf9e4666 100644 (file)
@@ -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()
-
index 5880076177fd87f1cd64a13ccc4687a1ccb6cd93..909ed83f00e8f7564d048aa547d1dcffd4a3ffd6 100644 (file)
@@ -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"]
index c167eb302f3d2f91b537fc4126b3ee5a337f9152..eb29f5a8e7c6eb357de4745b063d7535266f92bb 100644 (file)
@@ -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)
index 9ab9c5356dcd426702184081266d0816999c9dbc..2d2bab58f7888de1b761abd58676bf254e3a4bab 100644 (file)
@@ -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)