You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
8.2 KiB
228 lines
8.2 KiB
tool |
|
extends ScrollContainer |
|
|
|
var editor_reference |
|
onready var master_tree = get_node('../MasterTreeContainer/MasterTree') |
|
var opened_character_data |
|
var portrait_entry = load("res://addons/dialogic/Editor/CharacterEditor/PortraitEntry.tscn") |
|
onready var nodes = { |
|
'editor': $HBoxContainer/Container, |
|
'name': $HBoxContainer/Container/Name/LineEdit, |
|
'description': $HBoxContainer/Container/Description/TextEdit, |
|
'file': $HBoxContainer/Container/FileName/LineEdit, |
|
'color': $HBoxContainer/Container/Color/ColorPickerButton, |
|
'mirror_portraits_checkbox' : $HBoxContainer/VBoxContainer/HBoxContainer/MirrorOption/MirrorPortraitsCheckBox, |
|
'display_name_checkbox': $HBoxContainer/Container/Name/CheckBox, |
|
'display_name': $HBoxContainer/Container/DisplayName/LineEdit, |
|
'nickname_checkbox': $HBoxContainer/Container/Name/CheckBox2, |
|
'nickname': $HBoxContainer/Container/DisplayNickname/LineEdit, |
|
'new_portrait_button': $HBoxContainer/Container/ScrollContainer/VBoxContainer/HBoxContainer/Button, |
|
'import_from_folder_button': $HBoxContainer/Container/ScrollContainer/VBoxContainer/HBoxContainer/ImportFromFolder, |
|
'portrait_preview': $HBoxContainer/VBoxContainer/Control/TextureRect, |
|
'image_label': $"HBoxContainer/VBoxContainer/Control/TLabel10", |
|
'scale': $HBoxContainer/VBoxContainer/HBoxContainer/Scale, |
|
'offset_x': $HBoxContainer/VBoxContainer/HBoxContainer/OffsetX, |
|
'offset_y': $HBoxContainer/VBoxContainer/HBoxContainer/OffsetY, |
|
} |
|
|
|
|
|
func _ready(): |
|
$"HBoxContainer/Container/ScrollContainer/VBoxContainer/HBoxContainer/Button".text = DTS.translate(" Add new portrait") |
|
$"HBoxContainer/Container/ScrollContainer/VBoxContainer/HBoxContainer/ImportFromFolder".text = DTS.translate(" Import images from folder") |
|
|
|
editor_reference = find_parent('EditorView') |
|
nodes['new_portrait_button'].connect('pressed', self, '_on_New_Portrait_Button_pressed') |
|
nodes['import_from_folder_button'].connect('pressed', self, '_on_Import_Portrait_Folder_Button_pressed') |
|
nodes['display_name_checkbox'].connect('toggled', self, '_on_display_name_toggled') |
|
nodes['nickname_checkbox'].connect('toggled', self, '_on_nickname_toggled') |
|
nodes['name'].connect('text_changed', self, '_on_name_changed') |
|
nodes['name'].connect('focus_exited', self, '_update_name_on_tree') |
|
nodes['color'].connect('color_changed', self, '_on_color_changed') |
|
var style = get('custom_styles/bg') |
|
style.set('bg_color', get_color("base_color", "Editor")) |
|
nodes['new_portrait_button'].icon = get_icon("Add", "EditorIcons") |
|
nodes['import_from_folder_button'].icon = get_icon("Folder", "EditorIcons") |
|
|
|
|
|
func _on_display_name_toggled(button_pressed): |
|
$HBoxContainer/Container/DisplayName.visible = button_pressed |
|
|
|
|
|
func _on_nickname_toggled(button_pressed): |
|
$HBoxContainer/Container/DisplayNickname.visible = button_pressed |
|
|
|
|
|
func is_selected(file: String): |
|
return nodes['file'].text == file |
|
|
|
|
|
func _on_name_changed(value): |
|
save_character() |
|
|
|
|
|
func _update_name_on_tree(): |
|
var item = master_tree.get_selected() |
|
item.set_text(0, nodes['name'].text) |
|
master_tree.build_characters(nodes['file'].text) |
|
|
|
|
|
func _input(event): |
|
if event is InputEventKey and event.pressed: |
|
if nodes['name'].has_focus(): |
|
if event.scancode == KEY_ENTER: |
|
nodes['name'].release_focus() |
|
|
|
|
|
func _on_color_changed(color): |
|
var item = master_tree.get_selected() |
|
item.set_icon_modulate(0, color) |
|
|
|
|
|
func clear_character_editor(): |
|
nodes['file'].text = '' |
|
nodes['name'].text = '' |
|
nodes['description'].text = '' |
|
nodes['color'].color = Color('#ffffff') |
|
nodes['mirror_portraits_checkbox'].pressed = false |
|
nodes['display_name_checkbox'].pressed = false |
|
nodes['nickname_checkbox'].pressed = false |
|
nodes['display_name'].text = '' |
|
nodes['nickname'].text = '' |
|
nodes['portraits'] = [] |
|
nodes['scale'].value = 100 |
|
nodes['offset_x'].value = 0 |
|
nodes['offset_y'].value = 0 |
|
|
|
# Clearing portraits |
|
for p in $HBoxContainer/Container/ScrollContainer/VBoxContainer/PortraitList.get_children(): |
|
p.queue_free() |
|
nodes['portrait_preview'].texture = null |
|
|
|
|
|
# Character Creation |
|
func create_character(): |
|
var character_file = 'character-' + str(OS.get_unix_time()) + '.json' |
|
var character = { |
|
'color': '#ffffff', |
|
'id': character_file, |
|
'portraits': [], |
|
'mirror_portraits' :false |
|
} |
|
DialogicResources.set_character(character) |
|
character['metadata'] = {'file': character_file} |
|
return character |
|
|
|
|
|
# Saving and Loading |
|
func generate_character_data_to_save(): |
|
var portraits = [] |
|
for p in $HBoxContainer/Container/ScrollContainer/VBoxContainer/PortraitList.get_children(): |
|
var entry = {} |
|
entry['name'] = p.get_node("NameEdit").text |
|
entry['path'] = p.get_node("PathEdit").text |
|
portraits.append(entry) |
|
var info_to_save = { |
|
'id': nodes['file'].text, |
|
'description': nodes['description'].text, |
|
'color': '#' + nodes['color'].color.to_html(), |
|
'mirror_portraits': nodes["mirror_portraits_checkbox"].pressed, |
|
'portraits': portraits, |
|
'display_name_bool': nodes['display_name_checkbox'].pressed, |
|
'display_name': nodes['display_name'].text, |
|
'nickname_bool': nodes['nickname_checkbox'].pressed, |
|
'nickname': nodes['nickname'].text, |
|
'scale': nodes['scale'].value, |
|
'offset_x': nodes['offset_x'].value, |
|
'offset_y': nodes['offset_y'].value, |
|
} |
|
# Adding name later for cases when no name is provided |
|
if nodes['name'].text != '': |
|
info_to_save['name'] = nodes['name'].text |
|
|
|
return info_to_save |
|
|
|
|
|
func save_character(): |
|
var info_to_save = generate_character_data_to_save() |
|
if info_to_save['id']: |
|
DialogicResources.set_character(info_to_save) |
|
opened_character_data = info_to_save |
|
|
|
|
|
func load_character(filename: String): |
|
clear_character_editor() |
|
var data = DialogicResources.get_character_json(filename) |
|
opened_character_data = data |
|
nodes['file'].text = data['id'] |
|
nodes['name'].text = data.get('name', '') |
|
nodes['description'].text = data.get('description', '') |
|
nodes['color'].color = Color(data.get('color','#ffffffff')) |
|
nodes['display_name_checkbox'].pressed = data.get('display_name_bool', false) |
|
nodes['display_name'].text = data.get('display_name', '') |
|
nodes['scale'].value = float(data.get('scale', 100)) |
|
nodes['nickname_checkbox'].pressed = data.get('nickname_bool', false) |
|
nodes['nickname'].text = data.get('nickname', '') |
|
nodes['offset_x'].value = data.get('offset_x', 0) |
|
nodes['offset_y'].value = data.get('offset_y', 0) |
|
nodes['mirror_portraits_checkbox'].pressed = data.get('mirror_portraits', false) |
|
nodes['portrait_preview'].flip_h = data.get('mirror_portraits', false) |
|
|
|
# Portraits |
|
var default_portrait = create_portrait_entry() |
|
default_portrait.get_node('NameEdit').text = 'Default' |
|
default_portrait.get_node('NameEdit').editable = false |
|
if data.has('portraits'): |
|
for p in data['portraits']: |
|
if p['name'] == 'Default': |
|
default_portrait.get_node('PathEdit').text = p['path'] |
|
default_portrait.update_preview(p['path']) |
|
else: |
|
create_portrait_entry(p['name'], p['path']) |
|
|
|
|
|
# Portraits |
|
func _on_New_Portrait_Button_pressed(): |
|
create_portrait_entry('', '', true) |
|
|
|
|
|
func create_portrait_entry(p_name = '', path = '', grab_focus = false): |
|
var p = portrait_entry.instance() |
|
p.editor_reference = editor_reference |
|
p.image_node = nodes['portrait_preview'] |
|
p.image_label = nodes['image_label'] |
|
var p_list = $HBoxContainer/Container/ScrollContainer/VBoxContainer/PortraitList |
|
p_list.add_child(p) |
|
if p_name != '': |
|
p.get_node("NameEdit").text = p_name |
|
if path != '': |
|
p.get_node("PathEdit").text = path |
|
if grab_focus: |
|
p.get_node("NameEdit").grab_focus() |
|
p._on_ButtonSelect_pressed() |
|
return p |
|
|
|
|
|
func _on_Import_Portrait_Folder_Button_pressed(): |
|
editor_reference.godot_dialog("*", EditorFileDialog.MODE_OPEN_DIR) |
|
editor_reference.godot_dialog_connect(self, "_on_dir_selected", "dir_selected") |
|
|
|
|
|
func _on_dir_selected(path, target): |
|
var dir = Directory.new() |
|
if dir.open(path) == OK: |
|
dir.list_dir_begin() |
|
var file_name = dir.get_next() |
|
while file_name != "": |
|
if not dir.current_is_dir(): |
|
var file_lower = file_name.to_lower() |
|
if '.svg' in file_lower or '.png' in file_lower: |
|
if not '.import' in file_lower: |
|
var final_name = path+ "/" + file_name |
|
create_portrait_entry(DialogicResources.get_filename_from_path(file_name), final_name) |
|
file_name = dir.get_next() |
|
else: |
|
print("An error occurred when trying to access the path.") |
|
|
|
|
|
func _on_MirrorPortraitsCheckBox_toggled(button_pressed): |
|
nodes['portrait_preview'].flip_h = button_pressed
|
|
|