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

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