DCDictionaryProcessorGD/dictionary_window.gd

159 lines
4.8 KiB
GDScript3
Raw Permalink Normal View History

2025-07-13 18:41:41 +00:00
@tool
extends AcceptDialog
var source_file_path: String = ""
var regex = RegEx.new()
func _ready():
title = "Dictionary Processor"
size = Vector2(600, 700)
regex.compile("^[a-z]+$")
var vbox = VBoxContainer.new()
add_child(vbox)
vbox.add_child(_create_label("Source Dictionary", 14))
var file_button = Button.new()
file_button.text = "Select File"
file_button.pressed.connect(_show_file_dialog)
vbox.add_child(file_button)
vbox.add_child(_create_label("Filtering Options", 14))
var grid = GridContainer.new()
grid.columns = 2
vbox.add_child(grid)
grid.add_child(Label.new())
grid.get_child(-1).text = "Min Word Length"
var min_spinner = _create_spinner(1, 10, 3)
grid.add_child(min_spinner)
grid.add_child(Label.new())
grid.get_child(-1).text = "Max Word Length"
var max_spinner = _create_spinner(1, 15, 6)
grid.add_child(max_spinner)
vbox.add_child(_create_label("Output Settings", 14))
var output_container = HBoxContainer.new()
vbox.add_child(output_container)
output_container.add_child(Label.new())
output_container.get_child(-1).text = "Output File Name:"
var output_field = LineEdit.new()
output_field.text = "FilteredDictionary"
output_field.size_flags_horizontal = Control.SIZE_EXPAND_FILL
output_container.add_child(output_field)
var button_container = HBoxContainer.new()
vbox.add_child(button_container)
var preview_button = Button.new()
preview_button.text = "Preview"
button_container.add_child(preview_button)
var process_button = Button.new()
process_button.text = "Process & Save"
button_container.add_child(process_button)
var stats_label = Label.new()
vbox.add_child(stats_label)
vbox.add_child(_create_label("Preview (first 50 words)", 14))
var preview_label = RichTextLabel.new()
preview_label.custom_minimum_size = Vector2(0, 200)
preview_label.size_flags_vertical = Control.SIZE_EXPAND_FILL
vbox.add_child(preview_label)
preview_button.pressed.connect(func():
var result = _process_file(min_spinner.value, max_spinner.value)
if result:
_display_results(result, stats_label, preview_label, false))
process_button.pressed.connect(func():
var result = _process_file(min_spinner.value, max_spinner.value)
if result:
_save_results(result, output_field.text)
_display_results(result, stats_label, preview_label, true))
func _create_label(text: String, font_size: int = 0) -> Label:
var label = Label.new()
label.text = text
if font_size > 0:
label.add_theme_font_size_override("font_size", font_size)
return label
func _create_spinner(min_val: float, max_val: float, default: float) -> SpinBox:
var spinner = SpinBox.new()
spinner.min_value = min_val
spinner.max_value = max_val
spinner.value = default
return spinner
func _show_file_dialog():
var dialog = FileDialog.new()
dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
dialog.add_filter("*.txt", "Text Files")
dialog.file_selected.connect(func(path):
source_file_path = path
print("Selected dictionary file: ", path)
dialog.queue_free())
dialog.canceled.connect(dialog.queue_free)
EditorInterface.get_editor_main_screen().add_child(dialog)
dialog.popup_centered(Vector2i(800, 600))
func _process_file(min_len: int, max_len: int) -> Dictionary:
if source_file_path.is_empty():
printerr("No source file selected")
return {}
var file = FileAccess.open(source_file_path, FileAccess.READ)
if not file:
printerr("Failed to open file: " + source_file_path)
return {}
var content = file.get_as_text()
file.close()
var lines = content.split("\n")
var unique_words = {}
for line in lines:
var word = line.strip_edges().to_lower()
if word.length() >= min_len and word.length() <= max_len and regex.search(word):
unique_words[word] = true
var filtered: Array[String] = []
filtered.assign(unique_words.keys())
filtered.sort()
return {"original": lines.size(), "filtered": filtered}
func _save_results(result: Dictionary, filename: String):
if not DirAccess.dir_exists_absolute("res://data/"):
DirAccess.open("res://").make_dir("data")
var path = "res://data/" + filename + ".txt"
var file = FileAccess.open(path, FileAccess.WRITE)
if not file:
printerr("Failed to write output file")
return
file.store_string("\n".join(result.filtered))
file.close()
print("Dictionary processing complete: %d words saved to: %s" % [result.filtered.size(), path])
func _display_results(result: Dictionary, stats: Label, preview: RichTextLabel, saved: bool):
var percentage = float(result.filtered.size()) / float(result.original) * 100.0 if result.original > 0 else 0.0
stats.text = "Original: %d words\nFiltered: %d words (%.1f%% kept)%s" % [
result.original,
result.filtered.size(),
percentage,
" - Saved!" if saved else ""
]
var preview_text = "\n".join(result.filtered.slice(0, 50))
if result.filtered.size() > 50:
preview_text += "\n... and %d more words" % (result.filtered.size() - 50)
preview.text = preview_text