136 lines
4.6 KiB
GDScript
136 lines
4.6 KiB
GDScript
# Remap UI LineEdit for LocalizationEditor : MIT License
|
|
# @author Vladimir Petrenko
|
|
# Drag and drop not work just now, see Workaround -> LocalizationRemapPut
|
|
# https://github.com/godotengine/godot/issues/30480
|
|
@tool
|
|
extends LineEdit
|
|
|
|
var _key
|
|
var _remap
|
|
var _data: LocalizationData
|
|
|
|
var _remap_ui_style_empty: StyleBoxFlat
|
|
var _remap_ui_style_resource: StyleBoxFlat
|
|
var _remap_ui_style_resource_diff: StyleBoxFlat
|
|
var _remap_ui_style_resource_double: StyleBoxFlat
|
|
|
|
const LocalizationRemapDialogFile = preload("res://addons/localization_editor/scenes/remaps/LocalizationRemapDialogFile.tscn")
|
|
|
|
func set_data(key, remap, data: LocalizationData) -> void:
|
|
_key = key
|
|
_remap = remap
|
|
_data = data
|
|
_init_styles()
|
|
_init_connections()
|
|
_draw_view()
|
|
|
|
func _init_styles() -> void:
|
|
var style_box = get_theme_stylebox("normal", "LineEdit")
|
|
_remap_ui_style_empty = style_box.duplicate()
|
|
_remap_ui_style_empty.set_bg_color(Color("#661c1c"))
|
|
_remap_ui_style_resource = style_box.duplicate()
|
|
_remap_ui_style_resource.set_bg_color(Color("#192e59"))
|
|
_remap_ui_style_resource_diff = style_box.duplicate()
|
|
_remap_ui_style_resource_diff.set_bg_color(Color("#514200"))
|
|
_remap_ui_style_resource_double = style_box.duplicate()
|
|
_remap_ui_style_resource_double.set_bg_color(Color("#174044"))
|
|
|
|
func _init_connections() -> void:
|
|
if not _data.is_connected("data_remapkey_value_changed", _draw_view):
|
|
assert(_data.data_remapkey_value_changed.connect(_draw_view) == OK)
|
|
if not is_connected("focus_entered", _on_focus_entered):
|
|
assert(focus_entered.connect(_on_focus_entered) == OK)
|
|
if not is_connected("focus_exited", _on_focus_exited):
|
|
assert(focus_exited.connect(_on_focus_exited) == OK)
|
|
if not is_connected("text_changed", _remap_value_changed):
|
|
assert(text_changed.connect(_remap_value_changed) == OK)
|
|
if not is_connected("gui_input", _on_gui_input):
|
|
assert(gui_input.connect(_on_gui_input) == OK)
|
|
|
|
func _draw_view() -> void:
|
|
if has_focus():
|
|
text = _remap.value
|
|
else:
|
|
text = _data.filename(_remap.value)
|
|
_check_remap_ui()
|
|
|
|
func _input(event) -> void:
|
|
if (event is InputEventMouseButton) and event.pressed:
|
|
if not get_global_rect().has_point(event.position):
|
|
release_focus()
|
|
|
|
func _on_focus_entered() -> void:
|
|
text = _remap.value
|
|
|
|
func _on_focus_exited() -> void:
|
|
text = _data.filename(_remap.value)
|
|
|
|
func _remap_value_changed(remap_value) -> void:
|
|
_data.remapkey_value_change(_remap, remap_value)
|
|
|
|
func _on_gui_input(event: InputEvent) -> void:
|
|
if event is InputEventMouseButton:
|
|
if event.button_index == MOUSE_BUTTON_MIDDLE:
|
|
if event.pressed:
|
|
grab_focus()
|
|
var file_dialog = LocalizationRemapDialogFile.instantiate()
|
|
if _resource_exists():
|
|
file_dialog.current_dir = _data.file_path(_remap.value)
|
|
file_dialog.current_file = _data.filename(_remap.value)
|
|
for extension in _data.supported_file_extensions():
|
|
file_dialog.add_filter("*." + extension)
|
|
var root = get_tree().get_root()
|
|
root.add_child(file_dialog)
|
|
file_dialog.connect("file_selected", _remap_value_changed)
|
|
file_dialog.popup_centered()
|
|
|
|
func _can_drop_data(position, data) -> bool:
|
|
var remap_value = data["files"][0]
|
|
var remap_extension = _data.file_extension(remap_value)
|
|
for extension in _data.supported_file_extensions():
|
|
if remap_extension == extension:
|
|
return true
|
|
return false
|
|
|
|
func _drop_data(position, data) -> void:
|
|
var remap_value = data["files"][0]
|
|
_remap_value_changed(remap_value)
|
|
|
|
func _check_remap_ui() -> void:
|
|
if text.length() <= 0:
|
|
set("custom_styles/normal", _remap_ui_style_empty)
|
|
tooltip_text = "Please set remap resource"
|
|
elif not _resource_exists():
|
|
set("custom_styles/normal", _remap_ui_style_resource)
|
|
tooltip_text = "Your resource path: \"" + _remap.value + "\" does not exists"
|
|
elif _resource_different_type():
|
|
set("custom_styles/normal", _remap_ui_style_resource_diff)
|
|
tooltip_text = "Your remaps have different types"
|
|
elif _resource_double():
|
|
set("custom_styles/normal", _remap_ui_style_resource_double)
|
|
tooltip_text = "Your have double resources in your remaps"
|
|
else:
|
|
set("custom_styles/normal", null)
|
|
tooltip_text = ""
|
|
|
|
func _resource_exists() -> bool:
|
|
if _data.remap_type(_remap) == "undefined":
|
|
return false
|
|
return FileAccess.file_exists(_remap.value)
|
|
|
|
func _resource_different_type() -> bool:
|
|
var type = _data.remap_type(_remap)
|
|
for remap in _key.remaps:
|
|
if remap.value.length() > 0 and type != _data.remap_type(remap):
|
|
return true
|
|
return false
|
|
|
|
func _resource_double() -> bool:
|
|
var first
|
|
for remap in _key.remaps:
|
|
if first == null:
|
|
first = remap
|
|
continue
|
|
if remap.value.length() > 0 and first.value == remap.value:
|
|
return true
|
|
return false
|