gfolf2/addons/terrain_3d/src/directory_setup.gd

117 lines
3.8 KiB
GDScript3
Raw Normal View History

2024-11-17 19:47:37 +00:00
extends Node
const DIRECTORY_SETUP: String = "res://addons/terrain_3d/src/directory_setup.tscn"
var plugin: EditorPlugin
var dialog: ConfirmationDialog
var select_dir_btn: Button
var selected_dir_le: LineEdit
var select_upg_btn: Button
var upgrade_file_le: LineEdit
var editor_file_dialog: EditorFileDialog
func _init() -> void:
editor_file_dialog = EditorFileDialog.new()
editor_file_dialog.set_filters(PackedStringArray(["*.res"]))
editor_file_dialog.set_file_mode(EditorFileDialog.FILE_MODE_SAVE_FILE)
editor_file_dialog.access = EditorFileDialog.ACCESS_RESOURCES
editor_file_dialog.ok_button_text = "Open"
editor_file_dialog.title = "Open a folder or file"
editor_file_dialog.file_selected.connect(_on_file_selected)
editor_file_dialog.dir_selected.connect(_on_dir_selected)
editor_file_dialog.size = Vector2i(850, 550)
editor_file_dialog.transient = false
editor_file_dialog.exclusive = false
editor_file_dialog.popup_window = true
add_child(editor_file_dialog)
func directory_setup_popup() -> void:
dialog = load(DIRECTORY_SETUP).instantiate()
dialog.hide()
# Nodes
select_dir_btn = dialog.get_node("Margin/VBox/DirHBox/SelectDir")
selected_dir_le = dialog.get_node("Margin/VBox/DirHBox/LineEdit")
select_upg_btn = dialog.get_node("Margin/VBox/UpgradeHBox/SelectResFile")
upgrade_file_le = dialog.get_node("Margin/VBox/UpgradeHBox/LineEdit")
upgrade_file_le.text = ""
if plugin.terrain.data_directory:
selected_dir_le.text = plugin.terrain.data_directory
if plugin.terrain.storage:
upgrade_file_le.text = plugin.terrain.storage.get_path()
# Icons
plugin.ui.set_button_editor_icon(select_upg_btn, "Folder")
plugin.ui.set_button_editor_icon(select_dir_btn, "Folder")
#Signals
select_upg_btn.pressed.connect(_on_select_file_pressed.bind(EditorFileDialog.FILE_MODE_OPEN_FILE))
select_dir_btn.pressed.connect(_on_select_file_pressed.bind(EditorFileDialog.FILE_MODE_OPEN_DIR))
dialog.confirmed.connect(_on_close_requested)
dialog.canceled.connect(_on_close_requested)
dialog.get_ok_button().pressed.connect(_on_ok_pressed)
# Popup
EditorInterface.popup_dialog_centered(dialog)
func _on_close_requested() -> void:
dialog.queue_free()
dialog = null
func _on_select_file_pressed(file_mode: EditorFileDialog.FileMode) -> void:
editor_file_dialog.file_mode = file_mode
editor_file_dialog.popup_centered()
func _on_dir_selected(path: String) -> void:
selected_dir_le.text = path
func _on_file_selected(path: String) -> void:
upgrade_file_le.text = path
func _on_ok_pressed() -> void:
if not plugin.terrain:
push_error("Not connected terrain. Click the Terrain3D node first")
return
if selected_dir_le.text.is_empty():
push_error("No data directory specified")
return
if not DirAccess.dir_exists_absolute(selected_dir_le.text):
push_error("Directory doesn't exist: ", selected_dir_le.text)
return
# Check if directory empty of terrain files
var data_found: bool = false
var files: Array = DirAccess.get_files_at(selected_dir_le.text)
for file in files:
if file.begins_with("terrain3d") || file.ends_with(".res"):
data_found = true
break
print("Setting terrain directory: ", selected_dir_le.text)
plugin.terrain.data_directory = selected_dir_le.text
if not upgrade_file_le.text.is_empty():
if data_found:
push_warning("Target directory already has terrain data. Specify an empty directory to upgrade")
return
if not FileAccess.file_exists(upgrade_file_le.text):
push_error("File doesn't exist: ", upgrade_file_le.text)
return
if not plugin.terrain.storage or \
( plugin.terrain.storage and plugin.terrain.storage.get_path() != upgrade_file_le.text):
print("Loading storage file: ", upgrade_file_le.text)
plugin.terrain.set_storage(load(upgrade_file_le.text))
if plugin.terrain.storage:
print("Begining upgrade of: ", upgrade_file_le.text)
plugin.terrain.split_storage()