Files
kiss-vscode/projects/_standalone/nat-godot-playground/addons/haxe/scripts/new_script.gd

158 lines
4.9 KiB
GDScript

tool
extends WindowDialog
signal create(is_load, class_value, path_value)
var base:Control
var cancel_button:Button
var create_button:Button
var class_valid := true
var path_valid := true
var name_valid := true
var name_warning := false
var extension_valid := true
var is_load := false
var class_value := ""
var path_value := ""
func setup(base:Control, class_value:String, name:String) -> void:
self.base = base
var left := $MarginContainer/VBoxContainer/Buttons/Left
var right := $MarginContainer/VBoxContainer/Buttons/Right
if OS.get_name() == "Windows" or OS.get_name() == "UWP":
setup_buttons(right, left)
else:
setup_buttons(left, right)
$MarginContainer/VBoxContainer/GridContainer/ClassValue.connect("text_changed", self, "on_class")
$MarginContainer/VBoxContainer/GridContainer/Path/PathValue.connect("text_changed", self, "on_path")
var path_button := $MarginContainer/VBoxContainer/GridContainer/Path/Load
path_button.icon = base.get_icon("Folder", "EditorIcons")
path_button.connect("button_down", self, "on_folder")
on_class(class_value)
on_path("res://scripts/" + name.substr(0, 1).to_upper() + name.substr(1) + ".hx")
func setup_buttons(cancel:Button, create:Button) -> void:
cancel.text = "Cancel"
cancel.connect("button_down", self, "on_cancel")
cancel_button = cancel
create.text = "Create"
create.connect("button_down", self, "on_create")
create_button = create
func on_cancel() -> void:
hide()
func on_create() -> void:
hide()
emit_signal("create", is_load, class_value, path_value)
func on_class(value:String) -> void:
class_value = value
class_valid = ClassDB.class_exists(value) and ClassDB.can_instance(value)
revalidate()
func on_folder() -> void:
var file := path_value
file = file.substr(file.find_last("/") + 1)
var dialog := EditorFileDialog.new()
base.add_child(dialog)
dialog.access = EditorFileDialog.ACCESS_RESOURCES
dialog.current_dir = "res://scripts/"
dialog.current_file = file
dialog.disable_overwrite_warning = true
dialog.theme = base.theme
dialog.window_title = "Open Haxe Script / Choose Location"
dialog.add_filter("*.hx ; Haxe script")
dialog.connect("file_selected", self, "on_path")
dialog.get_ok().text = "Open"
dialog.popup_centered_ratio()
func on_path(fullpath:String) -> void:
path_value = fullpath
var dir_p := fullpath.find_last("/")
var ext_p := fullpath.find_last(".")
var path := ""
var file := ""
if dir_p < ext_p:
path = fullpath.substr(0, dir_p)
file = fullpath.substr(dir_p + 1)
else:
path = fullpath
var d := Directory.new()
var f := File.new()
is_load = f.file_exists(path_value)
extension_valid = file.ends_with(".hx")
name_valid = ext_p < fullpath.length() - 1 and ext_p > dir_p + 1
name_warning = name_valid && extension_valid && isBuiltin(file.substr(0, file.length() - 3))
path_valid = path.begins_with("res://") and d.dir_exists(path)
revalidate()
func isBuiltin(name:String) -> bool:
var haxeGodotBuiltins = ["Action", "CustomSignal", "CustomSignalUsings", "Godot", "Nullable1", "Signal", "SignalUsings", "Utils"]
return ClassDB.class_exists(name) or haxeGodotBuiltins.has(name)
func revalidate() -> void:
var text_edit := $MarginContainer/VBoxContainer/TextEdit
text_edit.bbcode_text = ""
var valid_color := Color(0.062775, 0.730469, 0.062775)
var error_color := Color(0.820312, 0.028839, 0.028839)
var warning_color := Color(0.9375, 0.537443, 0.06958)
if not class_valid:
text_edit.push_color(error_color)
text_edit.append_bbcode("- Invalid inherited parent name.\n\n")
text_edit.pop()
elif not extension_valid:
text_edit.push_color(error_color)
text_edit.append_bbcode("- Invalid extension.\n\n")
text_edit.pop()
elif not path_valid:
text_edit.push_color(error_color)
text_edit.append_bbcode("- Invalid path.\n\n")
text_edit.pop()
elif not name_valid:
text_edit.push_color(error_color)
text_edit.append_bbcode("- Invalid filename.\n\n")
text_edit.pop()
else:
text_edit.push_color(valid_color)
text_edit.append_bbcode("- Haxe script path is valid.\n\n")
if is_load:
text_edit.append_bbcode("- Will load an existing Haxe script.\n\n")
else:
text_edit.append_bbcode("- Will create a new Haxe script.\n\n")
text_edit.pop()
if name_warning:
text_edit.push_color(warning_color)
text_edit.append_bbcode("Warning: Having the script name be the same as a built-in type is usually not desired.\n\n")
text_edit.pop()
var class_edit:LineEdit = $MarginContainer/VBoxContainer/GridContainer/ClassValue
var class_edit_column := class_edit.caret_position
class_edit.text = class_value
class_edit.caret_position = class_edit_column if class_edit_column <= class_value.length() else class_value.length()
var path_edit:LineEdit = $MarginContainer/VBoxContainer/GridContainer/Path/PathValue
var path_edit_column := path_edit.caret_position
path_edit.text = path_value
path_edit.caret_position = path_edit_column if path_edit_column <= path_value.length() else path_value.length()