From 2e23c39bcdd0f965210936afe0bb589443ded917 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Mon, 29 May 2023 20:46:47 +0200 Subject: [PATCH] Added events and resmgr API + improved startup --- autoload.gd | 6 +++++ core.gd | 15 ++++++++++++ coreloader.gd | 16 ++++++------- events.gd | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ resmgr.gd | 46 +++++++++++++++++++++++++++++++++++++ wmgr.gd | 3 +-- 6 files changed, 139 insertions(+), 10 deletions(-) create mode 100644 events.gd create mode 100644 resmgr.gd diff --git a/autoload.gd b/autoload.gd index d7a6a20..992efb1 100644 --- a/autoload.gd +++ b/autoload.gd @@ -6,6 +6,9 @@ # Licensed under GNU GPLv3 extends Node +@onready +var core = get_node(NodePath("/root/core")) + func singleton(singleton_name:String,singleton_path:String) -> void: var node = Control.new() node.name = singleton_name @@ -23,3 +26,6 @@ func preset(plugin_id:String) -> bool: return false get_tree().root.add_child(node) return true + +func _ready() -> void: + core.setready() diff --git a/core.gd b/core.gd index 09adce7..3390e97 100644 --- a/core.gd +++ b/core.gd @@ -8,10 +8,14 @@ extends Node const version = "git-develop" var locked = false +var readycount = 0 +var readylized = false # Fun Fact: "ready" is a signal from "Node" and I (JeremyStarTM) just added "lized" from "initialized" to it to avoid the error thrown by Godot var config = null var wmgr = null var smgr = null +var resmgr = null var autoload = null +var events = null func attach(type:String,component:Script) -> void: if locked: @@ -30,15 +34,26 @@ func attach(type:String,component:Script) -> void: "smgr": add_child(comp) smgr = comp + "resmgr": + add_child(comp) + resmgr = comp "autoload": add_child(comp) autoload = comp + "events": + add_child(comp) + events = comp _: Logger.error("core","Failed attaching " + type + " to CORE: Invalid component") comp.free() return Logger.diag("core","Attached " + type + " successfully") +func setready() -> void: + readycount = readycount+1 + if readycount == 4: + readylized = true + func lock() -> void: locked = true Logger.diag("core","CORE is now locked. No new attachments can be made.") diff --git a/coreloader.gd b/coreloader.gd index bce5fb9..209ddfb 100644 --- a/coreloader.gd +++ b/coreloader.gd @@ -15,7 +15,9 @@ func _ready() -> void: var scr_core = ResourceLoader.load("res://CORE/core.gd") var scr_wmgr = ResourceLoader.load("res://CORE/wmgr.gd") var scr_smgr = ResourceLoader.load("res://CORE/smgr.gd") + var scr_resmgr = ResourceLoader.load("res://CORE/resmgr.gd") var scr_autoload = ResourceLoader.load("res://CORE/autoload.gd") + var scr_events = ResourceLoader.load("res://CORE/events.gd") Logger.info("coreloader","Constructing CORE") var core = Control.new() core.name = "core" @@ -30,19 +32,17 @@ func _ready() -> void: core.attach("wmgr",scr_wmgr) Logger.info("coreloader","Attaching smgr to CORE") core.attach("smgr",scr_smgr) + Logger.info("coreloader","Attaching resmgr to CORE") + core.attach("resmgr",scr_resmgr) Logger.info("coreloader","Attaching autoload to CORE") core.attach("autoload",scr_autoload) + Logger.info("coreloader","Attaching events to CORE") + core.attach("events",scr_events) Logger.info("coreloader","Locking CORE") core.lock() Logger.info("coreloader","Waiting for CORE to fully initialize") - await get_tree().create_timer(1).timeout - Logger.info("coreloader","Checking CORE availability") - if !core.wmgr.available: - Logger.error("coreloader","CORE wmgr is not available.Please check the log for any errors during initialization.") - return - if !core.smgr.available: - Logger.error("coreloader","CORE smgr is not available.Please check the log for any errors during initialization.") - Logger.info("coreloader","CORE is available.") + while !core.readylized: + await get_tree().create_timer(1).timeout Logger.info("coreloader","CORE has been initialized and is ready.") Logger.info("coreloader","Preloading project init script") var initscr = ResourceLoader.load(core.config.core_startscript) diff --git a/events.gd b/events.gd new file mode 100644 index 0000000..628d810 --- /dev/null +++ b/events.gd @@ -0,0 +1,63 @@ +extends Node + +@onready +var core = get_node(NodePath("/root/core")) +var window_title_prev = "" +var window_size_x_prev = 0 +var window_size_y_prev = 0 +var window_pos_x_prev = 0 +var window_pos_y_prev = 0 + +signal window_title +signal window_size +signal window_pos +signal logger_all +signal logger_diag +signal logger_info +signal logger_warn +signal logger_error + +func _ready() -> void: + Logger.connect("logevent",Callable(self,"logger_update")) + core.setready() + +func logger_update(type:String,script:String,message:String,_logmessage:String) -> void: + emit_signal("logger_all",type,script,message) + if type == "DIAG": + emit_signal("logger_diag",script,message) + elif type == "INFO": + emit_signal("logger_info",script,message) + elif type == "WARN": + emit_signal("logger_warn",script,message) + elif type == "ERROR": + emit_signal("logger_error",script,message) + +func _process(_delta:float) -> void: + var window_title_var = core.wmgr.get_title() + var window_size_x = core.wmgr.get_size().x + var window_size_y = core.wmgr.get_size().y + var window_pos_x = core.wmgr.get_position().x + var window_pos_y = core.wmgr.get_position().y + if window_title_prev != window_title_var: + emit_signal("window_title",window_title_var,window_title_prev) + window_title_prev = window_title_var + if window_size_x != window_size_x_prev and window_size_y != window_size_y_prev: + emit_signal("window_size","BOTH",Vector2i(window_size_x,window_size_y),Vector2i(window_size_x_prev,window_size_y_prev)) + window_size_x_prev = window_size_x + window_size_y_prev = window_size_y + elif window_size_x != window_size_x_prev: + emit_signal("window_size","X",Vector2i(window_size_x,window_size_y),Vector2i(window_size_x_prev,window_size_y_prev)) + window_size_x_prev = window_size_x + elif window_size_y != window_size_y_prev: + emit_signal("window_size","Y",Vector2i(window_size_x,window_size_y),Vector2i(window_size_x_prev,window_size_y_prev)) + window_size_y_prev = window_size_y + if window_pos_x != window_pos_x_prev and window_pos_y != window_pos_y_prev: + emit_signal("window_pos","BOTH",Vector2i(window_pos_x,window_pos_y),Vector2i(window_pos_x_prev,window_pos_y_prev)) + window_pos_x_prev = window_pos_x + window_pos_y_prev = window_pos_y + elif window_pos_x != window_pos_x_prev: + emit_signal("window_pos","X",Vector2i(window_pos_x,window_pos_y),Vector2i(window_pos_x_prev,window_pos_y_prev)) + window_pos_x_prev = window_pos_x + elif window_pos_y != window_pos_y_prev: + emit_signal("window_pos","Y",Vector2i(window_pos_x,window_pos_y),Vector2i(window_pos_x_prev,window_pos_y_prev)) + window_pos_y_prev = window_pos_y diff --git a/resmgr.gd b/resmgr.gd new file mode 100644 index 0000000..c3ea25c --- /dev/null +++ b/resmgr.gd @@ -0,0 +1,46 @@ +# resmgr.gd +# Resource Manager +# +# This file is part of StarOpenSource CORE (SOSCORE) +# Made by the StarOpenSource Project and Contributers +# Licensed under GNU GPLv3 +extends Node + +@onready +var core = get_node(NodePath("/root/core")) +var resources = {} + +func loadres(resname:String,respath:String,replace:bool = false) -> void: + if resources.has(resname): + if replace: + resources.erase(resname) + else: + Logger.error("resmgr","Loading \"" + resname + "\" failed: Resource is loaded already") + return + resources.merge({resname:ResourceLoader.load(respath)}) + +func unloadres(resname:String) -> void: + if !resources.has(resname): + Logger.error("resmgr","Unloading \"" + resname + "\" failed: Resource is not present") + return + resources.erase(resname) + +func loadbatch(batch:Dictionary) -> void: + if batch == {}: + Logger.error("resmgr","Loading a batch failed: Batch is empty") + for i in batch: + loadres(i,batch[i]) + +func unloadbatch(batch:Array) -> void: + if batch == []: + Logger.error("resmgr","Unloading a batch failed: Batch is empty") + for i in batch: + unloadres(i) + +func getres(resname:String): + if !resources.has(resname): + return null + return resources[resname] + +func _ready() -> void: + core.setready() diff --git a/wmgr.gd b/wmgr.gd index bd62c53..968c526 100644 --- a/wmgr.gd +++ b/wmgr.gd @@ -6,7 +6,6 @@ # Licensed under GNU GPLv3 extends Node -var available = false @onready var core = get_node(NodePath("/root/core")) @onready @@ -70,4 +69,4 @@ func _ready() -> void: DisplayServer.window_set_min_size(Vector2i(960,540)) DisplayServer.window_set_title(window_title) DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) - available = true + core.setready()