HighNoonRoulette/addons/localization_editor/scenes/translations/LocalizationTranslations.gd
2025-08-28 01:55:38 +02:00

78 lines
2.5 KiB
GDScript

# Translations UI for LocalizationEditor : MIT License
# @author Vladimir Petrenko
@tool
extends Panel
var _data: LocalizationData
@onready var _translations_ui = $Scroll/Translations
const LocalizationTranslationsList = preload("res://addons/localization_editor/scenes/translations/LocalizationTranslationsList.tscn")
func set_data(data: LocalizationData) -> void:
_data = data
_init_connections()
_update_view()
func _init_connections() -> void:
if not _data.is_connected("data_changed", _update_view):
assert(_data.data_changed.connect(_update_view) == OK)
func _update_view() -> void:
_clear_ui_translations()
_add_ui_translations()
_view_ui_translations()
_update_ui_translations()
func _clear_ui_translations() -> void:
var translations_ui = _translations_ui.get_children()
for translation_ui in translations_ui:
if translation_ui.has_method("get_locale"):
var locale = translation_ui.get_locale()
if _data.find_locale(locale) == null:
translations_ui.erase(translation_ui)
translation_ui.queue_free()
func _add_ui_translations() -> void:
var locales = _data.locales()
for locale in locales:
if not _ui_translation_exists(locale):
_add_ui_translation(locale)
func _ui_translation_exists(locale) -> bool:
for translation_ui in _translations_ui.get_children():
if translation_ui.has_method("get_locale"):
if translation_ui.get_locale() == locale:
return true
return false
func _add_ui_translation(locale: String) -> void:
var ui_translation = LocalizationTranslationsList.instantiate()
_translations_ui.add_child(ui_translation)
ui_translation.set_data(locale, _data)
func _view_ui_translations() -> void:
for translation_ui in _translations_ui.get_children():
if translation_ui.has_method("get_locale"):
var locale = translation_ui.get_locale()
var serarator_ui = _separator_after_translation_ui(translation_ui)
if _data.is_locale_visible(locale):
translation_ui.show()
if serarator_ui != null:
serarator_ui.show()
else:
translation_ui.hide()
if serarator_ui != null:
serarator_ui.hide()
func _separator_after_translation_ui(translation_ui: Node) -> Node:
var index = translation_ui.get_index()
var count = _translations_ui.get_child_count()
if index + 1 < count:
return _translations_ui.get_child(index + 1)
return null
func _update_ui_translations() -> void:
for translation_ui in _translations_ui.get_children():
if translation_ui.has_method("update_view"):
translation_ui.update_view()