Envoi sur GitHub du projet updated

This commit is contained in:
Maurane
2026-01-07 12:47:48 +01:00
parent 34e887afd2
commit 3f1863f0c1
434 changed files with 16021 additions and 5685 deletions
@@ -0,0 +1,241 @@
@tool
extends Control
signal result_selected(path: String, cursor: Vector2, length: int)
const DialogueConstants = preload("../constants.gd")
var main_view: Control
@onready var input: LineEdit = %Input
@onready var search_button: Button = %SearchButton
@onready var match_case_button: CheckBox = %MatchCaseButton
@onready var replace_toggle: CheckButton = %ReplaceToggle
@onready var replace_container: VBoxContainer = %ReplaceContainer
@onready var replace_input: LineEdit = %ReplaceInput
@onready var replace_selected_button: Button = %ReplaceSelectedButton
@onready var replace_all_button: Button = %ReplaceAllButton
@onready var results_container: VBoxContainer = %ResultsContainer
@onready var result_template: HBoxContainer = %ResultTemplate
var current_results: Dictionary = {}:
set(value):
current_results = value
update_results_view()
if current_results.size() == 0:
replace_selected_button.disabled = true
replace_all_button.disabled = true
else:
replace_selected_button.disabled = false
replace_all_button.disabled = false
get:
return current_results
var selections: PackedStringArray = []
func _ready() -> void:
remove_child(result_template)
func _exit_tree() -> void:
result_template.queue_free()
func prepare() -> void:
if not is_node_ready():
await ready
input.grab_focus()
var template_label = result_template.get_node("Label")
template_label.get_theme_stylebox(&"focus").bg_color = main_view.code_edit.theme_overrides.current_line_color
template_label.add_theme_font_override(&"normal_font", main_view.code_edit.get_theme_font(&"font"))
replace_toggle.set_pressed_no_signal(false)
replace_container.hide()
$VBoxContainer/HBoxContainer/FindContainer/Label.text = DialogueConstants.translate(&"search.find")
input.placeholder_text = DialogueConstants.translate(&"search.placeholder")
input.text = ""
search_button.text = DialogueConstants.translate(&"search.find_all")
match_case_button.text = DialogueConstants.translate(&"search.match_case")
replace_toggle.text = DialogueConstants.translate(&"search.toggle_replace")
$VBoxContainer/HBoxContainer/ReplaceContainer/ReplaceLabel.text = DialogueConstants.translate(&"search.replace_with")
replace_input.placeholder_text = DialogueConstants.translate(&"search.replace_placeholder")
replace_input.text = ""
replace_all_button.text = DialogueConstants.translate(&"search.replace_all")
replace_selected_button.text = DialogueConstants.translate(&"search.replace_selected")
selections.clear()
current_results = {}
#region helpers
func update_results_view() -> void:
for child in results_container.get_children():
child.queue_free()
for path in current_results.keys():
var path_label: Label = Label.new()
path_label.text = path
# Show open files
if main_view.open_buffers.has(path):
path_label.text += "(*)"
results_container.add_child(path_label)
for path_result in current_results.get(path):
var result_item: HBoxContainer = result_template.duplicate()
var checkbox: CheckBox = result_item.get_node("CheckBox") as CheckBox
var key: String = get_selection_key(path, path_result)
checkbox.toggled.connect(func(is_pressed):
if is_pressed:
if not selections.has(key):
selections.append(key)
else:
if selections.has(key):
selections.remove_at(selections.find(key))
)
checkbox.set_pressed_no_signal(selections.has(key))
checkbox.visible = replace_toggle.button_pressed
var result_label: RichTextLabel = result_item.get_node("Label") as RichTextLabel
var colors: Dictionary = main_view.code_edit.theme_overrides
var highlight: String = ""
if replace_toggle.button_pressed:
var matched_word: String = "[bgcolor=" + colors.critical_color.to_html() + "][color=" + colors.text_color.to_html() + "]" + path_result.matched_text + "[/color][/bgcolor]"
highlight = "[s]" + matched_word + "[/s][bgcolor=" + colors.notice_color.to_html() + "][color=" + colors.text_color.to_html() + "]" + replace_input.text + "[/color][/bgcolor]"
else:
highlight = "[bgcolor=" + colors.notice_color.to_html() + "][color=" + colors.text_color.to_html() + "]" + path_result.matched_text + "[/color][/bgcolor]"
var text: String = path_result.text.substr(0, path_result.index) + highlight + path_result.text.substr(path_result.index + path_result.query.length())
result_label.text = "%s: %s" % [str(path_result.line + 1).lpad(4), text]
result_label.gui_input.connect(func(event):
if event is InputEventMouseButton and (event as InputEventMouseButton).button_index == MOUSE_BUTTON_LEFT and (event as InputEventMouseButton).double_click:
result_selected.emit(path, Vector2(path_result.index, path_result.line), path_result.query.length())
)
results_container.add_child(result_item)
func find_in_files() -> Dictionary:
var results: Dictionary = {}
var q: String = input.text
var cache = Engine.get_meta("DMCache")
var file: FileAccess
for path in cache.get_files():
var path_results: Array = []
var lines: PackedStringArray = []
if main_view.open_buffers.has(path):
lines = main_view.open_buffers.get(path).text.split("\n")
else:
file = FileAccess.open(path, FileAccess.READ)
lines = file.get_as_text().split("\n")
for i in range(0, lines.size()):
var index: int = find_in_line(lines[i], q)
while index > -1:
path_results.append({
line = i,
index = index,
text = lines[i],
matched_text = lines[i].substr(index, q.length()),
query = q
})
index = find_in_line(lines[i], q, index + q.length())
if file != null and file.is_open():
file.close()
if path_results.size() > 0:
results[path] = path_results
return results
func get_selection_key(path: String, path_result: Dictionary) -> String:
return "%s-%d-%d" % [path, path_result.line, path_result.index]
func find_in_line(line: String, query: String, from_index: int = 0) -> int:
if match_case_button.button_pressed:
return line.find(query, from_index)
else:
return line.findn(query, from_index)
func replace_results(only_selected: bool) -> void:
var file: FileAccess
var lines: PackedStringArray = []
for path in current_results:
if main_view.open_buffers.has(path):
lines = main_view.open_buffers.get(path).text.split("\n")
else:
file = FileAccess.open(path, FileAccess.READ)
lines = file.get_as_text().split("\n")
# Read the results in reverse because we're going to be modifying them as we go
var path_results: Array = current_results.get(path).duplicate()
path_results.reverse()
for path_result in path_results:
var key: String = get_selection_key(path, path_result)
if not only_selected or (only_selected and selections.has(key)):
lines[path_result.line] = lines[path_result.line].substr(0, path_result.index) + replace_input.text + lines[path_result.line].substr(path_result.index + path_result.matched_text.length())
var replaced_text: String = "\n".join(lines)
if file != null and file.is_open():
file.close()
file = FileAccess.open(path, FileAccess.WRITE)
file.store_string(replaced_text)
file.close()
else:
main_view.open_buffers.get(path).text = replaced_text
if main_view.current_file_path == path:
main_view.code_edit.text = replaced_text
current_results = find_in_files()
#endregion
#region signals
func _on_search_button_pressed() -> void:
selections.clear()
self.current_results = find_in_files()
func _on_input_text_submitted(new_text: String) -> void:
_on_search_button_pressed()
func _on_replace_toggle_toggled(toggled_on: bool) -> void:
replace_container.visible = toggled_on
if toggled_on:
replace_input.grab_focus()
update_results_view()
func _on_replace_input_text_changed(new_text: String) -> void:
update_results_view()
func _on_replace_selected_button_pressed() -> void:
replace_results(true)
func _on_replace_all_button_pressed() -> void:
replace_results(false)
func _on_match_case_button_toggled(toggled_on: bool) -> void:
_on_search_button_pressed()
#endregion
@@ -0,0 +1 @@
uid://q368fmxxa8sd
@@ -0,0 +1,139 @@
[gd_scene load_steps=3 format=3 uid="uid://0n7hwviyyly4"]
[ext_resource type="Script" uid="uid://q368fmxxa8sd" path="res://addons/dialogue_manager/views/find_in_dialogue_view.gd" id="1_3xicy"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_owohg"]
bg_color = Color(0.266667, 0.278431, 0.352941, 0.243137)
corner_detail = 1
[node name="FindInFiles" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1_3xicy")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
[node name="FindContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer/FindContainer"]
layout_mode = 2
text = "Find:"
[node name="Input" type="LineEdit" parent="VBoxContainer/HBoxContainer/FindContainer"]
unique_name_in_owner = true
layout_mode = 2
clear_button_enabled = true
[node name="FindToolbar" type="HBoxContainer" parent="VBoxContainer/HBoxContainer/FindContainer"]
layout_mode = 2
[node name="SearchButton" type="Button" parent="VBoxContainer/HBoxContainer/FindContainer/FindToolbar"]
unique_name_in_owner = true
layout_mode = 2
text = "Find all..."
[node name="MatchCaseButton" type="CheckBox" parent="VBoxContainer/HBoxContainer/FindContainer/FindToolbar"]
unique_name_in_owner = true
layout_mode = 2
text = "Match case"
[node name="Control" type="Control" parent="VBoxContainer/HBoxContainer/FindContainer/FindToolbar"]
layout_mode = 2
size_flags_horizontal = 3
[node name="ReplaceToggle" type="CheckButton" parent="VBoxContainer/HBoxContainer/FindContainer/FindToolbar"]
unique_name_in_owner = true
layout_mode = 2
text = "Replace"
[node name="ReplaceContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
[node name="ReplaceLabel" type="Label" parent="VBoxContainer/HBoxContainer/ReplaceContainer"]
layout_mode = 2
text = "Replace with:"
[node name="ReplaceInput" type="LineEdit" parent="VBoxContainer/HBoxContainer/ReplaceContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
clear_button_enabled = true
[node name="ReplaceToolbar" type="HBoxContainer" parent="VBoxContainer/HBoxContainer/ReplaceContainer"]
layout_mode = 2
[node name="ReplaceSelectedButton" type="Button" parent="VBoxContainer/HBoxContainer/ReplaceContainer/ReplaceToolbar"]
unique_name_in_owner = true
layout_mode = 2
text = "Replace selected"
[node name="ReplaceAllButton" type="Button" parent="VBoxContainer/HBoxContainer/ReplaceContainer/ReplaceToolbar"]
unique_name_in_owner = true
layout_mode = 2
text = "Replace all"
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer"]
layout_mode = 2
[node name="ReplaceToolbar" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"]
layout_mode = 2
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
follow_focus = true
[node name="ResultsContainer" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/separation = 0
[node name="ResultTemplate" type="HBoxContainer" parent="."]
unique_name_in_owner = true
layout_mode = 0
offset_left = 155.0
offset_top = -74.0
offset_right = 838.0
offset_bottom = -51.0
[node name="CheckBox" type="CheckBox" parent="ResultTemplate"]
layout_mode = 2
[node name="Label" type="RichTextLabel" parent="ResultTemplate"]
layout_mode = 2
size_flags_horizontal = 3
focus_mode = 2
theme_override_styles/focus = SubResource("StyleBoxFlat_owohg")
bbcode_enabled = true
text = "Result"
fit_content = true
scroll_active = false
[connection signal="text_submitted" from="VBoxContainer/HBoxContainer/FindContainer/Input" to="." method="_on_input_text_submitted"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/FindContainer/FindToolbar/SearchButton" to="." method="_on_search_button_pressed"]
[connection signal="toggled" from="VBoxContainer/HBoxContainer/FindContainer/FindToolbar/MatchCaseButton" to="." method="_on_match_case_button_toggled"]
[connection signal="toggled" from="VBoxContainer/HBoxContainer/FindContainer/FindToolbar/ReplaceToggle" to="." method="_on_replace_toggle_toggled"]
[connection signal="text_changed" from="VBoxContainer/HBoxContainer/ReplaceContainer/ReplaceInput" to="." method="_on_replace_input_text_changed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ReplaceContainer/ReplaceToolbar/ReplaceSelectedButton" to="." method="_on_replace_selected_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ReplaceContainer/ReplaceToolbar/ReplaceAllButton" to="." method="_on_replace_all_button_pressed"]
+199 -407
View File
@@ -2,11 +2,6 @@
extends Control
const DialogueConstants = preload("../constants.gd")
const DialogueSettings = preload("../settings.gd")
const DialogueResource = preload("../dialogue_resource.gd")
const DialogueManagerParser = preload("../components/parser.gd")
const OPEN_OPEN = 100
const OPEN_QUICK = 101
const OPEN_CLEAR = 102
@@ -33,7 +28,13 @@ enum TranslationSource {
signal confirmation_closed()
@onready var parse_timer := $ParseTimer
@onready var parse_timer: Timer = $ParseTimer
# Banner
@onready var banner: CenterContainer = %Banner
@onready var banner_new_button: Button = %BannerNewButton
@onready var banner_quick_open: Button = %BannerQuickOpen
@onready var banner_examples: Button = %BannerExamples
# Dialogs
@onready var new_dialog: FileDialog = $NewDialog
@@ -44,13 +45,9 @@ signal confirmation_closed()
@onready var export_dialog: FileDialog = $ExportDialog
@onready var import_dialog: FileDialog = $ImportDialog
@onready var errors_dialog: AcceptDialog = $ErrorsDialog
@onready var settings_dialog: AcceptDialog = $SettingsDialog
@onready var settings_view := $SettingsDialog/SettingsView
@onready var build_error_dialog: AcceptDialog = $BuildErrorDialog
@onready var close_confirmation_dialog: ConfirmationDialog = $CloseConfirmationDialog
@onready var updated_dialog: AcceptDialog = $UpdatedDialog
@onready var find_in_files_dialog: AcceptDialog = $FindInFilesDialog
@onready var find_in_files: Control = $FindInFilesDialog/FindInFiles
# Toolbar
@onready var new_button: Button = %NewButton
@@ -58,10 +55,10 @@ signal confirmation_closed()
@onready var save_all_button: Button = %SaveAllButton
@onready var find_in_files_button: Button = %FindInFilesButton
@onready var test_button: Button = %TestButton
@onready var test_line_button: Button = %TestLineButton
@onready var search_button: Button = %SearchButton
@onready var insert_button: MenuButton = %InsertButton
@onready var translations_button: MenuButton = %TranslationsButton
@onready var settings_button: Button = %SettingsButton
@onready var support_button: Button = %SupportButton
@onready var docs_button: Button = %DocsButton
@onready var version_label: Label = %VersionLabel
@@ -74,7 +71,7 @@ signal confirmation_closed()
@onready var files_list := %FilesList
@onready var files_popup_menu: PopupMenu = %FilesPopupMenu
@onready var title_list := %TitleList
@onready var code_edit := %CodeEdit
@onready var code_edit: DMCodeEdit = %CodeEdit
@onready var errors_panel := %ErrorsPanel
# The currently open file
@@ -85,6 +82,7 @@ var current_file_path: String = "":
if current_file_path == "" or not open_buffers.has(current_file_path):
save_all_button.disabled = true
test_button.disabled = true
test_line_button.disabled = true
search_button.disabled = true
insert_button.disabled = true
translations_button.disabled = true
@@ -93,8 +91,11 @@ var current_file_path: String = "":
title_list.hide()
code_edit.hide()
errors_panel.hide()
search_and_replace.hide()
banner.show()
else:
test_button.disabled = false
test_line_button.disabled = false
search_button.disabled = false
insert_button.disabled = false
translations_button.disabled = false
@@ -102,17 +103,25 @@ var current_file_path: String = "":
files_list.show()
title_list.show()
code_edit.show()
banner.hide()
var cursor: Vector2 = DMSettings.get_caret(current_file_path)
var scroll_vertical: int = DMSettings.get_scroll(current_file_path)
code_edit.text = open_buffers[current_file_path].text
code_edit.errors = []
code_edit.clear_undo_history()
code_edit.set_cursor(DialogueSettings.get_caret(current_file_path))
code_edit.set_cursor(cursor)
code_edit.scroll_vertical = scroll_vertical
code_edit.grab_focus()
_on_code_edit_text_changed()
errors_panel.errors = []
code_edit.errors = []
if search_and_replace.visible:
search_and_replace.search()
get:
return current_file_path
@@ -137,16 +146,16 @@ func _ready() -> void:
version_label.text = "v%s" % plugin.get_version()
update_button.on_before_refresh = func on_before_refresh():
# Save everything
DialogueSettings.set_user_value("just_refreshed", {
DMSettings.set_user_value("just_refreshed", {
current_file_path = current_file_path,
open_buffers = open_buffers
})
return true
# Did we just load from an addon version refresh?
var just_refreshed = DialogueSettings.get_user_value("just_refreshed", null)
var just_refreshed = DMSettings.get_user_value("just_refreshed", null)
if just_refreshed != null:
DialogueSettings.set_user_value("just_refreshed", null)
DMSettings.set_user_value("just_refreshed", null)
call_deferred("load_from_version_refresh", just_refreshed)
# Hook up the search toolbar
@@ -157,35 +166,39 @@ func _ready() -> void:
translations_button.get_popup().id_pressed.connect(_on_translations_button_menu_id_pressed)
code_edit.main_view = self
code_edit.wrap_mode = TextEdit.LINE_WRAPPING_BOUNDARY if DialogueSettings.get_setting("wrap_lines", false) else TextEdit.LINE_WRAPPING_NONE
var editor_settings: EditorSettings = plugin.get_editor_interface().get_editor_settings()
var editor_settings: EditorSettings = EditorInterface.get_editor_settings()
editor_settings.settings_changed.connect(_on_editor_settings_changed)
_on_editor_settings_changed()
ProjectSettings.settings_changed.connect(_on_project_settings_changed)
_on_project_settings_changed()
# Reopen any files that were open when Godot was closed
if editor_settings.get_setting("text_editor/behavior/files/restore_scripts_on_load"):
var reopen_files: Array = DialogueSettings.get_user_value("reopen_files", [])
var reopen_files: Array = DMSettings.get_user_value("reopen_files", [])
for reopen_file in reopen_files:
open_file(reopen_file)
self.current_file_path = DialogueSettings.get_user_value("most_recent_reopen_file", "")
self.current_file_path = DMSettings.get_user_value("most_recent_reopen_file", "")
save_all_button.disabled = true
close_confirmation_dialog.ok_button_text = DialogueConstants.translate(&"confirm_close.save")
close_confirmation_dialog.add_button(DialogueConstants.translate(&"confirm_close.discard"), true, "discard")
close_confirmation_dialog.ok_button_text = DMConstants.translate(&"confirm_close.save")
close_confirmation_dialog.add_button(DMConstants.translate(&"confirm_close.discard"), true, "discard")
errors_dialog.dialog_text = DialogueConstants.translate(&"errors_in_script")
errors_dialog.dialog_text = DMConstants.translate(&"errors_in_script")
# Update the buffer if a file was modified externally (retains undo step)
Engine.get_meta("DialogueCache").file_content_changed.connect(_on_cache_file_content_changed)
Engine.get_meta("DMCache").file_content_changed.connect(_on_cache_file_content_changed)
plugin.get_editor_interface().get_file_system_dock().files_moved.connect(_on_files_moved)
EditorInterface.get_file_system_dock().files_moved.connect(_on_files_moved)
code_edit.get_v_scroll_bar().value_changed.connect(_on_code_edit_scroll_changed)
func _exit_tree() -> void:
DialogueSettings.set_user_value("reopen_files", open_buffers.keys())
DialogueSettings.set_user_value("most_recent_reopen_file", self.current_file_path)
DMSettings.set_user_value("reopen_files", open_buffers.keys())
DMSettings.set_user_value("most_recent_reopen_file", self.current_file_path)
func _unhandled_input(event: InputEvent) -> void:
@@ -225,13 +238,12 @@ func load_from_version_refresh(just_refreshed: Dictionary) -> void:
else:
open_buffers = just_refreshed.open_buffers
var interface: EditorInterface = plugin.get_editor_interface()
if just_refreshed.current_file_path != "":
interface.edit_resource(load(just_refreshed.current_file_path))
EditorInterface.edit_resource(load(just_refreshed.current_file_path))
else:
interface.set_main_screen_editor("Dialogue")
EditorInterface.set_main_screen_editor("Dialogue")
updated_dialog.dialog_text = DialogueConstants.translate(&"update.success").format({ version = update_button.get_version() })
updated_dialog.dialog_text = DMConstants.translate(&"update.success").format({ version = update_button.get_version() })
updated_dialog.popup_centered()
@@ -241,12 +253,11 @@ func new_file(path: String, content: String = "") -> void:
var file: FileAccess = FileAccess.open(path, FileAccess.WRITE)
if content == "":
if DialogueSettings.get_setting("new_with_template", true):
file.store_string(DialogueSettings.get_setting("new_template", ""))
file.store_string(DMSettings.get_setting(DMSettings.NEW_FILE_TEMPLATE, ""))
else:
file.store_string(content)
plugin.get_editor_interface().get_resource_filesystem().scan()
EditorInterface.get_resource_filesystem().scan()
# Open a dialogue resource for editing
@@ -267,7 +278,7 @@ func open_file(path: String) -> void:
pristine_text = text
}
DialogueSettings.add_recent_file(path)
DMSettings.add_recent_file(path)
build_open_menu()
files_list.files = open_buffers.keys()
@@ -276,12 +287,14 @@ func open_file(path: String) -> void:
self.current_file_path = path
func show_file_in_filesystem(path: String) -> void:
var file_system_dock: FileSystemDock = plugin \
.get_editor_interface() \
.get_file_system_dock()
func quick_open() -> void:
quick_open_files_list.files = Engine.get_meta("DMCache").get_files()
quick_open_dialog.popup_centered()
quick_open_files_list.focus_filter()
file_system_dock.navigate_to_path(path)
func show_file_in_filesystem(path: String) -> void:
EditorInterface.get_file_system_dock().navigate_to_path(path)
# Save any open files
@@ -295,7 +308,7 @@ func save_files() -> void:
save_file(path, false)
if saved_files.size() > 0:
Engine.get_meta("DialogueCache").mark_files_for_reimport(saved_files)
Engine.get_meta("DMCache").mark_files_for_reimport(saved_files)
# Save a file
@@ -317,10 +330,7 @@ func save_file(path: String, rescan_file_system: bool = true) -> void:
file.close()
if rescan_file_system:
plugin \
.get_editor_interface() \
.get_resource_filesystem()\
.scan()
EditorInterface.get_resource_filesystem().scan()
func close_file(path: String) -> void:
@@ -332,7 +342,7 @@ func close_file(path: String) -> void:
remove_file_from_open_buffers(path)
await get_tree().process_frame
else:
close_confirmation_dialog.dialog_text = DialogueConstants.translate(&"confirm_close").format({ path = path.get_file() })
close_confirmation_dialog.dialog_text = DMConstants.translate(&"confirm_close").format({ path = path.get_file() })
close_confirmation_dialog.popup_centered()
await confirmation_closed
@@ -355,8 +365,8 @@ func remove_file_from_open_buffers(path: String) -> void:
# Apply theme colors and icons to the UI
func apply_theme() -> void:
if is_instance_valid(plugin) and is_instance_valid(code_edit):
var scale: float = plugin.get_editor_interface().get_editor_scale()
var editor_settings = plugin.get_editor_interface().get_editor_settings()
var scale: float = EditorInterface.get_editor_scale()
var editor_settings = EditorInterface.get_editor_settings()
code_edit.theme_overrides = {
scale = scale,
@@ -371,79 +381,84 @@ func apply_theme() -> void:
text_color = editor_settings.get_setting("text_editor/theme/highlighting/text_color"),
conditions_color = editor_settings.get_setting("text_editor/theme/highlighting/keyword_color"),
mutations_color = editor_settings.get_setting("text_editor/theme/highlighting/function_color"),
mutations_line_color = Color(editor_settings.get_setting("text_editor/theme/highlighting/function_color"), 0.6),
members_color = editor_settings.get_setting("text_editor/theme/highlighting/member_variable_color"),
strings_color = editor_settings.get_setting("text_editor/theme/highlighting/string_color"),
numbers_color = editor_settings.get_setting("text_editor/theme/highlighting/number_color"),
symbols_color = editor_settings.get_setting("text_editor/theme/highlighting/symbol_color"),
comments_color = editor_settings.get_setting("text_editor/theme/highlighting/comment_color"),
jumps_color = Color(editor_settings.get_setting("text_editor/theme/highlighting/control_flow_keyword_color"), 0.7),
jumps_color = Color(editor_settings.get_setting("text_editor/theme/highlighting/control_flow_keyword_color"), 0.6),
font_size = editor_settings.get_setting("interface/editor/code_font_size")
}
banner_new_button.icon = get_theme_icon("New", "EditorIcons")
banner_quick_open.icon = get_theme_icon("Load", "EditorIcons")
new_button.icon = get_theme_icon("New", "EditorIcons")
new_button.tooltip_text = DialogueConstants.translate(&"start_a_new_file")
new_button.tooltip_text = DMConstants.translate(&"start_a_new_file")
open_button.icon = get_theme_icon("Load", "EditorIcons")
open_button.tooltip_text = DialogueConstants.translate(&"open_a_file")
open_button.tooltip_text = DMConstants.translate(&"open_a_file")
save_all_button.icon = get_theme_icon("Save", "EditorIcons")
save_all_button.tooltip_text = DialogueConstants.translate(&"start_all_files")
save_all_button.text = DMConstants.translate(&"all")
save_all_button.tooltip_text = DMConstants.translate(&"start_all_files")
find_in_files_button.icon = get_theme_icon("ViewportZoom", "EditorIcons")
find_in_files_button.tooltip_text = DialogueConstants.translate(&"find_in_files")
find_in_files_button.tooltip_text = DMConstants.translate(&"find_in_files")
test_button.icon = get_theme_icon("PlayScene", "EditorIcons")
test_button.tooltip_text = DialogueConstants.translate(&"test_dialogue")
test_button.icon = get_theme_icon("DebugNext", "EditorIcons")
test_button.tooltip_text = DMConstants.translate(&"test_dialogue")
test_line_button.icon = get_theme_icon("DebugStep", "EditorIcons")
test_line_button.tooltip_text = DMConstants.translate(&"test_dialogue_from_line")
search_button.icon = get_theme_icon("Search", "EditorIcons")
search_button.tooltip_text = DialogueConstants.translate(&"search_for_text")
search_button.tooltip_text = DMConstants.translate(&"search_for_text")
insert_button.icon = get_theme_icon("RichTextEffect", "EditorIcons")
insert_button.text = DialogueConstants.translate(&"insert")
insert_button.text = DMConstants.translate(&"insert")
translations_button.icon = get_theme_icon("Translation", "EditorIcons")
translations_button.text = DialogueConstants.translate(&"translations")
settings_button.icon = get_theme_icon("Tools", "EditorIcons")
settings_button.tooltip_text = DialogueConstants.translate(&"settings")
translations_button.text = DMConstants.translate(&"translations")
support_button.icon = get_theme_icon("Heart", "EditorIcons")
support_button.text = DialogueConstants.translate(&"sponsor")
support_button.tooltip_text = DialogueConstants.translate(&"show_support")
support_button.text = DMConstants.translate(&"sponsor")
support_button.tooltip_text = DMConstants.translate(&"show_support")
docs_button.icon = get_theme_icon("Help", "EditorIcons")
docs_button.text = DialogueConstants.translate(&"docs")
docs_button.text = DMConstants.translate(&"docs")
update_button.apply_theme()
# Set up the effect menu
var popup: PopupMenu = insert_button.get_popup()
popup.clear()
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.wave_bbcode"), 0)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.shake_bbcode"), 1)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.wave_bbcode"), 0)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.shake_bbcode"), 1)
popup.add_separator()
popup.add_icon_item(get_theme_icon("Time", "EditorIcons"), DialogueConstants.translate(&"insert.typing_pause"), 3)
popup.add_icon_item(get_theme_icon("ViewportSpeed", "EditorIcons"), DialogueConstants.translate(&"insert.typing_speed_change"), 4)
popup.add_icon_item(get_theme_icon("DebugNext", "EditorIcons"), DialogueConstants.translate(&"insert.auto_advance"), 5)
popup.add_separator(DialogueConstants.translate(&"insert.templates"))
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.title"), 6)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.dialogue"), 7)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.response"), 8)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.random_lines"), 9)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.random_text"), 10)
popup.add_separator(DialogueConstants.translate(&"insert.actions"))
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.jump"), 11)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DialogueConstants.translate(&"insert.end_dialogue"), 12)
popup.add_icon_item(get_theme_icon("Time", "EditorIcons"), DMConstants.translate(&"insert.typing_pause"), 3)
popup.add_icon_item(get_theme_icon("ViewportSpeed", "EditorIcons"), DMConstants.translate(&"insert.typing_speed_change"), 4)
popup.add_icon_item(get_theme_icon("DebugNext", "EditorIcons"), DMConstants.translate(&"insert.auto_advance"), 5)
popup.add_separator(DMConstants.translate(&"insert.templates"))
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.title"), 6)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.dialogue"), 7)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.response"), 8)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.random_lines"), 9)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.random_text"), 10)
popup.add_separator(DMConstants.translate(&"insert.actions"))
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.jump"), 11)
popup.add_icon_item(get_theme_icon("RichTextEffect", "EditorIcons"), DMConstants.translate(&"insert.end_dialogue"), 12)
# Set up the translations menu
popup = translations_button.get_popup()
popup.clear()
popup.add_icon_item(get_theme_icon("Translation", "EditorIcons"), DialogueConstants.translate(&"generate_line_ids"), TRANSLATIONS_GENERATE_LINE_IDS)
popup.add_icon_item(get_theme_icon("Translation", "EditorIcons"), DMConstants.translate(&"generate_line_ids"), TRANSLATIONS_GENERATE_LINE_IDS)
popup.add_separator()
popup.add_icon_item(get_theme_icon("FileList", "EditorIcons"), DialogueConstants.translate(&"save_characters_to_csv"), TRANSLATIONS_SAVE_CHARACTERS_TO_CSV)
popup.add_icon_item(get_theme_icon("FileList", "EditorIcons"), DialogueConstants.translate(&"save_to_csv"), TRANSLATIONS_SAVE_TO_CSV)
popup.add_icon_item(get_theme_icon("AssetLib", "EditorIcons"), DialogueConstants.translate(&"import_from_csv"), TRANSLATIONS_IMPORT_FROM_CSV)
popup.add_icon_item(get_theme_icon("FileList", "EditorIcons"), DMConstants.translate(&"save_characters_to_csv"), TRANSLATIONS_SAVE_CHARACTERS_TO_CSV)
popup.add_icon_item(get_theme_icon("FileList", "EditorIcons"), DMConstants.translate(&"save_to_csv"), TRANSLATIONS_SAVE_TO_CSV)
popup.add_icon_item(get_theme_icon("AssetLib", "EditorIcons"), DMConstants.translate(&"import_from_csv"), TRANSLATIONS_IMPORT_FROM_CSV)
# Dialog sizes
new_dialog.min_size = Vector2(600, 500) * scale
@@ -452,9 +467,6 @@ func apply_theme() -> void:
quick_open_dialog.min_size = Vector2(400, 600) * scale
export_dialog.min_size = Vector2(600, 500) * scale
import_dialog.min_size = Vector2(600, 500) * scale
settings_dialog.min_size = Vector2(1000, 600) * scale
settings_dialog.max_size = Vector2(1000, 600) * scale
find_in_files_dialog.min_size = Vector2(800, 600) * scale
### Helpers
@@ -464,13 +476,13 @@ func apply_theme() -> void:
func build_open_menu() -> void:
var menu = open_button.get_popup()
menu.clear()
menu.add_icon_item(get_theme_icon("Load", "EditorIcons"), DialogueConstants.translate(&"open.open"), OPEN_OPEN)
menu.add_icon_item(get_theme_icon("Load", "EditorIcons"), DialogueConstants.translate(&"open.quick_open"), OPEN_QUICK)
menu.add_icon_item(get_theme_icon("Load", "EditorIcons"), DMConstants.translate(&"open.open"), OPEN_OPEN)
menu.add_icon_item(get_theme_icon("Load", "EditorIcons"), DMConstants.translate(&"open.quick_open"), OPEN_QUICK)
menu.add_separator()
var recent_files = DialogueSettings.get_recent_files()
var recent_files = DMSettings.get_recent_files()
if recent_files.size() == 0:
menu.add_item(DialogueConstants.translate(&"open.no_recent_files"))
menu.add_item(DMConstants.translate(&"open.no_recent_files"))
menu.set_item_disabled(2, true)
else:
for path in recent_files:
@@ -478,7 +490,7 @@ func build_open_menu() -> void:
menu.add_icon_item(get_theme_icon("File", "EditorIcons"), path)
menu.add_separator()
menu.add_item(DialogueConstants.translate(&"open.clear_recent_files"), OPEN_CLEAR)
menu.add_item(DMConstants.translate(&"open.clear_recent_files"), OPEN_CLEAR)
if menu.id_pressed.is_connected(_on_open_menu_id_pressed):
menu.id_pressed.disconnect(_on_open_menu_id_pressed)
menu.id_pressed.connect(_on_open_menu_id_pressed)
@@ -487,95 +499,34 @@ func build_open_menu() -> void:
# Get the last place a CSV, etc was exported
func get_last_export_path(extension: String) -> String:
var filename = current_file_path.get_file().replace(".dialogue", "." + extension)
return DialogueSettings.get_user_value("last_export_path", current_file_path.get_base_dir()) + "/" + filename
return DMSettings.get_user_value("last_export_path", current_file_path.get_base_dir()) + "/" + filename
# Check the current text for errors
func parse() -> void:
func compile() -> void:
# Skip if nothing to parse
if current_file_path == "": return
var parser = DialogueManagerParser.new()
var errors: Array[Dictionary] = []
if parser.parse(code_edit.text, current_file_path) != OK:
errors = parser.get_errors()
code_edit.errors = errors
errors_panel.errors = errors
parser.free()
var result: DMCompilerResult = DMCompiler.compile_string(code_edit.text, current_file_path)
code_edit.errors = result.errors
errors_panel.errors = result.errors
title_list.titles = code_edit.get_titles()
func show_build_error_dialog() -> void:
build_error_dialog.dialog_text = DialogueConstants.translate(&"errors_with_build")
build_error_dialog.dialog_text = DMConstants.translate(&"errors_with_build")
build_error_dialog.popup_centered()
# Generate translation line IDs for any line that doesn't already have one
func generate_translations_keys() -> void:
randomize()
seed(Time.get_unix_time_from_system())
var parser = DialogueManagerParser.new()
var cursor: Vector2 = code_edit.get_cursor()
var lines: PackedStringArray = code_edit.text.split("\n")
var key_regex = RegEx.new()
key_regex.compile("\\[ID:(?<key>.*?)\\]")
# Make list of known keys
var known_keys = {}
for i in range(0, lines.size()):
var line = lines[i]
var found = key_regex.search(line)
if found:
var text = ""
var l = line.replace(found.strings[0], "").strip_edges().strip_edges()
if l.begins_with("- "):
text = parser.extract_response_prompt(l)
elif ":" in l:
text = l.split(":")[1]
else:
text = l
known_keys[found.strings[found.names.get("key")]] = text
# Add in any that are missing
for i in lines.size():
var line = lines[i]
var l = line.strip_edges()
if parser.is_line_empty(l): continue
if parser.is_condition_line(l, true): continue
if parser.is_title_line(l): continue
if parser.is_mutation_line(l): continue
if parser.is_goto_line(l): continue
if parser.is_import_line(l): continue
if "[ID:" in line: continue
var key = "t" + str(randi() % 1000000).sha1_text().substr(0, 10)
while key in known_keys:
key = "t" + str(randi() % 1000000).sha1_text().substr(0, 10)
var text = ""
if l.begins_with("- "):
text = parser.extract_response_prompt(l)
else:
text = l.substr(l.find(":") + 1)
text = text.replace("\n", "!NEWLINE!")
line = line.replace("\\n", "!NEWLINE!")
lines[i] = line.replace(text, text + " [ID:%s]" % key).replace("!NEWLINE!", "\\n")
known_keys[key] = text
code_edit.text = "\n".join(lines)
var scroll_vertical = code_edit.scroll_vertical
code_edit.text = DMTranslationUtilities.generate_translation_keys(code_edit.text)
code_edit.set_cursor(cursor)
code_edit.scroll_vertical = scroll_vertical
_on_code_edit_text_changed()
parser.free()
# Add a translation file to the project settings
func add_path_to_project_translations(path: String) -> void:
@@ -587,168 +538,23 @@ func add_path_to_project_translations(path: String) -> void:
# Export dialogue and responses to CSV
func export_translations_to_csv(path: String) -> void:
var default_locale: String = DialogueSettings.get_setting("default_csv_locale", "en")
DMTranslationUtilities.export_translations_to_csv(path, code_edit.text, current_file_path)
var file: FileAccess
# If the file exists, open it first and work out which keys are already in it
var existing_csv: Dictionary = {}
var column_count: int = 2
var default_locale_column: int = 1
var character_column: int = -1
var notes_column: int = -1
if FileAccess.file_exists(path):
file = FileAccess.open(path, FileAccess.READ)
var is_first_line = true
var line: Array
while !file.eof_reached():
line = file.get_csv_line()
if is_first_line:
is_first_line = false
column_count = line.size()
for i in range(1, line.size()):
if line[i] == default_locale:
default_locale_column = i
elif line[i] == "_character":
character_column = i
elif line[i] == "_notes":
notes_column = i
# Make sure the line isn't empty before adding it
if line.size() > 0 and line[0].strip_edges() != "":
existing_csv[line[0]] = line
# The character column wasn't found in the existing file but the setting is turned on
if character_column == -1 and DialogueSettings.get_setting("include_character_in_translation_exports", false):
character_column = column_count
column_count += 1
existing_csv["keys"].append("_character")
# The notes column wasn't found in the existing file but the setting is turned on
if notes_column == -1 and DialogueSettings.get_setting("include_notes_in_translation_exports", false):
notes_column = column_count
column_count += 1
existing_csv["keys"].append("_notes")
# Start a new file
file = FileAccess.open(path, FileAccess.WRITE)
if not FileAccess.file_exists(path):
var headings: PackedStringArray = ["keys", default_locale]
if DialogueSettings.get_setting("include_character_in_translation_exports", false):
character_column = headings.size()
headings.append("_character")
if DialogueSettings.get_setting("include_notes_in_translation_exports", false):
notes_column = headings.size()
headings.append("_notes")
file.store_csv_line(headings)
column_count = headings.size()
# Write our translations to file
var known_keys: PackedStringArray = []
var dialogue: Dictionary = DialogueManagerParser.parse_string(code_edit.text, current_file_path).lines
# Make a list of stuff that needs to go into the file
var lines_to_save = []
for key in dialogue.keys():
var line: Dictionary = dialogue.get(key)
if not line.type in [DialogueConstants.TYPE_DIALOGUE, DialogueConstants.TYPE_RESPONSE]: continue
if line.translation_key in known_keys: continue
known_keys.append(line.translation_key)
var line_to_save: PackedStringArray = []
if existing_csv.has(line.translation_key):
line_to_save = existing_csv.get(line.translation_key)
line_to_save.resize(column_count)
existing_csv.erase(line.translation_key)
else:
line_to_save.resize(column_count)
line_to_save[0] = line.translation_key
line_to_save[default_locale_column] = line.text
if character_column > -1:
line_to_save[character_column] = "(response)" if line.type == DialogueConstants.TYPE_RESPONSE else line.character
if notes_column > -1:
line_to_save[notes_column] = line.notes
lines_to_save.append(line_to_save)
# Store lines in the file, starting with anything that already exists that hasn't been touched
for line in existing_csv.values():
file.store_csv_line(line)
for line in lines_to_save:
file.store_csv_line(line)
file.close()
plugin.get_editor_interface().get_resource_filesystem().scan()
plugin.get_editor_interface().get_file_system_dock().call_deferred("navigate_to_path", path)
EditorInterface.get_resource_filesystem().scan()
EditorInterface.get_file_system_dock().call_deferred("navigate_to_path", path)
# Add it to the project l10n settings if it's not already there
var default_locale: String = DMSettings.get_setting(DMSettings.DEFAULT_CSV_LOCALE, "en")
var language_code: RegExMatch = RegEx.create_from_string("^[a-z]{2,3}").search(default_locale)
var translation_path: String = path.replace(".csv", ".%s.translation" % language_code.get_string())
call_deferred("add_path_to_project_translations", translation_path)
func export_character_names_to_csv(path: String) -> void:
var file: FileAccess
DMTranslationUtilities.export_character_names_to_csv(path, code_edit.text, current_file_path)
# If the file exists, open it first and work out which keys are already in it
var existing_csv = {}
var commas = []
if FileAccess.file_exists(path):
file = FileAccess.open(path, FileAccess.READ)
var is_first_line = true
var line: Array
while !file.eof_reached():
line = file.get_csv_line()
if is_first_line:
is_first_line = false
for i in range(2, line.size()):
commas.append("")
# Make sure the line isn't empty before adding it
if line.size() > 0 and line[0].strip_edges() != "":
existing_csv[line[0]] = line
# Start a new file
file = FileAccess.open(path, FileAccess.WRITE)
if not file.file_exists(path):
file.store_csv_line(["keys", DialogueSettings.get_setting("default_csv_locale", "en")])
# Write our translations to file
var known_keys: PackedStringArray = []
var character_names: PackedStringArray = DialogueManagerParser.parse_string(code_edit.text, current_file_path).character_names
# Make a list of stuff that needs to go into the file
var lines_to_save = []
for character_name in character_names:
if character_name in known_keys: continue
known_keys.append(character_name)
if existing_csv.has(character_name):
var existing_line = existing_csv.get(character_name)
existing_line[1] = character_name
lines_to_save.append(existing_line)
existing_csv.erase(character_name)
else:
lines_to_save.append(PackedStringArray([character_name, character_name] + commas))
# Store lines in the file, starting with anything that already exists that hasn't been touched
for line in existing_csv.values():
file.store_csv_line(line)
for line in lines_to_save:
file.store_csv_line(line)
file.close()
plugin.get_editor_interface().get_resource_filesystem().scan()
plugin.get_editor_interface().get_file_system_dock().call_deferred("navigate_to_path", path)
EditorInterface.get_resource_filesystem().scan()
EditorInterface.get_file_system_dock().call_deferred("navigate_to_path", path)
# Add it to the project l10n settings if it's not already there
var translation_path: String = path.replace(".csv", ".en.translation")
@@ -758,54 +564,9 @@ func export_character_names_to_csv(path: String) -> void:
# Import changes back from an exported CSV by matching translation keys
func import_translations_from_csv(path: String) -> void:
var cursor: Vector2 = code_edit.get_cursor()
if not FileAccess.file_exists(path): return
# Open the CSV file and build a dictionary of the known keys
var keys: Dictionary = {}
var file: FileAccess = FileAccess.open(path, FileAccess.READ)
var csv_line: Array
while !file.eof_reached():
csv_line = file.get_csv_line()
if csv_line.size() > 1:
keys[csv_line[0]] = csv_line[1]
var parser: DialogueManagerParser = DialogueManagerParser.new()
# Now look over each line in the dialogue and replace the content for matched keys
var lines: PackedStringArray = code_edit.text.split("\n")
var start_index: int = 0
var end_index: int = 0
for i in range(0, lines.size()):
var line: String = lines[i]
var translation_key: String = parser.extract_translation(line)
if keys.has(translation_key):
if parser.is_dialogue_line(line):
start_index = 0
# See if we need to skip over a character name
line = line.replace("\\:", "!ESCAPED_COLON!")
if ": " in line:
start_index = line.find(": ") + 2
lines[i] = (line.substr(0, start_index) + keys.get(translation_key) + " [ID:" + translation_key + "]").replace("!ESCAPED_COLON!", ":")
elif parser.is_response_line(line):
start_index = line.find("- ") + 2
# See if we need to skip over a character name
line = line.replace("\\:", "!ESCAPED_COLON!")
if ": " in line:
start_index = line.find(": ") + 2
end_index = line.length()
if " =>" in line:
end_index = line.find(" =>")
if " [if " in line:
end_index = line.find(" [if ")
lines[i] = (line.substr(0, start_index) + keys.get(translation_key) + " [ID:" + translation_key + "]" + line.substr(end_index)).replace("!ESCAPED_COLON!", ":")
code_edit.text = "\n".join(lines)
code_edit.text = DMTranslationUtilities.import_translations_from_csv(path, code_edit.text)
code_edit.set_cursor(cursor)
parser.free()
func show_search_form(is_enabled: bool) -> void:
if code_edit.last_selected_text:
@@ -816,6 +577,16 @@ func show_search_form(is_enabled: bool) -> void:
search_and_replace.focus_line_edit()
func run_test_scene(from_key: String) -> void:
DMSettings.set_user_value("run_title", from_key)
DMSettings.set_user_value("is_running_test_scene", true)
DMSettings.set_user_value("run_resource_path", current_file_path)
var test_scene_path: String = DMSettings.get_setting(DMSettings.CUSTOM_TEST_SCENE_PATH, "res://addons/dialogue_manager/test_scene.tscn")
if ResourceUID.has_id(ResourceUID.text_to_id(test_scene_path)):
test_scene_path = ResourceUID.get_id_path(ResourceUID.text_to_id(test_scene_path))
EditorInterface.play_custom_scene(test_scene_path)
### Signals
@@ -829,30 +600,32 @@ func _on_files_moved(old_file: String, new_file: String) -> void:
func _on_cache_file_content_changed(path: String, new_content: String) -> void:
if open_buffers.has(path):
var buffer = open_buffers[path]
if buffer.text != new_content:
if buffer.text == buffer.pristine_text and buffer.text != new_content:
buffer.text = new_content
buffer.pristine_text = new_content
code_edit.text = new_content
title_list.titles = code_edit.get_titles()
buffer.pristine_text = new_content
func _on_editor_settings_changed() -> void:
var editor_settings: EditorSettings = plugin.get_editor_interface().get_editor_settings()
var editor_settings: EditorSettings = EditorInterface.get_editor_settings()
code_edit.minimap_draw = editor_settings.get_setting("text_editor/appearance/minimap/show_minimap")
code_edit.minimap_width = editor_settings.get_setting("text_editor/appearance/minimap/minimap_width")
code_edit.scroll_smooth = editor_settings.get_setting("text_editor/behavior/navigation/smooth_scrolling")
func _on_project_settings_changed() -> void:
code_edit.wrap_mode = TextEdit.LINE_WRAPPING_BOUNDARY if DMSettings.get_setting(DMSettings.WRAP_LONG_LINES, false) else TextEdit.LINE_WRAPPING_NONE
func _on_open_menu_id_pressed(id: int) -> void:
match id:
OPEN_OPEN:
open_dialog.popup_centered()
OPEN_QUICK:
quick_open_files_list.files = Engine.get_meta("DialogueCache").get_files()
quick_open_dialog.popup_centered()
quick_open_files_list.focus_filter()
quick_open()
OPEN_CLEAR:
DialogueSettings.clear_recent_files()
DMSettings.clear_recent_files()
build_open_menu()
_:
var menu = open_button.get_popup()
@@ -915,7 +688,7 @@ func _on_translations_button_menu_id_pressed(id: int) -> void:
func _on_export_dialog_file_selected(path: String) -> void:
DialogueSettings.set_user_value("last_export_path", path.get_base_dir())
DMSettings.set_user_value("last_export_path", path.get_base_dir())
match path.get_extension():
"csv":
match translation_source:
@@ -926,7 +699,7 @@ func _on_export_dialog_file_selected(path: String) -> void:
func _on_import_dialog_file_selected(path: String) -> void:
DialogueSettings.set_user_value("last_export_path", path.get_base_dir())
DMSettings.set_user_value("last_export_path", path.get_base_dir())
import_translations_from_csv(path)
@@ -940,15 +713,16 @@ func _on_main_view_visibility_changed() -> void:
func _on_new_button_pressed() -> void:
new_dialog.current_file = "dialogue"
new_dialog.current_file = "untitled"
new_dialog.popup_centered()
func _on_new_dialog_confirmed() -> void:
if new_dialog.current_file.get_basename() == "":
var path = "res://untitled.dialogue"
new_file(path)
open_file(path)
var path: String = new_dialog.current_path
if path.get_file() == ".dialogue":
path = "%s/untitled.dialogue" % path.get_basename()
new_file(path)
open_file(path)
func _on_new_dialog_file_selected(path: String) -> void:
@@ -977,8 +751,8 @@ func _on_quick_open_files_list_file_double_clicked(file_path: String) -> void:
func _on_quick_open_dialog_confirmed() -> void:
if quick_open_files_list.current_file_path:
open_file(quick_open_files_list.current_file_path)
if quick_open_files_list.last_selected_file_path:
open_file(quick_open_files_list.last_selected_file_path)
func _on_save_all_button_pressed() -> void:
@@ -986,8 +760,7 @@ func _on_save_all_button_pressed() -> void:
func _on_find_in_files_button_pressed() -> void:
find_in_files_dialog.popup_centered()
find_in_files.prepare()
plugin.show_find_in_dialogue()
func _on_code_edit_text_changed() -> void:
@@ -1000,13 +773,16 @@ func _on_code_edit_text_changed() -> void:
parse_timer.start(1)
func _on_code_edit_scroll_changed(value: int) -> void:
DMSettings.set_scroll(current_file_path, code_edit.scroll_vertical)
func _on_code_edit_active_title_change(title: String) -> void:
title_list.select_title(title)
DialogueSettings.set_user_value("run_title", title)
func _on_code_edit_caret_changed() -> void:
DialogueSettings.set_caret(current_file_path, code_edit.get_cursor())
DMSettings.set_caret(current_file_path, code_edit.get_cursor())
func _on_code_edit_error_clicked(line_number: int) -> void:
@@ -1020,11 +796,11 @@ func _on_title_list_title_selected(title: String) -> void:
func _on_parse_timer_timeout() -> void:
parse_timer.stop()
parse()
compile()
func _on_errors_panel_error_pressed(line_number: int, column_number: int) -> void:
code_edit.set_caret_line(line_number)
code_edit.set_caret_line(line_number - 1)
code_edit.set_caret_column(column_number)
code_edit.grab_focus()
@@ -1043,35 +819,32 @@ func _on_search_and_replace_close_requested() -> void:
code_edit.grab_focus()
func _on_settings_button_pressed() -> void:
settings_view.prepare()
settings_dialog.popup_centered()
func _on_settings_view_script_button_pressed(path: String) -> void:
settings_dialog.hide()
plugin.get_editor_interface().edit_resource(load(path))
func _on_test_button_pressed() -> void:
save_file(current_file_path, false)
Engine.get_meta("DialogueCache").reimport_files([current_file_path])
Engine.get_meta("DMCache").reimport_files([current_file_path])
if errors_panel.errors.size() > 0:
errors_dialog.popup_centered()
return
DialogueSettings.set_user_value("is_running_test_scene", true)
DialogueSettings.set_user_value("run_resource_path", current_file_path)
var test_scene_path: String = DialogueSettings.get_setting("custom_test_scene_path", "res://addons/dialogue_manager/test_scene.tscn")
plugin.get_editor_interface().play_custom_scene(test_scene_path)
run_test_scene("")
func _on_settings_dialog_confirmed() -> void:
settings_view.apply_settings_changes()
parse()
code_edit.wrap_mode = TextEdit.LINE_WRAPPING_BOUNDARY if DialogueSettings.get_setting("wrap_lines", false) else TextEdit.LINE_WRAPPING_NONE
code_edit.grab_focus()
func _on_test_line_button_pressed() -> void:
save_file(current_file_path)
if errors_panel.errors.size() > 0:
errors_dialog.popup_centered()
return
# Find next non-empty line
var line_to_run: int = 0
for i in range(code_edit.get_cursor().y, code_edit.get_line_count()):
if not code_edit.get_line(i).is_empty():
line_to_run = i
break
run_test_scene(str(line_to_run))
func _on_support_button_pressed() -> void:
@@ -1096,14 +869,14 @@ func _on_files_popup_menu_about_to_popup() -> void:
var shortcuts: Dictionary = plugin.get_editor_shortcuts()
files_popup_menu.add_item(DialogueConstants.translate(&"buffer.save"), ITEM_SAVE, OS.find_keycode_from_string(shortcuts.get("save")[0].as_text_keycode()))
files_popup_menu.add_item(DialogueConstants.translate(&"buffer.save_as"), ITEM_SAVE_AS)
files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close"), ITEM_CLOSE, OS.find_keycode_from_string(shortcuts.get("close_file")[0].as_text_keycode()))
files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close_all"), ITEM_CLOSE_ALL)
files_popup_menu.add_item(DialogueConstants.translate(&"buffer.close_other_files"), ITEM_CLOSE_OTHERS)
files_popup_menu.add_item(DMConstants.translate(&"buffer.save"), ITEM_SAVE, OS.find_keycode_from_string(shortcuts.get("save")[0].as_text_keycode()))
files_popup_menu.add_item(DMConstants.translate(&"buffer.save_as"), ITEM_SAVE_AS)
files_popup_menu.add_item(DMConstants.translate(&"buffer.close"), ITEM_CLOSE, OS.find_keycode_from_string(shortcuts.get("close_file")[0].as_text_keycode()))
files_popup_menu.add_item(DMConstants.translate(&"buffer.close_all"), ITEM_CLOSE_ALL)
files_popup_menu.add_item(DMConstants.translate(&"buffer.close_other_files"), ITEM_CLOSE_OTHERS)
files_popup_menu.add_separator()
files_popup_menu.add_item(DialogueConstants.translate(&"buffer.copy_file_path"), ITEM_COPY_PATH)
files_popup_menu.add_item(DialogueConstants.translate(&"buffer.show_in_filesystem"), ITEM_SHOW_IN_FILESYSTEM)
files_popup_menu.add_item(DMConstants.translate(&"buffer.copy_file_path"), ITEM_COPY_PATH)
files_popup_menu.add_item(DMConstants.translate(&"buffer.show_in_filesystem"), ITEM_SHOW_IN_FILESYSTEM)
func _on_files_popup_menu_id_pressed(id: int) -> void:
@@ -1153,3 +926,22 @@ func _on_close_confirmation_dialog_custom_action(action: StringName) -> void:
func _on_find_in_files_result_selected(path: String, cursor: Vector2, length: int) -> void:
open_file(path)
code_edit.select(cursor.y, cursor.x, cursor.y, cursor.x + length)
code_edit.set_line_as_center_visible(cursor.y)
func _on_banner_image_gui_input(event: InputEvent) -> void:
if event.is_pressed():
OS.shell_open("https://bravestcoconut.com/wishlist")
func _on_banner_new_button_pressed() -> void:
new_dialog.current_file = "untitled"
new_dialog.popup_centered()
func _on_banner_quick_open_pressed() -> void:
quick_open()
func _on_banner_examples_pressed() -> void:
OS.shell_open("https://itch.io/c/5226650/godot-dialogue-manager-example-projects")
@@ -0,0 +1 @@
uid://cipjcc7bkh1pc
+70 -52
View File
@@ -1,17 +1,16 @@
[gd_scene load_steps=16 format=3 uid="uid://cbuf1q3xsse3q"]
[gd_scene load_steps=15 format=3 uid="uid://cbuf1q3xsse3q"]
[ext_resource type="Script" path="res://addons/dialogue_manager/views/main_view.gd" id="1_h6qfq"]
[ext_resource type="Script" uid="uid://cipjcc7bkh1pc" path="res://addons/dialogue_manager/views/main_view.gd" id="1_h6qfq"]
[ext_resource type="PackedScene" uid="uid://civ6shmka5e8u" path="res://addons/dialogue_manager/components/code_edit.tscn" id="2_f73fm"]
[ext_resource type="PackedScene" uid="uid://dnufpcdrreva3" path="res://addons/dialogue_manager/components/files_list.tscn" id="2_npj2k"]
[ext_resource type="PackedScene" uid="uid://ctns6ouwwd68i" path="res://addons/dialogue_manager/components/title_list.tscn" id="2_onb4i"]
[ext_resource type="PackedScene" uid="uid://co8yl23idiwbi" path="res://addons/dialogue_manager/components/update_button.tscn" id="2_ph3vs"]
[ext_resource type="PackedScene" uid="uid://gr8nakpbrhby" path="res://addons/dialogue_manager/components/search_and_replace.tscn" id="6_ylh0t"]
[ext_resource type="PackedScene" uid="uid://cs8pwrxr5vxix" path="res://addons/dialogue_manager/components/errors_panel.tscn" id="7_5cvl4"]
[ext_resource type="Script" path="res://addons/dialogue_manager/components/code_edit_syntax_highlighter.gd" id="7_necsa"]
[ext_resource type="PackedScene" uid="uid://cpg4lg1r3ff6m" path="res://addons/dialogue_manager/views/settings_view.tscn" id="9_8bf36"]
[ext_resource type="PackedScene" uid="uid://0n7hwviyyly4" path="res://addons/dialogue_manager/components/find_in_files.tscn" id="10_yold3"]
[ext_resource type="Script" uid="uid://klpiq4tk3t7a" path="res://addons/dialogue_manager/components/code_edit_syntax_highlighter.gd" id="7_necsa"]
[ext_resource type="Texture2D" uid="uid://cnm67htuohhlo" path="res://addons/dialogue_manager/assets/banner.png" id="9_y6rqu"]
[sub_resource type="Image" id="Image_68x0r"]
[sub_resource type="Image" id="Image_faxki"]
data = {
"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
"format": "RGBA8",
@@ -21,9 +20,9 @@ data = {
}
[sub_resource type="ImageTexture" id="ImageTexture_ka3gk"]
image = SubResource("Image_68x0r")
image = SubResource("Image_faxki")
[sub_resource type="Image" id="Image_j5bhl"]
[sub_resource type="Image" id="Image_y6rqu"]
data = {
"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
"format": "RGBA8",
@@ -33,9 +32,9 @@ data = {
}
[sub_resource type="ImageTexture" id="ImageTexture_57eek"]
image = SubResource("Image_j5bhl")
image = SubResource("Image_y6rqu")
[sub_resource type="SyntaxHighlighter" id="SyntaxHighlighter_bxc68"]
[sub_resource type="SyntaxHighlighter" id="SyntaxHighlighter_mpdoc"]
script = ExtResource("7_necsa")
[node name="MainView" type="Control"]
@@ -133,7 +132,6 @@ size_flags_vertical = 3
unique_name_in_owner = true
visible = false
layout_mode = 2
size_flags_vertical = 3
[node name="FilesPopupMenu" type="PopupMenu" parent="Margin/Content/SidePanel/Bookmarks/FilesList"]
unique_name_in_owner = true
@@ -159,6 +157,7 @@ text = "Insert"
item_count = 15
popup/item_0/text = "Wave BBCode"
popup/item_0/icon = SubResource("ImageTexture_57eek")
popup/item_0/id = 0
popup/item_1/text = "Shake BBCode"
popup/item_1/icon = SubResource("ImageTexture_57eek")
popup/item_1/id = 1
@@ -233,6 +232,9 @@ disabled = true
toggle_mode = true
flat = true
[node name="Separator2" type="VSeparator" parent="Margin/Content/CodePanel/Toolbar"]
layout_mode = 2
[node name="TestButton" type="Button" parent="Margin/Content/CodePanel/Toolbar"]
unique_name_in_owner = true
layout_mode = 2
@@ -240,13 +242,11 @@ tooltip_text = "Test dialogue"
disabled = true
flat = true
[node name="Separator3" type="VSeparator" parent="Margin/Content/CodePanel/Toolbar"]
layout_mode = 2
[node name="SettingsButton" type="Button" parent="Margin/Content/CodePanel/Toolbar"]
[node name="TestLineButton" type="Button" parent="Margin/Content/CodePanel/Toolbar"]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Settings"
tooltip_text = "Test dialogue"
disabled = true
flat = true
[node name="Spacer2" type="Control" parent="Margin/Content/CodePanel/Toolbar"]
@@ -279,6 +279,7 @@ vertical_alignment = 1
[node name="UpdateButton" parent="Margin/Content/CodePanel/Toolbar" instance=ExtResource("2_ph3vs")]
unique_name_in_owner = true
layout_mode = 2
text = "v2.44.1 available"
[node name="SearchAndReplace" parent="Margin/Content/CodePanel" instance=ExtResource("6_ylh0t")]
unique_name_in_owner = true
@@ -290,9 +291,9 @@ visible = false
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_colors/current_line_color = Color(0.266667, 0.278431, 0.352941, 0.243137)
theme_override_colors/background_color = Color(0.156863, 0.164706, 0.211765, 1)
theme_override_colors/font_color = Color(0.972549, 0.972549, 0.94902, 1)
theme_override_colors/background_color = Color(0.156863, 0.164706, 0.211765, 1)
theme_override_colors/current_line_color = Color(0.266667, 0.278431, 0.352941, 0.243137)
theme_override_font_sizes/font_size = 14
theme_override_colors/bookmark_color = Color(1, 0.333333, 0.333333, 1)
text = "~ start
@@ -311,12 +312,57 @@ Coco: Meow.
=> END"
scroll_smooth = true
syntax_highlighter = SubResource("SyntaxHighlighter_bxc68")
syntax_highlighter = SubResource("SyntaxHighlighter_mpdoc")
[node name="ErrorsPanel" parent="Margin/Content/CodePanel" instance=ExtResource("7_5cvl4")]
unique_name_in_owner = true
layout_mode = 2
[node name="Banner" type="CenterContainer" parent="."]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = 34.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="PanelContainer" type="VBoxContainer" parent="Banner"]
layout_mode = 2
theme_override_constants/separation = 5
[node name="BannerImage" type="TextureRect" parent="Banner/PanelContainer"]
custom_minimum_size = Vector2(600, 200)
layout_mode = 2
mouse_filter = 0
mouse_default_cursor_shape = 2
texture = ExtResource("9_y6rqu")
expand_mode = 3
[node name="HBoxContainer" type="HBoxContainer" parent="Banner/PanelContainer"]
layout_mode = 2
theme_override_constants/separation = 5
[node name="BannerNewButton" type="Button" parent="Banner/PanelContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
text = "New Dialogue..."
[node name="BannerQuickOpen" type="Button" parent="Banner/PanelContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
text = "Quick open..."
[node name="BannerExamples" type="Button" parent="Banner/PanelContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
text = "Example projects..."
[node name="NewDialog" type="FileDialog" parent="."]
size = Vector2i(900, 750)
min_size = Vector2i(600, 500)
@@ -362,20 +408,6 @@ filters = PackedStringArray("*.csv ; Translation CSV")
title = "Error"
dialog_text = "You have errors in your script. Fix them and then try again."
[node name="SettingsDialog" type="AcceptDialog" parent="."]
title = "Settings"
size = Vector2i(1000, 600)
unresizable = true
min_size = Vector2i(1000, 600)
max_size = Vector2i(1000, 600)
ok_button_text = "Done"
[node name="SettingsView" parent="SettingsDialog" instance=ExtResource("9_8bf36")]
offset_left = 8.0
offset_top = 8.0
offset_right = -8.0
offset_bottom = -49.0
[node name="BuildErrorDialog" type="AcceptDialog" parent="."]
title = "Errors"
dialog_text = "You need to fix dialogue errors before you can run your game."
@@ -389,21 +421,6 @@ title = "Updated"
size = Vector2i(191, 100)
dialog_text = "You're now up to date!"
[node name="FindInFilesDialog" type="AcceptDialog" parent="."]
title = "Find in files"
size = Vector2i(1200, 900)
min_size = Vector2i(800, 600)
ok_button_text = "Done"
[node name="FindInFiles" parent="FindInFilesDialog" node_paths=PackedStringArray("main_view", "code_edit") instance=ExtResource("10_yold3")]
custom_minimum_size = Vector2(400, 400)
offset_left = 8.0
offset_top = 8.0
offset_right = -8.0
offset_bottom = -49.0
main_view = NodePath("../..")
code_edit = NodePath("../../Margin/Content/CodePanel/CodeEdit")
[connection signal="theme_changed" from="." to="." method="_on_main_view_theme_changed"]
[connection signal="visibility_changed" from="." to="." method="_on_main_view_visibility_changed"]
[connection signal="timeout" from="ParseTimer" to="." method="_on_parse_timer_timeout"]
@@ -419,7 +436,7 @@ code_edit = NodePath("../../Margin/Content/CodePanel/CodeEdit")
[connection signal="title_selected" from="Margin/Content/SidePanel/Bookmarks/TitleList" to="." method="_on_title_list_title_selected"]
[connection signal="toggled" from="Margin/Content/CodePanel/Toolbar/SearchButton" to="." method="_on_search_button_toggled"]
[connection signal="pressed" from="Margin/Content/CodePanel/Toolbar/TestButton" to="." method="_on_test_button_pressed"]
[connection signal="pressed" from="Margin/Content/CodePanel/Toolbar/SettingsButton" to="." method="_on_settings_button_pressed"]
[connection signal="pressed" from="Margin/Content/CodePanel/Toolbar/TestLineButton" to="." method="_on_test_line_button_pressed"]
[connection signal="pressed" from="Margin/Content/CodePanel/Toolbar/SupportButton" to="." method="_on_support_button_pressed"]
[connection signal="pressed" from="Margin/Content/CodePanel/Toolbar/DocsButton" to="." method="_on_docs_button_pressed"]
[connection signal="close_requested" from="Margin/Content/CodePanel/SearchAndReplace" to="." method="_on_search_and_replace_close_requested"]
@@ -430,6 +447,10 @@ code_edit = NodePath("../../Margin/Content/CodePanel/CodeEdit")
[connection signal="external_file_requested" from="Margin/Content/CodePanel/CodeEdit" to="." method="_on_code_edit_external_file_requested"]
[connection signal="text_changed" from="Margin/Content/CodePanel/CodeEdit" to="." method="_on_code_edit_text_changed"]
[connection signal="error_pressed" from="Margin/Content/CodePanel/ErrorsPanel" to="." method="_on_errors_panel_error_pressed"]
[connection signal="gui_input" from="Banner/PanelContainer/BannerImage" to="." method="_on_banner_image_gui_input"]
[connection signal="pressed" from="Banner/PanelContainer/HBoxContainer/BannerNewButton" to="." method="_on_banner_new_button_pressed"]
[connection signal="pressed" from="Banner/PanelContainer/HBoxContainer/BannerQuickOpen" to="." method="_on_banner_quick_open_pressed"]
[connection signal="pressed" from="Banner/PanelContainer/HBoxContainer/BannerExamples" to="." method="_on_banner_examples_pressed"]
[connection signal="confirmed" from="NewDialog" to="." method="_on_new_dialog_confirmed"]
[connection signal="file_selected" from="NewDialog" to="." method="_on_new_dialog_file_selected"]
[connection signal="file_selected" from="SaveDialog" to="." method="_on_save_dialog_file_selected"]
@@ -438,8 +459,5 @@ code_edit = NodePath("../../Margin/Content/CodePanel/CodeEdit")
[connection signal="file_double_clicked" from="QuickOpenDialog/QuickOpenFilesList" to="." method="_on_quick_open_files_list_file_double_clicked"]
[connection signal="file_selected" from="ExportDialog" to="." method="_on_export_dialog_file_selected"]
[connection signal="file_selected" from="ImportDialog" to="." method="_on_import_dialog_file_selected"]
[connection signal="confirmed" from="SettingsDialog" to="." method="_on_settings_dialog_confirmed"]
[connection signal="script_button_pressed" from="SettingsDialog/SettingsView" to="." method="_on_settings_view_script_button_pressed"]
[connection signal="confirmed" from="CloseConfirmationDialog" to="." method="_on_close_confirmation_dialog_confirmed"]
[connection signal="custom_action" from="CloseConfirmationDialog" to="." method="_on_close_confirmation_dialog_custom_action"]
[connection signal="result_selected" from="FindInFilesDialog/FindInFiles" to="." method="_on_find_in_files_result_selected"]
@@ -1,288 +0,0 @@
@tool
extends TabContainer
signal script_button_pressed(path: String)
const DialogueConstants = preload("../constants.gd")
const DialogueSettings = preload("../settings.gd")
const BaseDialogueTestScene = preload("../test_scene.gd")
enum PathTarget {
CustomTestScene,
Balloon
}
# Editor
@onready var new_template_button: CheckBox = $Editor/NewTemplateButton
@onready var new_template: CodeEdit = $Editor/NewTemplate
@onready var characters_translations_button: CheckBox = $Editor/CharactersTranslationsButton
@onready var wrap_lines_button: Button = $Editor/WrapLinesButton
@onready var default_csv_locale: LineEdit = $Editor/DefaultCSVLocale
# Runtime
@onready var include_all_responses_button: CheckBox = $Runtime/IncludeAllResponsesButton
@onready var ignore_missing_state_values: CheckBox = $Runtime/IgnoreMissingStateValues
@onready var balloon_path_input: LineEdit = $Runtime/CustomBalloon/BalloonPath
@onready var revert_balloon_button: Button = $Runtime/CustomBalloon/RevertBalloonPath
@onready var load_balloon_button: Button = $Runtime/CustomBalloon/LoadBalloonPath
@onready var states_title: Label = $Runtime/StatesTitle
@onready var globals_list: Tree = $Runtime/GlobalsList
# Advanced
@onready var check_for_updates: CheckBox = $Advanced/CheckForUpdates
@onready var include_characters_in_translations: CheckBox = $Advanced/IncludeCharactersInTranslations
@onready var include_notes_in_translations: CheckBox = $Advanced/IncludeNotesInTranslations
@onready var open_in_external_editor_button: CheckBox = $Advanced/OpenInExternalEditorButton
@onready var test_scene_path_input: LineEdit = $Advanced/CustomTestScene/TestScenePath
@onready var revert_test_scene_button: Button = $Advanced/CustomTestScene/RevertTestScene
@onready var load_test_scene_button: Button = $Advanced/CustomTestScene/LoadTestScene
@onready var custom_test_scene_file_dialog: FileDialog = $CustomTestSceneFileDialog
@onready var create_lines_for_response_characters: CheckBox = $Advanced/CreateLinesForResponseCharacters
@onready var missing_translations_button: CheckBox = $Advanced/MissingTranslationsButton
var all_globals: Dictionary = {}
var enabled_globals: Array = []
var path_target: PathTarget = PathTarget.CustomTestScene
var _default_test_scene_path: String = preload("../test_scene.tscn").resource_path
var _recompile_if_changed_settings: Dictionary
func _ready() -> void:
new_template_button.text = DialogueConstants.translate(&"settings.new_template")
characters_translations_button.text = DialogueConstants.translate(&"settings.characters_translations")
wrap_lines_button.text = DialogueConstants.translate(&"settings.wrap_long_lines")
$Editor/DefaultCSVLocaleLabel.text = DialogueConstants.translate(&"settings.default_csv_locale")
include_all_responses_button.text = DialogueConstants.translate(&"settings.include_failed_responses")
ignore_missing_state_values.text = DialogueConstants.translate(&"settings.ignore_missing_state_values")
$Runtime/CustomBalloonLabel.text = DialogueConstants.translate(&"settings.default_balloon_hint")
states_title.text = DialogueConstants.translate(&"settings.states_shortcuts")
$Runtime/StatesMessage.text = DialogueConstants.translate(&"settings.states_message")
$Runtime/StatesHint.text = DialogueConstants.translate(&"settings.states_hint")
check_for_updates.text = DialogueConstants.translate(&"settings.check_for_updates")
include_characters_in_translations.text = DialogueConstants.translate(&"settings.include_characters_in_translations")
include_notes_in_translations.text = DialogueConstants.translate(&"settings.include_notes_in_translations")
open_in_external_editor_button.text = DialogueConstants.translate(&"settings.open_in_external_editor")
$Advanced/ExternalWarning.text = DialogueConstants.translate(&"settings.external_editor_warning")
$Advanced/CustomTestSceneLabel.text = DialogueConstants.translate(&"settings.custom_test_scene")
$Advanced/RecompileWarning.text = DialogueConstants.translate(&"settings.recompile_warning")
missing_translations_button.text = DialogueConstants.translate(&"settings.missing_keys")
$Advanced/MissingTranslationsHint.text = DialogueConstants.translate(&"settings.missing_keys_hint")
create_lines_for_response_characters.text = DialogueConstants.translate(&"settings.create_lines_for_responses_with_characters")
current_tab = 0
func prepare() -> void:
_recompile_if_changed_settings = _get_settings_that_require_recompilation()
test_scene_path_input.placeholder_text = DialogueSettings.get_setting("custom_test_scene_path", _default_test_scene_path)
revert_test_scene_button.visible = test_scene_path_input.placeholder_text != _default_test_scene_path
revert_test_scene_button.icon = get_theme_icon("RotateLeft", "EditorIcons")
revert_test_scene_button.tooltip_text = DialogueConstants.translate(&"settings.revert_to_default_test_scene")
load_test_scene_button.icon = get_theme_icon("Load", "EditorIcons")
var balloon_path: String = DialogueSettings.get_setting("balloon_path", "")
if not FileAccess.file_exists(balloon_path):
DialogueSettings.set_setting("balloon_path", "")
balloon_path = ""
balloon_path_input.placeholder_text = balloon_path if balloon_path != "" else DialogueConstants.translate(&"settings.default_balloon_path")
revert_balloon_button.visible = balloon_path != ""
revert_balloon_button.icon = get_theme_icon("RotateLeft", "EditorIcons")
revert_balloon_button.tooltip_text = DialogueConstants.translate(&"settings.revert_to_default_balloon")
load_balloon_button.icon = get_theme_icon("Load", "EditorIcons")
var scale: float = Engine.get_meta("DialogueManagerPlugin").get_editor_interface().get_editor_scale()
custom_test_scene_file_dialog.min_size = Vector2(600, 500) * scale
states_title.add_theme_font_override("font", get_theme_font("bold", "EditorFonts"))
check_for_updates.set_pressed_no_signal(DialogueSettings.get_user_value("check_for_updates", true))
characters_translations_button.set_pressed_no_signal(DialogueSettings.get_setting("export_characters_in_translation", true))
wrap_lines_button.set_pressed_no_signal(DialogueSettings.get_setting("wrap_lines", false))
include_all_responses_button.set_pressed_no_signal(DialogueSettings.get_setting("include_all_responses", false))
ignore_missing_state_values.set_pressed_no_signal(DialogueSettings.get_setting("ignore_missing_state_values", false))
new_template_button.set_pressed_no_signal(DialogueSettings.get_setting("new_with_template", true))
new_template.text = DialogueSettings.get_setting("new_template", "")
new_template.visible = DialogueSettings.get_setting("new_with_template", true)
default_csv_locale.text = DialogueSettings.get_setting("default_csv_locale", "en")
missing_translations_button.set_pressed_no_signal(DialogueSettings.get_setting("missing_translations_are_errors", false))
create_lines_for_response_characters.set_pressed_no_signal(DialogueSettings.get_setting("create_lines_for_responses_with_characters", true))
include_characters_in_translations.set_pressed_no_signal(DialogueSettings.get_setting("include_character_in_translation_exports", false))
include_notes_in_translations.set_pressed_no_signal(DialogueSettings.get_setting("include_notes_in_translation_exports", false))
open_in_external_editor_button.set_pressed_no_signal(DialogueSettings.get_user_value("open_in_external_editor", false))
var editor_settings: EditorSettings = Engine.get_meta("DialogueManagerPlugin").get_editor_interface().get_editor_settings()
var external_editor: String = editor_settings.get_setting("text_editor/external/exec_path")
var use_external_editor: bool = editor_settings.get_setting("text_editor/external/use_external_editor") and external_editor != ""
if not use_external_editor:
open_in_external_editor_button.hide()
$Advanced/ExternalWarning.hide()
$Advanced/ExternalSeparator.hide()
var project = ConfigFile.new()
var err = project.load("res://project.godot")
assert(err == OK, "Could not find the project file")
all_globals.clear()
if project.has_section("autoload"):
for key in project.get_section_keys("autoload"):
if key != "DialogueManager":
all_globals[key] = project.get_value("autoload", key)
enabled_globals = DialogueSettings.get_setting("states", []).duplicate()
globals_list.clear()
var root = globals_list.create_item()
for name in all_globals.keys():
var item: TreeItem = globals_list.create_item(root)
item.set_cell_mode(0, TreeItem.CELL_MODE_CHECK)
item.set_checked(0, name in enabled_globals)
item.set_text(0, name)
item.add_button(1, get_theme_icon("Edit", "EditorIcons"))
item.set_text(2, all_globals.get(name, "").replace("*res://", "res://"))
globals_list.set_column_expand(0, false)
globals_list.set_column_custom_minimum_width(0, 250)
globals_list.set_column_expand(1, false)
globals_list.set_column_custom_minimum_width(1, 40)
globals_list.set_column_titles_visible(true)
globals_list.set_column_title(0, DialogueConstants.translate(&"settings.autoload"))
globals_list.set_column_title(1, "")
globals_list.set_column_title(2, DialogueConstants.translate(&"settings.path"))
func apply_settings_changes() -> void:
if _recompile_if_changed_settings != _get_settings_that_require_recompilation():
Engine.get_meta("DialogueCache").reimport_files()
func _get_settings_that_require_recompilation() -> Dictionary:
return DialogueSettings.get_settings([
"missing_translations_are_errors",
"create_lines_for_responses_with_characters"
])
### Signals
func _on_missing_translations_button_toggled(toggled_on: bool) -> void:
DialogueSettings.set_setting("missing_translations_are_errors", toggled_on)
func _on_characters_translations_button_toggled(toggled_on: bool) -> void:
DialogueSettings.set_setting("export_characters_in_translation", toggled_on)
func _on_wrap_lines_button_toggled(toggled_on: bool) -> void:
DialogueSettings.set_setting("wrap_lines", toggled_on)
func _on_include_all_responses_button_toggled(toggled_on: bool) -> void:
DialogueSettings.set_setting("include_all_responses", toggled_on)
func _on_globals_list_item_selected() -> void:
var item = globals_list.get_selected()
var is_checked = not item.is_checked(0)
item.set_checked(0, is_checked)
if is_checked:
enabled_globals.append(item.get_text(0))
else:
enabled_globals.erase(item.get_text(0))
DialogueSettings.set_setting("states", enabled_globals)
func _on_globals_list_button_clicked(item: TreeItem, column: int, id: int, mouse_button_index: int) -> void:
emit_signal("script_button_pressed", item.get_text(2))
func _on_sample_template_toggled(toggled_on):
DialogueSettings.set_setting("new_with_template", toggled_on)
new_template.visible = toggled_on
func _on_revert_test_scene_pressed() -> void:
DialogueSettings.set_setting("custom_test_scene_path", _default_test_scene_path)
test_scene_path_input.placeholder_text = _default_test_scene_path
revert_test_scene_button.visible = test_scene_path_input.placeholder_text != _default_test_scene_path
func _on_load_test_scene_pressed() -> void:
path_target = PathTarget.CustomTestScene
custom_test_scene_file_dialog.popup_centered()
func _on_custom_test_scene_file_dialog_file_selected(path: String) -> void:
match path_target:
PathTarget.CustomTestScene:
# Check that the test scene is a subclass of BaseDialogueTestScene
var test_scene: PackedScene = load(path)
if test_scene and test_scene.instantiate() is BaseDialogueTestScene:
DialogueSettings.set_setting("custom_test_scene_path", path)
test_scene_path_input.placeholder_text = path
revert_test_scene_button.visible = test_scene_path_input.placeholder_text != _default_test_scene_path
else:
var accept: AcceptDialog = AcceptDialog.new()
accept.dialog_text = DialogueConstants.translate(&"settings.invalid_test_scene").format({ path = path })
add_child(accept)
accept.popup_centered.call_deferred()
PathTarget.Balloon:
DialogueSettings.set_setting("balloon_path", path)
balloon_path_input.placeholder_text = path
revert_balloon_button.visible = balloon_path_input.placeholder_text != ""
func _on_ignore_missing_state_values_toggled(toggled_on: bool) -> void:
DialogueSettings.set_setting("ignore_missing_state_values", toggled_on)
func _on_default_csv_locale_text_changed(new_text: String) -> void:
DialogueSettings.set_setting("default_csv_locale", new_text)
func _on_revert_balloon_path_pressed() -> void:
DialogueSettings.set_setting("balloon_path", "")
balloon_path_input.placeholder_text = DialogueConstants.translate(&"settings.default_balloon_path")
revert_balloon_button.visible = DialogueSettings.get_setting("balloon_path", "") != ""
func _on_load_balloon_path_pressed() -> void:
path_target = PathTarget.Balloon
custom_test_scene_file_dialog.popup_centered()
func _on_create_lines_for_response_characters_toggled(toggled_on: bool) -> void:
DialogueSettings.set_setting("create_lines_for_responses_with_characters", toggled_on)
func _on_open_in_external_editor_button_toggled(toggled_on: bool) -> void:
DialogueSettings.set_user_value("open_in_external_editor", toggled_on)
func _on_include_characters_in_translations_toggled(toggled_on: bool) -> void:
DialogueSettings.set_setting("include_character_in_translation_exports", toggled_on)
func _on_include_notes_in_translations_toggled(toggled_on: bool) -> void:
DialogueSettings.set_setting("include_notes_in_translation_exports", toggled_on)
func _on_keep_up_to_date_toggled(toggled_on: bool) -> void:
DialogueSettings.set_user_value("check_for_updates", toggled_on)
func _on_new_template_focus_exited() -> void:
DialogueSettings.set_setting("new_template", new_template.text)
@@ -1,233 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://cpg4lg1r3ff6m"]
[ext_resource type="Script" path="res://addons/dialogue_manager/views/settings_view.gd" id="1_06uxa"]
[sub_resource type="Theme" id="Theme_3a8rc"]
HSeparator/constants/separation = 20
[node name="SettingsView" type="TabContainer"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = -206.0
offset_bottom = -345.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = SubResource("Theme_3a8rc")
current_tab = 0
script = ExtResource("1_06uxa")
[node name="Editor" type="VBoxContainer" parent="."]
layout_mode = 2
metadata/_tab_index = 0
[node name="NewTemplateButton" type="CheckBox" parent="Editor"]
layout_mode = 2
button_pressed = true
text = "New dialogue files will start with template text"
[node name="NewTemplate" type="CodeEdit" parent="Editor"]
custom_minimum_size = Vector2(0, 200)
layout_mode = 2
size_flags_vertical = 3
[node name="HSeparator" type="HSeparator" parent="Editor"]
layout_mode = 2
[node name="CharactersTranslationsButton" type="CheckBox" parent="Editor"]
layout_mode = 2
button_pressed = true
text = "Export character names in translation files"
[node name="WrapLinesButton" type="CheckBox" parent="Editor"]
layout_mode = 2
button_pressed = true
text = "Wrap long lines"
[node name="HSeparator2" type="HSeparator" parent="Editor"]
layout_mode = 2
[node name="DefaultCSVLocaleLabel" type="Label" parent="Editor"]
layout_mode = 2
text = "Default CSV Locale"
[node name="DefaultCSVLocale" type="LineEdit" parent="Editor"]
layout_mode = 2
[node name="Runtime" type="VBoxContainer" parent="."]
visible = false
layout_mode = 2
metadata/_tab_index = 1
[node name="IncludeAllResponsesButton" type="CheckBox" parent="Runtime"]
layout_mode = 2
text = "Include responses with failed conditions"
[node name="IgnoreMissingStateValues" type="CheckBox" parent="Runtime"]
layout_mode = 2
text = "Skip over missing state value errors (not recommended)"
[node name="HSeparator" type="HSeparator" parent="Runtime"]
layout_mode = 2
[node name="CustomBalloonLabel" type="Label" parent="Runtime"]
layout_mode = 2
text = "Custom balloon to use when calling \"DialogueManager.show_balloon()\""
[node name="CustomBalloon" type="HBoxContainer" parent="Runtime"]
layout_mode = 2
[node name="BalloonPath" type="LineEdit" parent="Runtime/CustomBalloon"]
layout_mode = 2
size_flags_horizontal = 3
focus_mode = 0
editable = false
shortcut_keys_enabled = false
middle_mouse_paste_enabled = false
[node name="RevertBalloonPath" type="Button" parent="Runtime/CustomBalloon"]
visible = false
layout_mode = 2
tooltip_text = "Revert to default test scene"
flat = true
[node name="LoadBalloonPath" type="Button" parent="Runtime/CustomBalloon"]
layout_mode = 2
[node name="HSeparator2" type="HSeparator" parent="Runtime"]
layout_mode = 2
[node name="StatesTitle" type="Label" parent="Runtime"]
layout_mode = 2
text = "State Shortcuts"
[node name="StatesMessage" type="Label" parent="Runtime"]
layout_mode = 2
text = "If an autoload is enabled here you can refer to its properties, methods, and signals without having to use its name."
[node name="StatesHint" type="Label" parent="Runtime"]
modulate = Color(1, 1, 1, 0.501961)
custom_minimum_size = Vector2(10, 0)
layout_mode = 2
text = "ie. Instead of \"SomeState.some_property\" you could just use \"some_property\""
autowrap_mode = 3
[node name="GlobalsList" type="Tree" parent="Runtime"]
layout_mode = 2
size_flags_vertical = 3
columns = 3
column_titles_visible = true
allow_reselect = true
hide_folding = true
hide_root = true
select_mode = 1
[node name="Advanced" type="VBoxContainer" parent="."]
visible = false
layout_mode = 2
metadata/_tab_index = 2
[node name="CheckForUpdates" type="CheckBox" parent="Advanced"]
layout_mode = 2
text = "Check for updates"
[node name="HSeparator" type="HSeparator" parent="Advanced"]
layout_mode = 2
[node name="IncludeCharactersInTranslations" type="CheckBox" parent="Advanced"]
layout_mode = 2
text = "Include character names in translation exports"
[node name="IncludeNotesInTranslations" type="CheckBox" parent="Advanced"]
layout_mode = 2
text = "Include notes (## comments) in translation exports"
[node name="ExternalSeparator" type="HSeparator" parent="Advanced"]
layout_mode = 2
[node name="OpenInExternalEditorButton" type="CheckBox" parent="Advanced"]
layout_mode = 2
text = "Open dialogue files in external editor"
[node name="ExternalWarning" type="Label" parent="Advanced"]
layout_mode = 2
text = "Note: Syntax highlighting and detailed error checking are not supported in external editors."
[node name="HSeparator3" type="HSeparator" parent="Advanced"]
layout_mode = 2
[node name="CustomTestSceneLabel" type="Label" parent="Advanced"]
layout_mode = 2
text = "Custom test scene (must extend BaseDialogueTestScene)"
[node name="CustomTestScene" type="HBoxContainer" parent="Advanced"]
layout_mode = 2
[node name="TestScenePath" type="LineEdit" parent="Advanced/CustomTestScene"]
layout_mode = 2
size_flags_horizontal = 3
focus_mode = 0
placeholder_text = "res://addons/dialogue_manager/test_scene.tscn"
editable = false
shortcut_keys_enabled = false
middle_mouse_paste_enabled = false
[node name="RevertTestScene" type="Button" parent="Advanced/CustomTestScene"]
visible = false
layout_mode = 2
tooltip_text = "Revert to default test scene"
flat = true
[node name="LoadTestScene" type="Button" parent="Advanced/CustomTestScene"]
layout_mode = 2
[node name="HSeparator4" type="HSeparator" parent="Advanced"]
layout_mode = 2
[node name="RecompileWarning" type="Label" parent="Advanced"]
layout_mode = 2
text = "Changing these settings will force a recompile of all dialogue. Only change them if you know what you are doing."
[node name="MissingTranslationsButton" type="CheckBox" parent="Advanced"]
layout_mode = 2
text = "Treat missing translation keys as errors"
[node name="MissingTranslationsHint" type="Label" parent="Advanced"]
modulate = Color(1, 1, 1, 0.501961)
custom_minimum_size = Vector2(10, 0)
layout_mode = 2
text = "If you are using static translation keys then having this enabled will help you find any lines that you haven't added a key to yet."
autowrap_mode = 3
[node name="CreateLinesForResponseCharacters" type="CheckBox" parent="Advanced"]
layout_mode = 2
text = "Create child dialogue line for responses with character names in them"
[node name="CustomTestSceneFileDialog" type="FileDialog" parent="."]
title = "Open a File"
ok_button_text = "Open"
file_mode = 0
filters = PackedStringArray("*.tscn ; Scene")
[connection signal="toggled" from="Editor/NewTemplateButton" to="." method="_on_sample_template_toggled"]
[connection signal="focus_exited" from="Editor/NewTemplate" to="." method="_on_new_template_focus_exited"]
[connection signal="toggled" from="Editor/CharactersTranslationsButton" to="." method="_on_characters_translations_button_toggled"]
[connection signal="toggled" from="Editor/WrapLinesButton" to="." method="_on_wrap_lines_button_toggled"]
[connection signal="text_changed" from="Editor/DefaultCSVLocale" to="." method="_on_default_csv_locale_text_changed"]
[connection signal="toggled" from="Runtime/IncludeAllResponsesButton" to="." method="_on_include_all_responses_button_toggled"]
[connection signal="toggled" from="Runtime/IgnoreMissingStateValues" to="." method="_on_ignore_missing_state_values_toggled"]
[connection signal="pressed" from="Runtime/CustomBalloon/RevertBalloonPath" to="." method="_on_revert_balloon_path_pressed"]
[connection signal="pressed" from="Runtime/CustomBalloon/LoadBalloonPath" to="." method="_on_load_balloon_path_pressed"]
[connection signal="button_clicked" from="Runtime/GlobalsList" to="." method="_on_globals_list_button_clicked"]
[connection signal="item_selected" from="Runtime/GlobalsList" to="." method="_on_globals_list_item_selected"]
[connection signal="toggled" from="Advanced/CheckForUpdates" to="." method="_on_keep_up_to_date_toggled"]
[connection signal="toggled" from="Advanced/IncludeCharactersInTranslations" to="." method="_on_include_characters_in_translations_toggled"]
[connection signal="toggled" from="Advanced/IncludeNotesInTranslations" to="." method="_on_include_notes_in_translations_toggled"]
[connection signal="toggled" from="Advanced/OpenInExternalEditorButton" to="." method="_on_open_in_external_editor_button_toggled"]
[connection signal="pressed" from="Advanced/CustomTestScene/RevertTestScene" to="." method="_on_revert_test_scene_pressed"]
[connection signal="pressed" from="Advanced/CustomTestScene/LoadTestScene" to="." method="_on_load_test_scene_pressed"]
[connection signal="toggled" from="Advanced/MissingTranslationsButton" to="." method="_on_missing_translations_button_toggled"]
[connection signal="toggled" from="Advanced/CreateLinesForResponseCharacters" to="." method="_on_create_lines_for_response_characters_toggled"]
[connection signal="file_selected" from="CustomTestSceneFileDialog" to="." method="_on_custom_test_scene_file_dialog_file_selected"]