Initial Android commit

This commit is contained in:
OleSTEEP 2024-11-10 03:34:28 +03:00
commit 1e2b80c13d
8521 changed files with 231475 additions and 0 deletions

View file

@ -0,0 +1,374 @@
tool
extends Control
var editor_reference
onready var master_tree = get_node("../MasterTreeContainer/MasterTree")
var portrait_entry = load("res://addons/dialogic/Editor/CharacterEditor/PortraitEntry.tscn")
onready var nodes = {
"editor":$Split / EditorScroll / Editor,
"name":$Split / EditorScroll / Editor / NameAndColor / NameLineEdit,
"color":$Split / EditorScroll / Editor / NameAndColor / ColorPickerButton,
"display_name_checkbox":$Split / EditorScroll / Editor / DisplayName / CheckBox,
"display_name":$Split / EditorScroll / Editor / DisplayName / LineEdit,
"nickname_checkbox":$Split / EditorScroll / Editor / DisplayNickname / CheckBox,
"nickname":$Split / EditorScroll / Editor / DisplayNickname / LineEdit,
"description":$Split / EditorScroll / Editor / Description / TextEdit,
"theme":$Split / EditorScroll / Editor / Theme / ThemeButton,
"file":$Split / EditorScroll / Editor / FileName / LineEdit,
"mirror_portraits_checkbox":$Split / EditorScroll / Editor / HBoxContainer / MirrorOption / MirrorPortraitsCheckBox,
"scale":$Split / EditorScroll / Editor / HBoxContainer / Scale,
"offset_x":$Split / EditorScroll / Editor / HBoxContainer / OffsetX,
"offset_y":$Split / EditorScroll / Editor / HBoxContainer / OffsetY,
"portrait_search":$Split / EditorScroll / Editor / Portraits / Search,
"portrait_list":$Split / EditorScroll / Editor / PortraitPanel / VBoxContainer / ScrollContainer / VBoxContainer / PortraitList,
"new_portrait_button":$Split / EditorScroll / Editor / PortraitPanel / VBoxContainer / Labels / HBoxContainer / NewPortrait,
"import_from_folder_button":$Split / EditorScroll / Editor / PortraitPanel / VBoxContainer / Labels / HBoxContainer / ImportFromFolder,
"portrait_preview_full":$Split / Preview / Background / FullTextureRect,
"portrait_preview_real":$Split / Preview / Background / Positioner / RealSizedRect,
"image_label":$Split / Preview / Background / TLabel10,
}
var opened_character_data
var selected_theme_file = ""
func _ready():
editor_reference = find_parent("EditorView")
nodes["new_portrait_button"].text = " " + DTS.translate("New portrait")
nodes["import_from_folder_button"].text = " " + DTS.translate("Import folder")
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")
nodes["display_name_checkbox"].connect("toggled", self, "_on_display_name_toggled")
nodes["nickname_checkbox"].connect("toggled", self, "_on_nickname_toggled")
nodes["theme"].connect("about_to_show", self, "build_ThemePickerMenu")
nodes["portrait_search"].connect("text_changed", self, "_on_PortraitSearch_text_changed")
nodes["portrait_search"].right_icon = get_icon("Search", "EditorIcons")
nodes["import_from_folder_button"].connect("pressed", self, "_on_Import_Portrait_Folder_Button_pressed")
nodes["new_portrait_button"].connect("pressed", self, "_on_New_Portrait_Button_pressed")
var style = $Split / EditorScroll.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")
$Split / EditorScroll / Editor / Portraits / Title.set("custom_fonts/font", get_font("doc_title", "EditorFonts"))
$Split / EditorScroll / Editor / PortraitPanel.set("custom_styles/panel", get_stylebox("Background", "EditorStyles"))
_on_PreviewMode_item_selected(DialogicResources.get_settings_value("editor", "character_preview_mode", 1))
$Split / Preview / Background / PreviewMode.select(DialogicResources.get_settings_value("editor", "character_preview_mode", 1))
$Split / Preview / Background / PreviewMode.set_item_text(0, DTS.translate("Full View"))
$Split / Preview / Background / PreviewMode.set_item_text(1, DTS.translate("Actual Size"))
func clear_character_editor():
nodes["file"].text = ""
nodes["name"].text = ""
nodes["color"].color = Color("#ffffff")
nodes["display_name_checkbox"].pressed = false
nodes["display_name"].text = ""
nodes["nickname_checkbox"].pressed = false
nodes["nickname"].text = ""
nodes["description"].text = ""
nodes["theme"].text = "No custom theme"
selected_theme_file = ""
nodes["portrait_search"].text = ""
nodes["portraits"] = []
nodes["scale"].value = 100
nodes["mirror_portraits_checkbox"].pressed = false
nodes["offset_x"].value = 0
nodes["offset_y"].value = 0
for p in nodes["portrait_list"].get_children():
p.queue_free()
nodes["portrait_preview_full"].texture = null
nodes["portrait_preview_real"].texture = null
nodes["portrait_preview_real"].rect_scale = Vector2(1, 1)
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
func generate_character_data_to_save():
var portraits = []
for p in nodes["portrait_list"].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,
"color":"#" + nodes["color"].color.to_html(),
"display_name_bool":nodes["display_name_checkbox"].pressed,
"display_name":nodes["display_name"].text,
"nickname_bool":nodes["nickname_checkbox"].pressed,
"nickname":nodes["nickname"].text,
"description":nodes["description"].text,
"theme":selected_theme_file,
"portraits":portraits,
"scale":nodes["scale"].value,
"mirror_portraits":nodes["mirror_portraits_checkbox"].pressed,
"offset_x":nodes["offset_x"].value,
"offset_y":nodes["offset_y"].value,
}
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["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["nickname_checkbox"].pressed = data.get("nickname_bool", false)
nodes["nickname"].text = data.get("nickname", "")
nodes["description"].text = data.get("description", "")
refresh_themes_and_select(data.get("theme", ""))
nodes["scale"].value = float(data.get("scale", 100))
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_full"].flip_h = data.get("mirror_portraits", false)
nodes["portrait_preview_real"].flip_h = data.get("mirror_portraits", false)
nodes["portrait_preview_real"].rect_scale = Vector2(
float(data.get("scale", 100)) / 100, float(data.get("scale", 100)) / 100)
var default_portrait = create_portrait_entry()
default_portrait.get_node("NameEdit").text = "Default"
default_portrait.get_node("NameEdit").editable = false
if opened_character_data.has("portraits"):
for p in opened_character_data["portraits"]:
var current_item
if p["name"] == "Default":
default_portrait.get_node("PathEdit").text = p["path"]
default_portrait.update_preview(p["path"])
current_item = default_portrait
else :
current_item = create_portrait_entry(p["name"], p["path"])
func _on_PortraitSearch_text_changed(text):
for portrait_item in nodes["portrait_list"].get_children():
if text.empty() or text.to_lower() in portrait_item.get_node("NameEdit").text.to_lower() or text.to_lower() in portrait_item.get_node("PathEdit").text.to_lower():
portrait_item.show()
else :
portrait_item.hide()
func refresh_themes_and_select(file):
selected_theme_file = file
if file == "" or file == "No custom theme":
nodes["theme"].text = "No custom theme"
nodes["theme"].custom_icon = get_icon("GuiRadioUnchecked", "EditorIcons")
else :
nodes["theme"].text = DialogicUtil.get_theme_dict()[file]["name"]
nodes["theme"].custom_icon = editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").theme_icon
func build_ThemePickerMenu():
nodes["theme"].get_popup().clear()
var folder_structure = DialogicUtil.get_theme_folder_structure()
build_PickerMenuFolder(nodes["theme"].get_popup(), folder_structure, "MenuButton")
func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String):
var index = 0
if menu == nodes["theme"].get_popup():
menu.add_item("No custom theme")
menu.set_item_icon(index, get_icon("GuiRadioUnchecked", "EditorIcons"))
menu.set_item_metadata(index, {"file":""})
index += 1
for folder_name in folder_structure["folders"].keys():
var submenu = PopupMenu.new()
var submenu_name = build_PickerMenuFolder(submenu, folder_structure["folders"][folder_name], folder_name)
submenu.name = submenu_name
menu.add_submenu_item(folder_name, submenu_name)
menu.set_item_icon(index, get_icon("Folder", "EditorIcons"))
menu.add_child(submenu)
index += 1
nodes["theme"].update_submenu_style(submenu)
var files_info = DialogicUtil.get_theme_dict()
for file in folder_structure["files"]:
menu.add_item(files_info[file]["name"])
menu.set_item_icon(index, editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").theme_icon)
menu.set_item_metadata(index, {"file":file})
index += 1
if not menu.is_connected("index_pressed", self, "_on_theme_selected"):
menu.connect("index_pressed", self, "_on_theme_selected", [menu])
return current_folder_name
func _on_theme_selected(index, menu):
refresh_themes_and_select(menu.get_item_metadata(index).get("file", ""))
func _on_display_name_toggled(button_pressed):
nodes["display_name"].visible = button_pressed
if button_pressed:nodes["display_name"].grab_focus()
func _on_nickname_toggled(button_pressed):
nodes["nickname"].visible = button_pressed
if button_pressed:nodes["nickname"].grab_focus()
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 _on_New_Portrait_Button_pressed():
create_portrait_entry("", "", true)
func create_portrait_entry(p_name = "", path = "", grab_focus = false):
if grab_focus and nodes["portrait_list"].get_child_count() == 1 and nodes["portrait_list"].get_child(0).get_node("PathEdit").text == "":
nodes["portrait_list"].get_child(0)._on_ButtonSelect_pressed()
return
var p = portrait_entry.instance()
p.editor_reference = editor_reference
p.image_node = nodes["portrait_preview_full"]
p.image_node2 = nodes["portrait_preview_real"]
p.image_label = nodes["image_label"]
var p_list = nodes["portrait_list"]
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 or ".webp" 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_full"].flip_h = button_pressed
nodes["portrait_preview_real"].flip_h = button_pressed
func _on_Scale_value_changed(value):
nodes["portrait_preview_real"].rect_size = Vector2()
nodes["portrait_preview_real"].rect_scale = Vector2(
float(value) / 100, float(value) / 100)
func _on_PreviewMode_item_selected(index):
if index == 0:
nodes["portrait_preview_real"].hide()
nodes["portrait_preview_full"].show()
if index == 1:
nodes["portrait_preview_real"].show()
nodes["portrait_preview_full"].hide()
DialogicResources.set_settings_value("editor", "character_preview_mode", index)

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,55 @@
tool
extends HBoxContainer
var editor_reference
var image_node
var image_node2
var image_label
func _ready():
$ButtonDelete.icon = get_icon("Remove", "EditorIcons")
func _on_ButtonDelete_pressed():
if $NameEdit.text == "Default":
$PathEdit.text = ""
update_preview("")
else :
queue_free()
func _on_ButtonSelect_pressed():
editor_reference.godot_dialog("*.png, *.svg, *.tscn, *.webp")
editor_reference.godot_dialog_connect(self, "_on_file_selected")
func _on_file_selected(path, target):
update_preview(path)
$PathEdit.text = path
if $NameEdit.text == "":
$NameEdit.text = DialogicResources.get_filename_from_path(path)
func _on_focus_entered():
if $PathEdit.text == "":
image_label.text = DTS.translate("NoImagePreview")
image_node.texture = null
image_node2.texture = null
else :
update_preview($PathEdit.text)
func update_preview(path):
image_label.text = DTS.translate("Preview of") + " \"" + $NameEdit.text + "\""
var l_path = path.to_lower()
if ".png" in l_path or ".svg" in l_path or ".webp" in l_path:
image_node.texture = load(path)
image_node2.texture = load(path)
image_label.text += " (" + str(image_node.texture.get_width()) + "x" + str(image_node.texture.get_height()) + ")"
elif ".tscn" in l_path:
image_node.texture = null
image_node2.texture = null
image_label.text = DTS.translate("CustomScenePreview")
else :
image_node.texture = null
image_node2.texture = null

View file

@ -0,0 +1,61 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd" type="Script" id=2]
[sub_resource type="Image" id=4]
data = {
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
"format": "LumAlpha8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id=3]
flags = 4
flags = 4
image = SubResource( 4 )
size = Vector2( 16, 16 )
[node name="PortraitEntry" type="HBoxContainer"]
margin_right = 451.0
margin_bottom = 24.0
script = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="NameEdit" type="LineEdit" parent="."]
margin_right = 160.0
margin_bottom = 24.0
rect_min_size = Vector2( 160, 0 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="PathEdit" type="LineEdit" parent="."]
margin_left = 164.0
margin_right = 391.0
margin_bottom = 24.0
rect_min_size = Vector2( 150, 0 )
size_flags_horizontal = 3
editable = false
selecting_enabled = false
[node name="ButtonSelect" type="Button" parent="."]
margin_left = 395.0
margin_right = 419.0
margin_bottom = 24.0
text = "..."
[node name="ButtonDelete" type="Button" parent="."]
margin_left = 423.0
margin_right = 451.0
margin_bottom = 24.0
icon = SubResource( 3 )
flat = true
[connection signal="focus_entered" from="NameEdit" to="." method="_on_focus_entered"]
[connection signal="focus_entered" from="PathEdit" to="." method="_on_focus_entered"]
[connection signal="pressed" from="ButtonSelect" to="." method="_on_ButtonSelect_pressed"]
[connection signal="pressed" from="ButtonDelete" to="." method="_on_ButtonDelete_pressed"]