102 lines
3.1 KiB
GDScript
102 lines
3.1 KiB
GDScript
class_name PankuModule extends Node
|
|
# extends Node: A hacky way to avoid cyclic RefCounted verbose warnings which is uncessary to worry about.
|
|
|
|
var core:PankuConsole
|
|
|
|
var _env:RefCounted = null
|
|
var _opt:ModuleOptions = null
|
|
|
|
# dir name of the module
|
|
func get_module_name() -> String:
|
|
return get_script().resource_path.get_base_dir().get_file()
|
|
|
|
# called when the module is loaded
|
|
func init_module():
|
|
pass
|
|
|
|
# called when the module is unloaded (quit program)
|
|
func quit_module():
|
|
if _opt:
|
|
_opt._loaded = false
|
|
|
|
# called at the start of each physics frame
|
|
func update_module(delta:float):
|
|
pass
|
|
|
|
func save_module_data(key:String, value:Variant):
|
|
var cfg:Dictionary = PankuConfig.get_config()
|
|
var module_name:String = get_module_name()
|
|
if !cfg.has(module_name):
|
|
cfg[module_name] = {}
|
|
cfg[module_name][key] = value
|
|
PankuConfig.set_config(cfg)
|
|
|
|
func load_module_data(key:String, default_value:Variant = null) -> Variant:
|
|
var cfg:Dictionary = PankuConfig.get_config()
|
|
var module_name:String = get_module_name()
|
|
var module_data = cfg.get(module_name, {})
|
|
return module_data.get(key, default_value)
|
|
|
|
func has_module_data(key:String) -> bool:
|
|
var cfg:Dictionary = PankuConfig.get_config()
|
|
var module_name:String = get_module_name()
|
|
var module_data = cfg.get(module_name, {})
|
|
return module_data.has(key)
|
|
|
|
func load_window_data(window:PankuLynxWindow):
|
|
window.position = load_module_data("window_position", window.get_layout_position([
|
|
Control.PRESET_TOP_LEFT,
|
|
Control.PRESET_CENTER_TOP,
|
|
Control.PRESET_TOP_RIGHT,
|
|
Control.PRESET_CENTER_LEFT,
|
|
Control.PRESET_CENTER,
|
|
Control.PRESET_CENTER_RIGHT,
|
|
Control.PRESET_BOTTOM_LEFT,
|
|
Control.PRESET_CENTER_BOTTOM,
|
|
Control.PRESET_BOTTOM_RIGHT,
|
|
][randi()%9]))
|
|
window.size = load_module_data("window_size", window.get_normal_window_size())
|
|
window.set_window_visibility(load_module_data("window_visibility", false))
|
|
|
|
func save_window_data(window:PankuLynxWindow):
|
|
_save_window_geometry(window)
|
|
save_module_data("window_visibility", window.visible)
|
|
|
|
|
|
func _save_window_geometry(window:PankuLynxWindow):
|
|
save_module_data("window_position", window.position)
|
|
save_module_data("window_size", window.get_normal_window_size())
|
|
|
|
|
|
# Add hook to window to auto save its geometry on close.
|
|
func add_auto_save_hook(window: PankuLynxWindow) -> void:
|
|
# Here some global settings check can be implemented,
|
|
# if we decide to make "save on close" feature optional
|
|
window.window_closed.connect(_save_window_geometry.bind(window))
|
|
|
|
|
|
func get_module_env() -> RefCounted:
|
|
return _env
|
|
|
|
func get_module_opt() -> ModuleOptions:
|
|
return _opt
|
|
|
|
func _init_module():
|
|
var module_script_dir:String = get_script().resource_path.get_base_dir()
|
|
var env_script_path = module_script_dir + "/env.gd"
|
|
var opt_script_path = module_script_dir + "/opt.gd"
|
|
|
|
if FileAccess.file_exists(env_script_path):
|
|
_env = load(env_script_path).new()
|
|
_env._module = self
|
|
core.gd_exprenv.register_env(get_module_name(), _env)
|
|
|
|
if FileAccess.file_exists(opt_script_path):
|
|
#print(opt_script_path)
|
|
_opt = load(opt_script_path).new() as ModuleOptions
|
|
_opt._module = self
|
|
|
|
init_module()
|
|
if _opt:
|
|
_opt._loaded = true
|