Figments-of-the-Night/addons/inkgd/editor/common/ink_configuration.gd
Gerard Gascón b99855351d init
2025-04-24 17:23:34 +02:00

204 lines
6.8 KiB
GDScript

# ############################################################################ #
# Copyright © 2019-2022 Frédéric Maquin <fred@ephread.com>
# Licensed under the MIT License.
# See LICENSE in the project root for license information.
# ############################################################################ #
extends RefCounted
class_name InkConfiguration
# ############################################################################ #
# Enums
# ############################################################################ #
enum BuildMode {
MANUAL = 0,
DURING_BUILD,
AFTER_CHANGE
}
# ############################################################################ #
# Constants
# ############################################################################ #
const ROOT_DIR = "res://"
const COMPILER_CONFIG = ROOT_DIR + ".inkgd_compiler.cfg"
const INK_CONFIG = ROOT_DIR + ".inkgd_ink.cfg"
const COMPILER_CONFIG_FORMAT_VERSION = 2
const INK_CONFIG_FORMAT_VERSION = 2
const FORMAT_SECTION = "format"
const VERSION = "version"
const INKGD_SECTION = "inkgd"
const USE_MONO = "use_mono"
const MONO_PATH = "mono_path"
const INKLECATE_PATH = "inklecate_path"
const COMPILATION_MODE = "compilation_mode"
const STORIES = "stories"
const SOURCE_FILE_PATH = "source_file_path"
const TARGET_FILE_PATH = "target_file_path"
const WATCHED_FOLDER_PATH = "watched_folder_path"
const DEFAULT_STORIES = [
{
SOURCE_FILE_PATH: "",
TARGET_FILE_PATH: "",
WATCHED_FOLDER_PATH: ""
}
]
# ############################################################################ #
# Signals
# ############################################################################ #
signal story_configuration_changed()
signal compilation_mode_changed(compilation_mode)
# ############################################################################ #
# Properties
# ############################################################################ #
var use_mono: bool = false
var mono_path: String = ""
var inklecate_path: String = ""
var compilation_mode: int = BuildMode.MANUAL: set = set_compilation_mode
func set_compilation_mode(new_value: int):
compilation_mode = new_value
emit_signal("compilation_mode_changed", compilation_mode)
var stories: Array = DEFAULT_STORIES
# ############################################################################ #
# Private Properties
# ############################################################################ #
var _compiler_config_file = ConfigFile.new()
var _ink_config_file = ConfigFile.new()
# ############################################################################ #
# Overrides
# ############################################################################ #
func _init():
pass
# ############################################################################ #
# Public Methods
# ############################################################################ #
## Loads the content of the configuration files from disk.
func retrieve():
_retrieve_inklecate()
_retrieve_ink()
## Stores the content of the configuration to the disk.
func persist():
_persist_inklecate()
_persist_ink()
func append_new_story_configuration(
source_file_path: String,
target_file_path: String,
wacthed_folder_path: String
):
stories.append({
SOURCE_FILE_PATH: source_file_path,
TARGET_FILE_PATH: target_file_path,
WATCHED_FOLDER_PATH: wacthed_folder_path
})
emit_signal("story_configuration_changed")
func remove_story_configuration_at_index(index: int):
if index >= 0 && index < stories.size():
stories.remove_at(index)
emit_signal("story_configuration_changed")
func get_story_configuration_at_index(index):
if index >= 0 && index < stories.size():
return stories[index]
else:
return null
func get_source_file_path(story_configuration):
return story_configuration[SOURCE_FILE_PATH]
func get_target_file_path(story_configuration):
return story_configuration[TARGET_FILE_PATH]
func get_watched_folder_path(story_configuration):
return story_configuration[WATCHED_FOLDER_PATH]
# ############################################################################ #
# Private Methods
# ############################################################################ #
## Loads the content of the inklecate configuration file from disk.
func _retrieve_inklecate():
var err = _compiler_config_file.load(COMPILER_CONFIG)
if err != OK:
# Assuming it doesn't exist.
return
use_mono = _compiler_config_file.get_value(INKGD_SECTION, USE_MONO, false)
mono_path = _compiler_config_file.get_value(INKGD_SECTION, MONO_PATH, "")
inklecate_path = _compiler_config_file.get_value(INKGD_SECTION, INKLECATE_PATH, "")
if _compiler_config_file.get_value(FORMAT_SECTION, VERSION, 0) >= 2:
compilation_mode = _compiler_config_file.get_value(INKGD_SECTION, COMPILATION_MODE, 0)
## Loads the content of the story configuration file from disk.
func _retrieve_ink():
var err = _ink_config_file.load(INK_CONFIG)
if err != OK:
# Assuming it doesn't exist.
return
if _ink_config_file.get_value(FORMAT_SECTION, VERSION, 0) >= 2:
stories = _ink_config_file.get_value(INKGD_SECTION, STORIES, DEFAULT_STORIES)
else:
var source_file_path = _ink_config_file.get_value(INKGD_SECTION, SOURCE_FILE_PATH, "")
var target_file_path = _ink_config_file.get_value(INKGD_SECTION, TARGET_FILE_PATH, "")
var watched_folder_path = _ink_config_file.get_value(INKGD_SECTION, WATCHED_FOLDER_PATH, "")
stories[0] = {
SOURCE_FILE_PATH: source_file_path,
TARGET_FILE_PATH: target_file_path,
WATCHED_FOLDER_PATH: watched_folder_path
}
## Stores the content of the inklecate configuration to the disk.
func _persist_inklecate():
_compiler_config_file.set_value(FORMAT_SECTION, VERSION, COMPILER_CONFIG_FORMAT_VERSION)
_compiler_config_file.set_value(INKGD_SECTION, USE_MONO, use_mono)
_compiler_config_file.set_value(INKGD_SECTION, MONO_PATH, mono_path)
_compiler_config_file.set_value(INKGD_SECTION, INKLECATE_PATH, inklecate_path)
_compiler_config_file.set_value(INKGD_SECTION, COMPILATION_MODE, compilation_mode)
var err = _compiler_config_file.save(COMPILER_CONFIG)
if err != OK:
printerr("[inkgd] [ERROR] Could not save: %s" % COMPILER_CONFIG)
## Stores the content of the story configuration to the disk.
func _persist_ink():
# Clean up the file if it was created before version 2.
if _ink_config_file.has_section_key(INKGD_SECTION, SOURCE_FILE_PATH):
_ink_config_file.erase_section_key(INKGD_SECTION, SOURCE_FILE_PATH)
if _ink_config_file.has_section_key(INKGD_SECTION, TARGET_FILE_PATH):
_ink_config_file.erase_section_key(INKGD_SECTION, TARGET_FILE_PATH)
# Write version 2 values.
_ink_config_file.set_value(FORMAT_SECTION, VERSION, COMPILER_CONFIG_FORMAT_VERSION)
_ink_config_file.set_value(INKGD_SECTION, STORIES, stories)
var err = _ink_config_file.save(INK_CONFIG)
if err != OK:
printerr("[inkgd] [ERROR] Could not save: %s" % INK_CONFIG)