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

138 lines
3.7 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@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()