|
@@ -7,6 +7,7 @@ extends Control
|
|
var path: String
|
|
var path: String
|
|
var _config_path: String
|
|
var _config_path: String
|
|
var _config := ConfigFile.new()
|
|
var _config := ConfigFile.new()
|
|
|
|
+var _task: Thread
|
|
|
|
|
|
const _config_section := 'CONFIG'
|
|
const _config_section := 'CONFIG'
|
|
|
|
|
|
@@ -14,26 +15,93 @@ func _enter_tree() -> void:
|
|
_config_path = path.path_join('config-importer.ini')
|
|
_config_path = path.path_join('config-importer.ini')
|
|
_config.load(_config_path)
|
|
_config.load(_config_path)
|
|
$config_path.text = _config.get_value(_config_section, 'config_path', '')
|
|
$config_path.text = _config.get_value(_config_section, 'config_path', '')
|
|
|
|
+ $output_path.text = _config.get_value(_config_section, 'output_path', '')
|
|
|
|
+ $generate_field_info.button_pressed = _config.get_value(_config_section, 'generate_field_info', true)
|
|
|
|
|
|
func _exit_tree() -> void:
|
|
func _exit_tree() -> void:
|
|
_config_save()
|
|
_config_save()
|
|
|
|
|
|
func _config_save() -> void:
|
|
func _config_save() -> void:
|
|
_config.set_value(_config_section, 'config_path', $config_path.text)
|
|
_config.set_value(_config_section, 'config_path', $config_path.text)
|
|
|
|
+ _config.set_value(_config_section, 'output_path', $output_path.text)
|
|
|
|
+ _config.set_value(_config_section, 'generate_field_info', $generate_field_info.button_pressed)
|
|
_config.save(_config_path)
|
|
_config.save(_config_path)
|
|
|
|
|
|
-func _on_import_perform_button_down() -> void:
|
|
|
|
- var dir_access := DirAccess.open($config_path.text)
|
|
|
|
- for config_type in dir_access.get_directories():
|
|
|
|
- var config_type_dir: String = $config_path.text.path_join(config_type)
|
|
|
|
- var config_dir_access := DirAccess.open(config_type_dir)
|
|
|
|
- for config_file in config_dir_access.get_files():
|
|
|
|
- if config_file.get_extension() != 'csv':
|
|
|
|
|
|
+func _process(delta) -> void:
|
|
|
|
+ if _task == null || !_task.is_alive():
|
|
|
|
+ if _task != null && !_task.is_alive():
|
|
|
|
+ _task.wait_to_finish()
|
|
|
|
+ _task = null
|
|
|
|
+ scale = Vector2.ONE
|
|
|
|
+
|
|
|
|
+func _setup_task(task:Callable) -> void:
|
|
|
|
+ scale = Vector2.ZERO
|
|
|
|
+ _task = Thread.new()
|
|
|
|
+ _task.start(task)
|
|
|
|
+
|
|
|
|
+class ConfigField:
|
|
|
|
+ var column_id: int
|
|
|
|
+ var name: String
|
|
|
|
+ var comment: String
|
|
|
|
+ var default_record: String
|
|
|
|
+
|
|
|
|
+ static func parse(file_access:FileAccess):
|
|
|
|
+ var fields := []
|
|
|
|
+ var names := file_access.get_csv_line()
|
|
|
|
+ var comments := file_access.get_csv_line()
|
|
|
|
+ var infos := file_access.get_csv_line()
|
|
|
|
+ for i in range(0, len(names)):
|
|
|
|
+ if (names[i].is_empty()):
|
|
continue
|
|
continue
|
|
- var file_access := FileAccess.open(config_type_dir.path_join(config_file), FileAccess.READ)
|
|
|
|
- while !file_access.eof_reached():
|
|
|
|
- var line := file_access.get_csv_line()
|
|
|
|
- print(line)
|
|
|
|
|
|
+ var field := ConfigField.new()
|
|
|
|
+ field.column_id = i
|
|
|
|
+ field.name = names[i]
|
|
|
|
+ field.comment = comments[i]
|
|
|
|
+ fields.push_back(field)
|
|
|
|
+ return fields
|
|
|
|
+
|
|
|
|
+ static func pick(fields, id):
|
|
|
|
+ for field in fields:
|
|
|
|
+ if field.name == id:
|
|
|
|
+ return field
|
|
|
|
+ return null
|
|
|
|
+
|
|
|
|
+func _on_import_perform_button_down() -> void:
|
|
|
|
+ var full_output_path := ProjectSettings.globalize_path($output_path.text)
|
|
|
|
+ OS.move_to_trash(full_output_path)
|
|
|
|
+ DirAccess.make_dir_absolute(full_output_path)
|
|
|
|
+ _setup_task(func():
|
|
|
|
+ var dir_access := DirAccess.open($config_path.text)
|
|
|
|
+ for config_type in dir_access.get_directories():
|
|
|
|
+ var config_type_dir: String = $config_path.text.path_join(config_type)
|
|
|
|
+ var config_dir_access := DirAccess.open(config_type_dir)
|
|
|
|
+ var ini := FileAccess.open($output_path.text.path_join(config_type) + '.ini', FileAccess.WRITE)
|
|
|
|
+ for config_file in config_dir_access.get_files():
|
|
|
|
+ if config_file.get_extension() != 'csv':
|
|
|
|
+ continue
|
|
|
|
+ var file_access := FileAccess.open(config_type_dir.path_join(config_file), FileAccess.READ)
|
|
|
|
+ var fields = ConfigField.parse(file_access)
|
|
|
|
+ var id_field = ConfigField.pick(fields, 'Id')
|
|
|
|
+ var id_name_field = ConfigField.pick(fields, 'IdName')
|
|
|
|
+ fields.erase(id_field)
|
|
|
|
+ fields.erase(id_name_field)
|
|
|
|
+ ini.store_line('; --------------- {0} ---------------'.format([config_file.get_basename()]))
|
|
|
|
+ if $generate_field_info.button_pressed:
|
|
|
|
+ ini.store_line('; {0} data fields:'.format([config_file.get_basename()]))
|
|
|
|
+ for field in fields:
|
|
|
|
+ ini.store_line('; {0}={1} ; {2}'.format([field.name, field.default_record, field.comment]))
|
|
|
|
+ ini.store_line('')
|
|
|
|
+ while !file_access.eof_reached():
|
|
|
|
+ var line := file_access.get_csv_line()
|
|
|
|
+ ini.store_line('[{0}]'.format([line[id_field.column_id]]))
|
|
|
|
+ for field in fields:
|
|
|
|
+ var i:int = field.column_id
|
|
|
|
+ var is_use_default := line[i].is_empty()
|
|
|
|
+ if is_use_default:
|
|
|
|
+ continue
|
|
|
|
+ ini.store_line('{0}={1}'.format([field.name, line[field.column_id]]))
|
|
|
|
+ ini.store_line('')
|
|
|
|
+ )
|
|
"
|
|
"
|
|
|
|
|
|
[node name="配置" type="VBoxContainer"]
|
|
[node name="配置" type="VBoxContainer"]
|
|
@@ -48,6 +116,14 @@ script = SubResource("GDScript_d7xax")
|
|
layout_mode = 2
|
|
layout_mode = 2
|
|
placeholder_text = "配置路径"
|
|
placeholder_text = "配置路径"
|
|
|
|
|
|
|
|
+[node name="output_path" type="LineEdit" parent="."]
|
|
|
|
+layout_mode = 2
|
|
|
|
+placeholder_text = "生成路径"
|
|
|
|
+
|
|
|
|
+[node name="generate_field_info" type="CheckBox" parent="."]
|
|
|
|
+layout_mode = 2
|
|
|
|
+text = "生成所有字段注释"
|
|
|
|
+
|
|
[node name="import_perform" type="Button" parent="."]
|
|
[node name="import_perform" type="Button" parent="."]
|
|
layout_mode = 2
|
|
layout_mode = 2
|
|
text = "读取表格生成配置"
|
|
text = "读取表格生成配置"
|