godot-plateformer/addons/reedscene/dock/SceneIDMainPanel.gd

138 lines
3.7 KiB
GDScript3
Raw Normal View History

2026-01-02 18:37:09 +08:00
@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()