138 lines
3.7 KiB
GDScript3
138 lines
3.7 KiB
GDScript3
|
|
@tool
|
|||
|
|
extends Control
|
|||
|
|
|
|||
|
|
@onready var grid: GridContainer = %GC_Rows
|
|||
|
|
@onready var refresh_btn: Button = %BRefresh
|
|||
|
|
|
|||
|
|
const DB_PATH := "res://addons/reedscene/demo/data_base/GLOBAL_SCENE_ID.tres"
|
|||
|
|
|
|||
|
|
func _ready() -> void:
|
|||
|
|
refresh_btn.pressed.connect(_reload)
|
|||
|
|
#_reload()
|
|||
|
|
|
|||
|
|
func _notification(what: int) -> void:
|
|||
|
|
# 切回该主屏时自动刷新(可选,但很实用)
|
|||
|
|
if what == NOTIFICATION_VISIBILITY_CHANGED and visible:
|
|||
|
|
pass
|
|||
|
|
#_reload()
|
|||
|
|
|
|||
|
|
func _reload() -> void:
|
|||
|
|
_clear_grid()
|
|||
|
|
_build_header()
|
|||
|
|
|
|||
|
|
var db = load(DB_PATH)
|
|||
|
|
if db == null:
|
|||
|
|
# 没 DB 就只显示表头,避免空白
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
# 假设 db.entries: Array[SceneIDEntry],且 entry.scene_uid / entry.scene_id 存在
|
|||
|
|
for entry in db.entries:
|
|||
|
|
_add_row(entry)
|
|||
|
|
|
|||
|
|
func _clear_grid() -> void:
|
|||
|
|
for c in grid.get_children():
|
|||
|
|
c.queue_free()
|
|||
|
|
|
|||
|
|
func _build_header() -> void:
|
|||
|
|
grid.columns = 5
|
|||
|
|
_add_header_cell("ID")
|
|||
|
|
_add_header_cell("Name")
|
|||
|
|
_add_header_cell("UID")
|
|||
|
|
_add_header_cell("Path")
|
|||
|
|
_add_header_cell("Function")
|
|||
|
|
|
|||
|
|
func _add_header_cell(text: String) -> void:
|
|||
|
|
var l := Label.new()
|
|||
|
|
l.text = text
|
|||
|
|
l.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
|||
|
|
l.clip_text = true
|
|||
|
|
grid.add_child(l)
|
|||
|
|
|
|||
|
|
func _add_row(entry) -> void:
|
|||
|
|
var uid_text: String = entry.scene_uid
|
|||
|
|
var uid_id := ResourceUID.text_to_id(uid_text)
|
|||
|
|
|
|||
|
|
var path := ""
|
|||
|
|
if uid_id != ResourceUID.INVALID_ID:
|
|||
|
|
path = ResourceUID.get_id_path(uid_id)
|
|||
|
|
|
|||
|
|
var name := path.get_file().get_basename() if path != "" else "(missing)"
|
|||
|
|
|
|||
|
|
# 1) ID
|
|||
|
|
grid.add_child(_cell_label(str(entry.scene_id)))
|
|||
|
|
# 2) Name
|
|||
|
|
grid.add_child(_cell_label(name))
|
|||
|
|
# 3) UID
|
|||
|
|
grid.add_child(_cell_label(uid_text))
|
|||
|
|
# 4) Path(先显示,后面你想隐藏我们再做)
|
|||
|
|
grid.add_child(_cell_label(path))
|
|||
|
|
# 5) Function(真按钮)
|
|||
|
|
grid.add_child(_function_cell(uid_text))
|
|||
|
|
|
|||
|
|
func _cell_label(text: String) -> Control:
|
|||
|
|
var l := Label.new()
|
|||
|
|
l.text = text
|
|||
|
|
l.clip_text = true
|
|||
|
|
l.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
|||
|
|
return l
|
|||
|
|
|
|||
|
|
func _function_cell(uid_text: String) -> Control:
|
|||
|
|
var box := HBoxContainer.new()
|
|||
|
|
box.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
|||
|
|
|
|||
|
|
## 打開場景所使用的函數
|
|||
|
|
var reveal_btn := Button.new()
|
|||
|
|
reveal_btn.text = "Show"
|
|||
|
|
reveal_btn.tooltip_text = "Reveal in FileSystem"
|
|||
|
|
reveal_btn.pressed.connect(func():
|
|||
|
|
_reveal_scene_in_filesystem_by_uid(uid_text)
|
|||
|
|
)
|
|||
|
|
box.add_child(reveal_btn)
|
|||
|
|
|
|||
|
|
# Delete 先做占位,下一步再落地到 Resource 修改/保存
|
|||
|
|
var del_btn := Button.new()
|
|||
|
|
del_btn.text = "Delete"
|
|||
|
|
del_btn.pressed.connect(func():
|
|||
|
|
print("[SceneID] TODO delete: ", uid_text)
|
|||
|
|
)
|
|||
|
|
box.add_child(del_btn)
|
|||
|
|
|
|||
|
|
return box
|
|||
|
|
|
|||
|
|
func _open_scene_by_uid(uid_text: String) -> void:
|
|||
|
|
var uid_id := ResourceUID.text_to_id(uid_text)
|
|||
|
|
if uid_id == ResourceUID.INVALID_ID:
|
|||
|
|
push_warning("[SceneID] Invalid UID: %s" % uid_text)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
var path := ResourceUID.get_id_path(uid_id)
|
|||
|
|
if path == "" or not ResourceLoader.exists(path):
|
|||
|
|
push_warning("[SceneID] Scene not found for UID: %s" % uid_text)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
EditorInterface.open_scene_from_path(path)
|
|||
|
|
|
|||
|
|
## 打開文件管理系統裏的Scene
|
|||
|
|
func _reveal_in_filesystem(path: String) -> void:
|
|||
|
|
# FileSystemDock 才有 navigate_to_path
|
|||
|
|
var dock := EditorInterface.get_file_system_dock()
|
|||
|
|
dock.navigate_to_path(path)
|
|||
|
|
|
|||
|
|
## 通過UID打開文件管理系統裏的Scene
|
|||
|
|
func _reveal_scene_in_filesystem_by_uid(uid_text: String) -> void:
|
|||
|
|
var uid_id := ResourceUID.text_to_id(uid_text)
|
|||
|
|
if uid_id == ResourceUID.INVALID_ID:
|
|||
|
|
push_warning("[SceneID] Invalid UID: %s" % uid_text)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
var path := ResourceUID.get_id_path(uid_id)
|
|||
|
|
if path == "" or not ResourceLoader.exists(path):
|
|||
|
|
push_warning("[SceneID] Scene not found for UID: %s" % uid_text)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
var dock := EditorInterface.get_file_system_dock()
|
|||
|
|
dock.navigate_to_path(path)
|
|||
|
|
|
|||
|
|
func on_activated() -> void:
|
|||
|
|
_reload()
|