mirror of
https://github.com/Relintai/utilities_gamedev.git
synced 2024-11-14 10:37:19 +01:00
295 lines
6.4 KiB
GDScript
295 lines
6.4 KiB
GDScript
tool
|
|
extends Control
|
|
|
|
signal inspect_data
|
|
|
|
export(PackedScene) var resource_row_scene : PackedScene
|
|
export(PackedScene) var history_row_scene : PackedScene
|
|
|
|
export(NodePath) var entry_container_path : NodePath
|
|
|
|
export(NodePath) var name_popup_path : NodePath
|
|
export(NodePath) var create_popup_path : NodePath
|
|
export(NodePath) var delete_popup_path : NodePath
|
|
|
|
export(NodePath) var history_container_path : NodePath
|
|
|
|
var _filter_term : String
|
|
|
|
var _entry_container : Node
|
|
var _name_popup : Node
|
|
var _create_popup : ConfirmationDialog
|
|
var _delete_popup : ConfirmationDialog
|
|
|
|
var _history_container : Node
|
|
|
|
var _folder : String
|
|
var _resource_type : String
|
|
|
|
var _queue_deleted : Resource
|
|
|
|
var _state : Dictionary
|
|
var _states : Dictionary
|
|
|
|
func _ready():
|
|
_history_container = get_node(history_container_path)
|
|
|
|
_entry_container = get_node(entry_container_path)
|
|
_name_popup = get_node(name_popup_path)
|
|
_name_popup.connect("ok_pressed", self, "ok_pressed")
|
|
|
|
_create_popup = get_node(create_popup_path)
|
|
_delete_popup = get_node(delete_popup_path)
|
|
|
|
func set_resource_type(folder : String, resource_type : String) -> void:
|
|
if !folder.ends_with("/"):
|
|
folder += "/"
|
|
|
|
if folder == _folder and _resource_type == resource_type:
|
|
return
|
|
|
|
_states[_folder + "," + _resource_type] = _state
|
|
|
|
if _states.has(folder + "," + resource_type):
|
|
_state = _states[folder + "," + resource_type]
|
|
else:
|
|
_state = Dictionary()
|
|
|
|
_folder = folder
|
|
_resource_type = resource_type
|
|
|
|
# _filter_term = ""
|
|
|
|
_create_popup.set_resource_type(resource_type)
|
|
|
|
refresh()
|
|
|
|
func refresh() -> void:
|
|
for ch in _entry_container.get_children():
|
|
ch.queue_free()
|
|
|
|
var dir : Directory = Directory.new()
|
|
|
|
if dir.open(_folder) == OK:
|
|
dir.list_dir_begin()
|
|
var data_array : Array = Array()
|
|
|
|
var file_name = dir.get_next()
|
|
|
|
while (file_name != ""):
|
|
if not dir.current_is_dir():
|
|
|
|
if ResourceLoader.exists(_folder + file_name, _resource_type):
|
|
|
|
var res = ResourceLoader.load(_folder + file_name, _resource_type)
|
|
|
|
if _filter_term != "":
|
|
var ftext : String = ""
|
|
|
|
if res.has_method("get_text_name"):
|
|
ftext = res.get_text_name()
|
|
|
|
if ftext == "":
|
|
if res.resource_name != "":
|
|
ftext = res.resource_name
|
|
else:
|
|
ftext = res.resource_path
|
|
|
|
ftext = ftext.to_lower()
|
|
|
|
if ftext.find(_filter_term) == -1:
|
|
file_name = dir.get_next()
|
|
continue
|
|
|
|
var id : int = 0
|
|
|
|
if res.has_method("get_id"):
|
|
id = res.get_id()
|
|
|
|
data_array.append({
|
|
"id": id,
|
|
"resource": res
|
|
})
|
|
|
|
file_name = dir.get_next()
|
|
|
|
data_array.sort_custom(self, "sort_entries")
|
|
|
|
for d in data_array:
|
|
|
|
var resn : Node = resource_row_scene.instance()
|
|
|
|
_entry_container.add_child(resn)
|
|
resn.owner = _entry_container
|
|
resn.set_resource(d["resource"])
|
|
resn.connect("inspect_data", self, "inspect_data")
|
|
resn.connect("duplicate", self, "duplicate_data")
|
|
resn.connect("delete", self, "delete")
|
|
|
|
func inspect_data(var data : Resource) -> void:
|
|
var found : bool = false
|
|
|
|
for ch in _history_container.get_children():
|
|
if ch.data == data:
|
|
found = true
|
|
|
|
_history_container.move_child(ch, 0)
|
|
|
|
break
|
|
|
|
if not found:
|
|
var n : Node = history_row_scene.instance()
|
|
|
|
_history_container.add_child(n)
|
|
_history_container.move_child(n, 0)
|
|
n.owner = _history_container
|
|
|
|
n.data = data
|
|
n.connect("history_entry_selected", self, "inspect_data")
|
|
|
|
if _history_container.get_child_count() > 20:
|
|
var ch : Node = _history_container.get_child(_history_container.get_child_count() - 1)
|
|
|
|
ch.queue_free()
|
|
|
|
emit_signal("inspect_data", data)
|
|
|
|
func ok_pressed(res_name: String, pclass_name: String) -> void:
|
|
|
|
var d : Directory = Directory.new()
|
|
|
|
if d.open(_folder) == OK:
|
|
d.list_dir_begin()
|
|
|
|
var file_name = d.get_next()
|
|
|
|
var max_ind : int = 0
|
|
|
|
while (file_name != ""):
|
|
|
|
if not d.current_is_dir():
|
|
|
|
var curr_ind : int = int(file_name.split("_")[0])
|
|
|
|
if curr_ind > max_ind:
|
|
max_ind = curr_ind
|
|
|
|
file_name = d.get_next()
|
|
|
|
max_ind += 1
|
|
|
|
var newfname : String = str(res_name)
|
|
newfname = newfname.replace(" ", "_")
|
|
newfname = newfname.to_lower()
|
|
newfname = str(max_ind) + "_" + newfname + ".tres"
|
|
|
|
var res : Resource = null
|
|
|
|
if ClassDB.class_exists(pclass_name) and ClassDB.can_instance(pclass_name):
|
|
res = ClassDB.instance(pclass_name)
|
|
else:
|
|
var gsc : Array = ProjectSettings.get("_global_script_classes")
|
|
|
|
for i in range(gsc.size()):
|
|
var gsce : Dictionary = gsc[i] as Dictionary
|
|
|
|
if gsce["class"] == pclass_name:
|
|
var script : Script = load(gsce["path"])
|
|
|
|
res = script.new()
|
|
|
|
break
|
|
|
|
if res == null:
|
|
print("ESSData: Error in creating resource type " + pclass_name)
|
|
return
|
|
|
|
if res.has_method("set_id"):
|
|
res.set_id(max_ind)
|
|
|
|
if res.has_method("set_text_name"):
|
|
res.set_text_name(str(res_name))
|
|
|
|
ResourceSaver.save(_folder + newfname, res)
|
|
|
|
refresh()
|
|
|
|
func duplicate_data(data):
|
|
if not data is Resource:
|
|
return
|
|
|
|
var d : Directory = Directory.new()
|
|
|
|
if d.open(_folder) == OK:
|
|
d.list_dir_begin()
|
|
|
|
var file_name = d.get_next()
|
|
|
|
var max_ind : int = 0
|
|
|
|
while (file_name != ""):
|
|
|
|
if not d.current_is_dir():
|
|
|
|
var curr_ind : int = int(file_name.split("_")[0])
|
|
|
|
if curr_ind > max_ind:
|
|
max_ind = curr_ind
|
|
|
|
file_name = d.get_next()
|
|
|
|
max_ind += 1
|
|
|
|
var res_name : String = ""
|
|
|
|
if data.has_method("get_text_name"):
|
|
res_name = data.get_text_name()
|
|
|
|
var newfname : String = res_name
|
|
newfname = newfname.replace(" ", "_")
|
|
newfname = newfname.to_lower()
|
|
newfname = str(max_ind) + "_" + newfname + ".tres"
|
|
|
|
var res : Resource = data.duplicate()
|
|
|
|
if res.has_method("set_id"):
|
|
res.set_id(max_ind)
|
|
|
|
if res.has_method("set_text_name"):
|
|
res.set_text_name(str(res_name))
|
|
|
|
ResourceSaver.save(_folder + newfname, res)
|
|
|
|
refresh()
|
|
|
|
func delete(data):
|
|
if data == null or data as Resource == null:
|
|
return
|
|
|
|
_queue_deleted = data as Resource
|
|
|
|
_delete_popup.popup_centered()
|
|
|
|
func delete_confirm():
|
|
if _queue_deleted == null:
|
|
return
|
|
|
|
var d : Directory = Directory.new()
|
|
d.remove(_queue_deleted.resource_path)
|
|
|
|
_queue_deleted = null
|
|
|
|
refresh()
|
|
|
|
func clear_history() -> void:
|
|
for ch in _history_container.get_children():
|
|
ch.queue_free()
|
|
|
|
func search(text : String) -> void:
|
|
_filter_term = text.to_lower()
|
|
|
|
refresh()
|
|
|
|
func sort_entries(a, b):
|
|
return a["id"] < b["id"]
|