diff --git a/.gitignore b/.gitignore index ddc5aab..8544dcb 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ /DScript/DScript_Compiler_Test/obj /DScript/DScript_Runtime/Backups /DScript/DScript.sln.DotSettings.user -**/.idea \ No newline at end of file +**/.idea +**/~$* \ No newline at end of file diff --git a/DungeonShooting_Config/Weapon.xlsx b/DungeonShooting_Config/Weapon.xlsx new file mode 100644 index 0000000..83effa6 --- /dev/null +++ b/DungeonShooting_Config/Weapon.xlsx Binary files differ diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old b/DungeonShooting_Godot/DungeonShooting.csproj.old deleted file mode 100644 index 69ed320..0000000 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old +++ /dev/null @@ -1,11 +0,0 @@ - - - net6.0 - true - - - - - - - \ No newline at end of file diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old.1 b/DungeonShooting_Godot/DungeonShooting.csproj.old.1 deleted file mode 100644 index 702df32..0000000 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old.1 +++ /dev/null @@ -1,11 +0,0 @@ - - - net6.0 - true - - - - - - - \ No newline at end of file diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old.2 b/DungeonShooting_Godot/DungeonShooting.csproj.old.2 deleted file mode 100644 index 69ed320..0000000 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old.2 +++ /dev/null @@ -1,11 +0,0 @@ - - - net6.0 - true - - - - - - - \ No newline at end of file diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old.3 b/DungeonShooting_Godot/DungeonShooting.csproj.old.3 deleted file mode 100644 index 4546f15..0000000 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old.3 +++ /dev/null @@ -1,11 +0,0 @@ - - - net6.0 - true - - - - - - - \ No newline at end of file diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old.4 b/DungeonShooting_Godot/DungeonShooting.csproj.old.4 deleted file mode 100644 index 69ed320..0000000 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old.4 +++ /dev/null @@ -1,11 +0,0 @@ - - - net6.0 - true - - - - - - - \ No newline at end of file diff --git a/DungeonShooting_Godot/DungeonShooting.csproj.old.5 b/DungeonShooting_Godot/DungeonShooting.csproj.old.5 deleted file mode 100644 index 4546f15..0000000 --- a/DungeonShooting_Godot/DungeonShooting.csproj.old.5 +++ /dev/null @@ -1,11 +0,0 @@ - - - net6.0 - true - - - - - - - \ No newline at end of file diff --git a/DungeonShooting_Godot/addons/script_comment_menu/data_util.gd b/DungeonShooting_Godot/addons/script_comment_menu/data_util.gd deleted file mode 100644 index 768c46b..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/data_util.gd +++ /dev/null @@ -1,310 +0,0 @@ -#============================================================ -# Data Util -#============================================================ -# - datetime: 2022-12-21 21:19:10 -#============================================================ -## 数据工具 -## -##用作全局获取数据使用 -class_name ScriptCommentMenu_DataUtil - - -## 获取场景树 [SceneTree] 对象的 meta 数据作为单例数据,如果返回的数据为 [code]null[/code] 则会在下次继续调用这个 -##default 回调方法,直到返回的数据不为 [code]null[/code] 为止 -##[br] -##[br][code]meta_key[/code] 数据key -##[br][code]default[/code] 如果没有这个key,则默认返回的数据 -##[br][code]ignore_null[/code] 忽略 null 值。如果为 true,则在默认值为 null 的时候不记录到元数据,直到有数据为止 -static func get_meta_data(meta_key: StringName, default: Callable, ignore_null: bool = true): - if Engine.has_meta(meta_key) and Engine.get_meta(meta_key) != null: - return Engine.get_meta(meta_key) - else: - var value = default.call() - if ignore_null: - if value != null: - set_meta_data(meta_key, value) - else: - set_meta_data(meta_key, value) - - return value - - -## 设置数据 -##[br] -##[br][code]meta_key[/code] 数据key -##[br][code]value[/code] 设置的值 -static func set_meta_data(meta_key: StringName, value): - Engine.set_meta(meta_key, value) - - -## 是否有这个 key 的据 -static func has_meta_data(meta_key: StringName) -> bool: - return Engine.has_meta(meta_key) - - -## 移除数据 -static func remove_meta_data(meta_key: StringName) -> bool: - if Engine.has_meta(meta_key): - Engine.remove_meta(meta_key) - return true - return false - - -## 移除所有meta数据 -static func clear_all_meta() -> void: - for key in Engine.get_meta_list(): - Engine.remove_meta(key) - - -## 获取 Dictionary 数据 -static func get_meta_dict_data(meta_key: StringName, default: Dictionary = {}) -> Dictionary: - if Engine.has_meta(meta_key): - return Engine.get_meta(meta_key) - else: - Engine.set_meta(meta_key, default) - return default - - -## 获取 Array 数据 -static func get_meta_array_data(meta_key: StringName, default: Array = []) -> Array: - if Engine.has_meta(meta_key): - return Engine.get_meta(meta_key) - else: - Engine.set_meta(meta_key, default) - return default - - -## 获取目标的默认数据,以目标对象作为基础存储数据 -static func get_object_data(object: Object, key: StringName, default: Callable ): - if object.has_meta(key): - return object.get_meta(key) - else: - var data = default.call() - object.set_meta(key, data) - return data - - -## 获取标 [Dictionary] 类型数据 -static func get_object_dict_data(object: Object, key: StringName, default: Dictionary = {}) -> Dictionary: - return get_object_data(object, key, func(): return default) - - -class _ClassInfo: - var _type : int = TYPE_NIL - var _class_name : StringName = &"" - var _script : Script = null - - func _to_string(): - return str({ - "_type": _type, - "_class_name": _class_name, - "_script": _script, - }) - - -## 获取类的数据 -##[br] -##[br][code]_class[/code] 类型。这个值可以是类名称,也可以是 [int] 类的数据型枚举的值。最大 -## [constant TYPE_MAX],最小 [constant TYPE_NIL] -##[br][code]return[/code] 返回这个类的信息 -static func get_class_info(_class) -> _ClassInfo: - var map = get_meta_dict_data("DataUtil_get_type_cache_data_for_array", {}) - if map.has(_class): - return map[_class] as _ClassInfo - - else: - var type : int = TYPE_NIL - var _class_name : StringName = &"" - var script = null - if _class is Script: - type = TYPE_OBJECT - _class_name = _class.get_instance_base_type() - script = _class - elif _class is int and _class > 0 and _class < TYPE_MAX: - type = _class - _class = ScriptCommentMenu_ScriptUtil.get_type_name(_class) - elif _class is Object: - var _class_type_ = str(_class) - if _class_type_.contains("GDScriptNativeClass"): - var obj = _class.new() - type = typeof(obj) - _class_name = obj.get_class() - else: - type = TYPE_OBJECT - _class_name = "Object" - elif _class is String: - if ScriptCommentMenu_ScriptUtil.is_base_data_type(_class): - type = ScriptCommentMenu_ScriptUtil.get_type_of(_class) - _class = ScriptCommentMenu_ScriptUtil.get_built_in_class(_class) - else: - type = TYPE_OBJECT - - var data = _ClassInfo.new() - data._type = type - data._class_name = _class_name - data._script = script - map[_class] = data - return data - - -## 获取类型化数组 -##[br] -##[br][code]_class[/code] 数据的类型。比如 [code]"Dictionary", Node, Sprite2D[/code] 等类名(基础数据类型需要加双引号), -##或者自定义类名 Player,或者字符串形式的类名,或者 TYPE_INT, TYPE_DICTIONARY -##[br][code]default[/code] 默认有哪些数据 -static func get_type_array(_class, default : Array = []) -> Array: - var data : _ClassInfo = get_class_info(_class) - # 返回类型化数组 - return Array(default, data._type, data._class_name, data._script ) - - -## 转为类型化数组 -static func to_type_array(_class, array: Array) -> Array: - return get_type_array(_class, array) - - -## 数组转为字典 -## -##[codeblock] -##var dict_data = ScriptCommentMenu_DataUtil.array_to_dictionary( -## node_list, -## func(node): return node.name, # key 键 -## func(node): return {} -##) -##[/codeblock] -static func array_to_dictionary( - list: Array, - get_key: Callable = func(item): return item, - get_value: Callable = func(item): return null -) -> Dictionary: - var data = {} - var key - var value - for i in list: - key = get_key.call(i) - value = get_value.call(i) - data[key] = value - return data - - -## 引用数据 -class RefData: - var value - - func get_value(): - return value - - func _init(value) -> void: - self.value = value - - func _to_string(): - return str(value) - - -## 获取引用数据。 -##[br] -##[br][b]Note:[/b] 主要用在匿名函数里,以处理基本数据类型的值。因为匿名函数之外的基本数据类型的值 -##在匿名函数修改不会发生改变。 -static func get_ref_data(default) -> RefData: - return RefData.new(default) - - -## 获取字典的值,如果没有,则获取并设置默认值 -##[br] -##[br][code]dict[/code] 获取的字典 -##[br][code]key[/code] key 键 -##[br][code]not_exists_set[/code] 没有则返回值设置这个值。这个回调方法返回要设置的数据 -static func get_value_or_set(dict: Dictionary, key, not_exists_set: Callable): - if dict.has(key) and not typeof(dict[key]) == TYPE_NIL: - return dict[key] - else: - dict[key] = not_exists_set.call() - return dict[key] - - -## 生成id -static func generate_id(data_list: Array) -> StringName: - var list = [] - for i in data_list: - list.append(hash(i)) - return ",".join(list).sha1_text() - - -## 如果不为空值结果值 -class NotNullValueChain: - - func _init(value): - set_meta("value", value) - - func get_value(default = null): - return get_meta("value", default) - - func or_else(object, else_object: Callable) -> NotNullValueChain: - return NotNullValueChain.new( object if object else else_object.call() ) - - ## 返回结果不为空时,这个方法需要一个参数接收值 - func if_not_null(else_object: Callable, default = null) -> NotNullValueChain: - var value = get_value() - return NotNullValueChain.new( else_object.call(value) if value else default ) - - -## 如果对象不为 null 则调用。 -## 可以链式调用逐步执行功能 -##[codeblock] -##func get_data(object: Object): -## return ScriptCommentMenu_DataUtil.if_not_null(object, func(): -## return object.get_script() -## ).or_else(func(): -## print("") -## ) -##[/codeblock] -static func if_not_null(object, else_object: Callable) -> NotNullValueChain: - return NotNullValueChain.new(( - else_object.call() if object != null else object - )) - - -## 获取正则 -static func get_regex(pattern: String) -> RegEx: - var re = RegEx.new() - re.compile(pattern) - return re - - -## 合并数据 -##[br] -##[br][code]merge_target[/code] 合并到的目标 -##[br][code]data[/code] 要追加合并的数据 -##[br][return]return[/return] 返回合并后的数据 -static func merge(merge_target, data): - if merge_target is Dictionary: - merge_target.merge(data) - return merge_target - elif merge_target is Array or merge_target is String: - merge_target += merge_target - return merge_target - else: - assert(false, "错误的数据类型!只能合并 [Dictionary, Array, String] 中的一种!") - - -## 获取一个唯一的数字 ID,从 0 始 -static func get_id() -> int: - const KEY = "DataUtil_get_id" - if Engine.has_meta(KEY): - var id = Engine.get_meta(KEY) - id += 1 - Engine.set_meta(KEY, id) - return id - else: - var id = 0 - Engine.set_meta(KEY, id) - return id - - -## 列表转为集合hash值,这样即便列表顺序不一致他的值也是相同的 -static func as_set_hash(list: Array) -> int: - var h : int = 0 - for i in list: - h += hash(i) - return h - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/plugin.cfg b/DungeonShooting_Godot/addons/script_comment_menu/plugin.cfg deleted file mode 100644 index fd4f592..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="script_comment_menu" -description="" -author="张学徒" -version="1.2" -script="plugin.gd" diff --git a/DungeonShooting_Godot/addons/script_comment_menu/plugin.gd b/DungeonShooting_Godot/addons/script_comment_menu/plugin.gd deleted file mode 100644 index 64f8e79..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/plugin.gd +++ /dev/null @@ -1,47 +0,0 @@ -#============================================================ -# Plugin -#============================================================ -# - datetime: 2022-06-11 11:26:00 -# - datetime: 2022-07-17 14:54:39 -#============================================================ -@tool -extends EditorPlugin - - - -var menu_button : MenuButton -var util_add_menu := ScriptCommentMenuConstant.AddMenu.new() - -var _sub_menus = [ - _ScriptMenu_Comments.new(), - _ScriptMenu_Overrides.new(), -] - - -func _enter_tree(): - # 编辑器启动不超过 5 秒时 - if Time.get_ticks_msec() < 5000: - await Engine.get_main_loop().create_timer(10).timeout - _init_data.call_deferred() - - -func _exit_tree(): - if menu_button: - menu_button.queue_free() - for sub in _sub_menus: - sub._uninstall() - - -func _init_data(): - # 添加菜单按钮 - menu_button = MenuButton.new() - menu_button.text = "代码工具" - menu_button.switch_on_hover = true - menu_button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN - util_add_menu.add_script_editor_menu(menu_button) - - for sub in _sub_menus: - sub.init_menu(menu_button) - - - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/script_util.gd b/DungeonShooting_Godot/addons/script_comment_menu/script_util.gd deleted file mode 100644 index fbbf5a9..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/script_util.gd +++ /dev/null @@ -1,401 +0,0 @@ -#============================================================ -# Scirpt Util -#============================================================ -# - datetime: 2022-07-17 17:25:00 -#============================================================ -## 处理脚本的工具 -class_name ScriptCommentMenu_ScriptUtil - - -const DATA_TYPE_TO_NAME = { - TYPE_NIL: &"null", - TYPE_BOOL: &"bool", - TYPE_INT: &"int", - TYPE_FLOAT: &"float", - TYPE_STRING: &"String", - TYPE_RECT2: &"Rect2", - TYPE_VECTOR2: &"Vector2", - TYPE_VECTOR2I: &"Vector2i", - TYPE_VECTOR3: &"Vector3", - TYPE_VECTOR3I: &"Vector3i", - TYPE_TRANSFORM2D: &"Transform2D", - TYPE_VECTOR4: &"Vector4", - TYPE_VECTOR4I: &"Vector4i", - TYPE_PLANE: &"Plane", - TYPE_QUATERNION: &"Quaternion", - TYPE_AABB: &"AABB", - TYPE_BASIS: &"Basis", - TYPE_TRANSFORM3D: &"Transform3D", - TYPE_PROJECTION: &"Projection", - TYPE_COLOR: &"Color", - TYPE_STRING_NAME: &"StringName", - TYPE_NODE_PATH: &"NodePath", - TYPE_RID: &"RID", - TYPE_OBJECT: &"Object", - TYPE_CALLABLE: &"Callable", - TYPE_SIGNAL: &"Signal", - TYPE_DICTIONARY: &"Dictionary", - TYPE_ARRAY: &"Array", - TYPE_PACKED_BYTE_ARRAY: &"PackedByteArray", - TYPE_PACKED_INT32_ARRAY: &"PackedInt32Array", - TYPE_PACKED_INT64_ARRAY: &"PackedInt64Array", - TYPE_PACKED_STRING_ARRAY: &"PackedStringArray", - TYPE_PACKED_VECTOR2_ARRAY: &"PackedVector2Array", - TYPE_PACKED_VECTOR3_ARRAY: &"PackedVector3Array", - TYPE_PACKED_FLOAT32_ARRAY: &"PackedFloat32Array", - TYPE_PACKED_FLOAT64_ARRAY: &"PackedFloat64Array", - TYPE_PACKED_COLOR_ARRAY: &"PackedColorArray", -} - -const NAME_TO_DATA_TYPE = { - &"null": TYPE_NIL, - &"bool": TYPE_BOOL, - &"int": TYPE_INT, - &"float": TYPE_FLOAT, - &"String": TYPE_STRING, - &"Rect2": TYPE_RECT2, - &"Vector2": TYPE_VECTOR2, - &"Vector2i": TYPE_VECTOR2I, - &"Vector3": TYPE_VECTOR3, - &"Vector3i": TYPE_VECTOR3I, - &"Transform2D": TYPE_TRANSFORM2D, - &"Vector4": TYPE_VECTOR4, - &"Vector4i": TYPE_VECTOR4I, - &"Plane": TYPE_PLANE, - &"Quaternion": TYPE_QUATERNION, - &"AABB": TYPE_AABB, - &"Basis": TYPE_BASIS, - &"Transform3D": TYPE_TRANSFORM3D, - &"Projection": TYPE_PROJECTION, - &"Color": TYPE_COLOR, - &"StringName": TYPE_STRING_NAME, - &"NodePath": TYPE_NODE_PATH, - &"RID": TYPE_RID, - &"Object": TYPE_OBJECT, - &"Callable": TYPE_CALLABLE, - &"Signal": TYPE_SIGNAL, - &"Dictionary": TYPE_DICTIONARY, - &"Array": TYPE_ARRAY, - &"PackedByteArray": TYPE_PACKED_BYTE_ARRAY, - &"PackedInt32Array": TYPE_PACKED_INT32_ARRAY, - &"PackedInt64Array": TYPE_PACKED_INT64_ARRAY, - &"PackedStringArray": TYPE_PACKED_STRING_ARRAY, - &"PackedVector2Array": TYPE_PACKED_VECTOR2_ARRAY, - &"PackedVector3Array": TYPE_PACKED_VECTOR3_ARRAY, - &"PackedFloat32Array": TYPE_PACKED_FLOAT32_ARRAY, - &"PackedFloat64Array": TYPE_PACKED_FLOAT64_ARRAY, - &"PackedColorArray": TYPE_PACKED_COLOR_ARRAY, -} - - -static func _get_script_data_cache(script: Script) -> Dictionary: - return ScriptCommentMenu_DataUtil.get_meta_dict_data("ScriptCommentMenu_ScriptUtil__get_script_data_cache") - -## 数据类型名称 -##[br][code]type[/code]: 数据类型枚举值 -##[br][code]return[/code]: 返回数据类型的字符串 -static func get_type_name(type: int) -> StringName: - return DATA_TYPE_TO_NAME.get(type) - -## 获取这个类名的类型 -static func get_type_of(_class_name: StringName) -> int: - return NAME_TO_DATA_TYPE.get(_class_name, -1) - -## 是否有这个类型的枚举 -static func has_type(type: int) -> bool: - return DATA_TYPE_TO_NAME.has(type) - -## 是否是基础数据类型 -static func is_base_data_type(_class_name: StringName) -> bool: - return NAME_TO_DATA_TYPE.has(_class_name) - -## 获取属性列表 -##[br] -##[br]返回类似如下格式的数据 -##[codeblock] -##{ -## "name": "RefCounted", -## "class_name": &"", -## "type": 0, -## "hint": 0, -## "hint_string": "", -## "usage": 128 -##} -##[/codeblock] -static func get_property_data_list(script: Script) -> Array[Dictionary]: - if is_instance_valid(script): - return script.get_script_property_list() - return Array([], TYPE_DICTIONARY, "Dictionary", null) - -## 获取方法列表 -static func get_method_data_list(script: Script) -> Array[Dictionary]: - if is_instance_valid(script): - return script.get_script_method_list() - ScriptCommentMenu_DataUtil.get_type_array("int") - return Array([], TYPE_DICTIONARY, "Dictionary", null) - - -## 获取方法的参数列表数据 -static func get_method_arguments_list(script: Script, method_name: StringName) -> Array[Dictionary]: - var data = get_method_data(script, method_name) - if data: - return data.get("args", ScriptCommentMenu_DataUtil.get_type_array("Dictionary")) - return ScriptCommentMenu_DataUtil.get_type_array("Dictionary") - - -## 获取信号列表 -static func get_signal_data_list(script: Script) -> Array[Dictionary]: - if is_instance_valid(script): - return script.get_script_signal_list() - return Array([], TYPE_DICTIONARY, "Dictionary", null) - -## 获取这个属性名称数据 -static func get_property_data(script: Script, property: StringName) -> Dictionary: - var data = _get_script_data_cache(script) - var p_cache_data : Dictionary = ScriptCommentMenu_DataUtil.get_value_or_set(data, "propery_data_cache", func(): - var property_data : Dictionary = {} - for i in script.get_script_property_list(): - property_data[i['name']] = i - return property_data - ) - return p_cache_data.get(property, {}) - -## 获取这个名称的方法的数据 -static func get_method_data(script: Script, method_name: StringName) -> Dictionary: - var data = _get_script_data_cache(script) - var m_cache_data : Dictionary = ScriptCommentMenu_DataUtil.get_value_or_set(data, "method_data_cache", func(): - var method_data : Dictionary = {} - for i in script.get_script_method_list(): - method_data[i['name']]=i - return method_data - ) - return m_cache_data.get(method_name, {}) - -## 获取这个名称的信号的数据 -static func get_signal_data(script: Script, signal_name: StringName): - var data = _get_script_data_cache(script) - var s_cache_data : Dictionary = ScriptCommentMenu_DataUtil.get_value_or_set(data, "script_data_cache", func(): - var signal_data : Dictionary = {} - for i in script.get_script_signal_list(): - signal_data[i['name']]=i - return signal_data - ) - return s_cache_data.get(signal_name, {}) - - -## 获取方法数据 -## [br] -## [br][code]script[/code]: 脚本 -## [br][code]method[/code]: 要获取的方法数据的方法名 -## [br] -## [br][code]return[/code]: 返回脚本的数据信息。 -## 包括的 key 有 [code]name[/code], [code]args[/code], [code]default_args[/code] -## , [code]flags[/code], [code]return[/code], [code]id[/code] -func find_method_data(script: Script, method: String) -> Dictionary: - var method_data = script.get_script_method_list() - for m in method_data: - if m['name'] == method: - return m - return {} - - -## 获取扩展脚本链(扩展的所有脚本) -##[br] -##[br][code]script[/code] Object 对象或脚本 -##[br][code]return[/code] 返回继承的脚本路径列表 -static func get_extends_link(script: Script) -> PackedStringArray: - var list := PackedStringArray() - while script: - if FileAccess.file_exists(script.resource_path): - list.push_back(script.resource_path) - script = script.get_base_script() - return list - - -## 获取基础类型继承链类列表 -##[br] -##[br][code]_class[/code] 基础类型类名 -##[br][code]return[/code] 返回基础的类名列表 -static func get_extends_link_base(_class) -> PackedStringArray: - if _class is Script: - _class = _class.get_instance_base_type() - elif _class is Object: - _class = _class.get_class() - - var c = _class - var list = [] - while c != "": - list.append(c) - c = ClassDB.get_parent_class(c) - return PackedStringArray(list) - - -## 生成方法代码 -##[br] -##[br][code]method_data[/code] 方法数据 -##[br][code]return[/code] 返回生成的代码 -static func generate_method_code(method_data: Dictionary) -> String: - var temp := method_data.duplicate(true) - var args := "" - for i in temp['args']: - var arg_name = i['name'] - var arg_type = ( get_type_name(i['type']) if i['type'] != TYPE_NIL else "") - if arg_type.strip_edges() == "": - arg_type = str(i['class_name']) - if arg_type.strip_edges() != "": - arg_type = ": " + arg_type - args += "%s%s, " % [arg_name, arg_type] - temp['args'] = args.trim_suffix(", ") - if temp['return']['type'] != TYPE_NIL: - temp['return_type'] = get_type_name(temp['return']['type']) - - if temp.has('return_type') and temp['return_type'] != "": - temp['return_type'] = " -> " + str(temp['return_type']) - temp['return_sentence'] = "pass\n\treturn super." + temp['name'] + "()" - else: - temp['return_type'] = "" - temp['return_sentence'] = "pass" - - return "func {name}({args}){return_type}:\n\t{return_sentence}\n".format(temp) - - -## 获取对象的脚本 -static func get_object_script(object: Object) -> Script: - if object == null: - return null - if object is Script: - return object - return object.get_script() as Script - - -## 对象是否是 tool 状态 -##[br] -##[br][code]object[/code] 返回这个对象的脚本是否是开启 tool 的状态 -static func is_tool(object: Object) -> bool: - var script = get_object_script(object) - return script.is_tool() if script else false - - -## 获取对象的脚本路径,如果不存在脚本,则返回空的字符串 -static func get_object_script_path(object: Object) -> String: - var script = get_object_script(object) - return script.resource_path if script else "" - - -## 获取这个对象的这个方法的信息 -##[br] -##[br][code]object[/code] 对象 -##[br][code]method_name[/code] 方法名 -##[br][code]return[/code] 返回方法的信息 -static func get_object_method_data(object: Object, method_name: StringName) -> Dictionary: - if not is_instance_valid(object): - return {} - var script = get_object_script(object) - if script: - return get_method_data(script, method_name) - return {} - - -## 获取这个信号的数据 -static func get_object_signal_data(object: Object, signal_name: StringName) -> Dictionary: - if not is_instance_valid(object): - return {} - var script = get_object_script(object) - if script: - return get_signal_data(script, signal_name) - return {} - - -## 获取对象的属性数据 -static func get_object_property_data(object: Object, proprety_name: StringName) -> Dictionary: - if not is_instance_valid(object): - return {} - var script = get_object_script(object) - if script: - return get_property_data(script, proprety_name) - return {} - - -## 获取内置类名称转为对象。比如将 "Node" 字符串转为 [Node] 这种 GDScriptNativeClass 类型数据 -##[br] -##[br][code]_class[/code] 类名称 -static func get_built_in_class (_class: StringName): - if not ClassDB.class_exists(_class): - return null - var _class_db = ScriptCommentMenu_DataUtil.get_meta_dict_data("ScriptCommentMenu_ScriptUtil_get_built_in_class") - return ScriptCommentMenu_DataUtil.get_value_or_set(_class_db, _class, func(): - var script = GDScript.new() - script.source_code = "var type = " + _class - if script.reload() == OK: - var obj = script.new() - _class_db[_class] = obj.type - return _class_db[_class] - else: - push_error("错误的类名:", _class) - return null - ) - - -## 根据类名返回类对象 -static func get_script_class(_class: StringName): - if ClassDB.class_exists(_class): - return null - var _class_db = ScriptCommentMenu_DataUtil.get_meta_dict_data("ScriptCommentMenu_ScriptUtil_get_script_class") - return ScriptCommentMenu_DataUtil.get_value_or_set(_class_db, _class, func(): - var script = GDScript.new() - script.source_code = "var type = " + _class - if script.reload() == OK: - var obj = script.new() - _class_db[_class] = obj.type - return _class_db[_class] - else: - push_error("错误的类名:", _class) - return null - ) - - -## 创建脚本 -static func create_script(source_code: String) -> GDScript: - var data = ScriptCommentMenu_DataUtil.get_meta_dict_data("ScriptCommentMenu_ScriptUtil_create_script") - return ScriptCommentMenu_DataUtil.get_value_or_set(data, source_code.sha256_text(), func(): - var script := GDScript.new() - script.source_code = source_code - script.reload() - return script - ) - - -## 获取这个类的场景。这个场景的位置和名称需要和脚本一致,只有后缀名不一样。这个类不能是内部类 -static func get_script_scene(script: GDScript) -> PackedScene: - var data = ScriptCommentMenu_DataUtil.get_meta_dict_data("ScriptCommentMenu_ScriptUtil_get_script_scene") - if data.has(script): - return data[script] - else: - var path := script.resource_path - if path == "": - return null - - var ext := path.get_extension() - var file = path.substr(0, len(path) - len(ext)) - - var scene: PackedScene - if FileAccess.file_exists(file + "tscn"): - scene = ResourceLoader.load(file + "tscn", "PackedScene") as PackedScene - elif FileAccess.file_exists(file + "scn"): - scene = ResourceLoader.load(file + "scn", "PackedScene") as PackedScene - else: - printerr("这个类目录下没有相同名称的场景文件!") - return null - data[script] = scene - return scene - - -## 获取对象的类。如果是自定义类返回 [GDScript] 类;如果是内置类,则返回 [GDScriptNativeClass] 类 -static func get_object_class(object: Object): - if object: - if object is Script: - return object - if object.get_script() != null: - return object.get_script() - return get_built_in_class (object.get_class()) - return &"" diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/@sub_item.gd b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/@sub_item.gd deleted file mode 100644 index 83e9bf5..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/@sub_item.gd +++ /dev/null @@ -1,88 +0,0 @@ -#============================================================ -# @sub Tem -#============================================================ -# - datetime: 2022-07-17 16:32:29 -#============================================================ -class_name _ScriptMenu_SubItem - - -const MenuItemBuilder := ScriptCommentMenuConstant.MenuItemBuilder - - -var _editor_plugin = EditorPlugin.new() -var _util_script : ScriptCommentMenu_ScriptUtil -var _util_script_editor : ScriptCommentMenuConstant.ScriptEditorUtil - - -#============================================================ -# Set/Get -#============================================================ -func get_editor_interface() -> EditorInterface: - return _editor_plugin.get_editor_interface() - -func get_script_editor_util(): - return _util_script_editor - -func get_script_util() -> ScriptCommentMenu_ScriptUtil: - return _util_script - - -#============================================================ -# 自定义 -#============================================================ -## 外部调用初始化菜单 -##[br] -##[br][code]menu_button[/code] 菜单按钮 -func init_menu(menu_button: MenuButton) -> void: - if not menu_button.has_meta("IsInit"): - _util_script_editor = ScriptCommentMenuConstant.ScriptEditorUtil.new() - _util_script = ScriptCommentMenu_ScriptUtil.new() - menu_button.set_meta("IsInit", { - "_util_script_editor": _util_script_editor, - "_util_script": _util_script, - }) - - var data : Dictionary = menu_button.get_meta("IsInit") - for property in data: - var value = data[property] - set(property, value) - - _init_menu(menu_button) - - -## 添加分隔符 -func add_separator(menu_button: MenuButton): - (MenuItemBuilder.instance() - .set_menu_by_menu_button(menu_button) - .add_separator() - .build() - ) - -## 添加菜单 -func add_menu_item(menu_button: MenuButton, name: String, key_map: Dictionary, callable: Callable): - # 添加菜单 - (MenuItemBuilder.instance() - .set_menu(menu_button.get_popup()) - .set_item_name(name) - .set_connect(callable) - .set_key(key_map.get("key", false)) - .set_ctrl(key_map.get("ctrl", false)) - .set_shift(key_map.get("shift", false)) - .set_alt(key_map.get("alt", false)) - .build() - ) - - - -## 重写方法,初始化菜单 -##[br] -##[br][code]menu_button[/code] 菜单按钮 -func _init_menu(menu_button: MenuButton) -> void: - pass - - -## 卸载子项 -func _uninstall(): - pass - - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/comment/comment.gd b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/comment/comment.gd deleted file mode 100644 index 1243aa7..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/comment/comment.gd +++ /dev/null @@ -1,134 +0,0 @@ -#============================================================ -# Comment -#============================================================ -# - datetime: 2022-07-17 14:49:15 -#============================================================ -## 脚本注释 -class_name _ScriptMenu_Comments -extends _ScriptMenu_SubItem - - -const SEPARATE_LENGTH = 60 - - -var util_script_editor := ScriptCommentMenuConstant.ScriptEditorUtil.new() -var util_script := ScriptCommentMenu_ScriptUtil.new() - -var regex = RegEx.new() - - -#============================================================ -# 内置 -#============================================================ -func _init(): - var pattern = "(?\\s*)(static\\s+)?func\\s+(?[^\\(]+)" - regex.compile(pattern) - - -#============================================================ -# 自定义 -#============================================================ -#(override) -func _init_menu(menu_button: MenuButton): - # 设置添加菜单项 - var menu : PopupMenu = menu_button.get_popup() - add_menu_item(menu_button, "脚本注释", {}, _script_comment) - add_separator(menu_button) - add_menu_item(menu_button, "方法注释", { - "key": KEY_C, - "ctrl": true, - "shift": true, - }, _func_comment) - add_menu_item(menu_button, "类别分隔", { - "key": KEY_SLASH, - "ctrl": true, - "shift": true, - }, _category_comment) - - -#============================================================ -# 功能 -#============================================================ -## 方法注释 -func _func_comment(): - var text_edit : TextEdit = util_script_editor.get_current_code_editor() - var line : int = text_edit.get_caret_line() - - for i in range(line, text_edit.get_line_count()): - var line_code : String = text_edit.get_line(i) - var result = regex.search(line_code) - if result: - var method = result.get_string("method").strip_edges() - printt(method - , util_script_editor.get_current_script() - , util_script_editor.get_current_script().resource_path - ) - - var indent = result.get_string("indent") - var data = util_script.find_method_data(util_script_editor.get_current_script(), method) - if data.size() == 0: - printerr('没有找到', method,'方法的数据,脚本是否还未保存?') - return - - var code : String = "## %s\n" % data['name'] - if data['args'].size() > 0: - code += (indent + "##[br]\n") - for arg in data['args']: - code += (indent + "##[br][code]%s[/code] \n" % arg['name']) - if data['return']['type'] != TYPE_NIL: - code += (indent + "##[br][code]return[/code] ") - code = code.trim_suffix("\n") - util_script_editor.insert_code_current_pos(code, true) - break - -## 脚本注释 -func _script_comment(): - var script = util_script_editor.get_current_script() - if script == null: - return - - var separa = "=".repeat(SEPARATE_LENGTH) - - # 脚本名 - var script_name = script.resource_path.get_file().get_basename().capitalize() - # 时间 - var datetime = Time.get_datetime_dict_from_system() - var datetime_str = "%02d-%02d-%02d %02d:%02d:%02d" % [ - datetime['year'], datetime['month'], datetime['day'], - datetime['hour'], datetime['minute'], datetime['second'], - ] - - var code = """#{sep} -# {name} -#{sep} -# - author: zhangxuetu -# - datetime: {datetime} -# - version: 4.0 -#{sep} -""".format({ - "sep": separa, - "name": script_name, - "datetime": datetime_str, -}) - # 插入到顶部 - var textedit = util_script_editor.get_current_code_editor() - textedit.set_caret_line(0) - textedit.set_caret_column(0) - textedit.insert_text_at_caret(code) - - -## 类别分隔 -func _category_comment(): - var separa = "=".repeat(SEPARATE_LENGTH) - var code = """#{sep} -# -#{sep}""".format({ - "sep": separa, - }) - - var textedit = util_script_editor.get_current_code_editor() - textedit.set_caret_column(0) - textedit.insert_text_at_caret(code) - textedit.set_caret_line(textedit.get_caret_line() - 1) - - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/dialog.gd b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/dialog.gd deleted file mode 100644 index f38412f..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/dialog.gd +++ /dev/null @@ -1,53 +0,0 @@ -#============================================================ -# Dialog -#============================================================ -# - datetime: 2022-07-17 15:49:30 -#============================================================ -@tool -extends Control - - -signal selected_method(method_names : Array) - - -const SCRIPT_METHOD_LIST_SCRIPT = preload("res://addons/script_comment_menu/sub_item/override/scene/script_method_list.gd") -const CHECK_LABEL = preload("res://addons/script_comment_menu/sub_item/override/scene/check_label.gd") - - -@onready var confirmation_dialog = find_child("ConfirmationDialog") -@onready var script_method_list = find_child("ScriptMethodList") as SCRIPT_METHOD_LIST_SCRIPT - - -#============================================================ -# 自定义 -#============================================================ -## 显示弹窗 -func show_popup(script: Script): - confirmation_dialog.popup_centered_ratio(0.6) - script_method_list.update_data(script) - - -#============================================================ -# 自定义 -#============================================================ -func _ready(): - confirmation_dialog.confirmed.connect(_confirmed) - if not Engine.is_editor_hint(): - confirmation_dialog.popup_centered() - - -#============================================================ -# 连接信号 -#============================================================ -func _confirmed(): - var selected_items = script_method_list.get_selected_items() - - var method_list = {} - for item in selected_items: - item = item as CHECK_LABEL - var method_name : String = item.text - method_list[method_name] = null - item.selected = false - selected_method.emit(method_list.keys()) - - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/dialog.tscn b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/dialog.tscn deleted file mode 100644 index d8fefe8..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/dialog.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://cnx2ri54w1dpr"] - -[ext_resource type="Script" path="res://addons/script_comment_menu/sub_item/override/dialog.gd" id="1_isfs8"] -[ext_resource type="PackedScene" uid="uid://btcf0syabq2et" path="res://addons/script_comment_menu/sub_item/override/scene/script_method_list.tscn" id="2_lxp0b"] - -[node name="Dialog" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -mouse_filter = 2 -script = ExtResource("1_isfs8") -metadata/_edit_lock_ = true - -[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."] -dialog_close_on_escape = false - -[node name="ScriptMethodList" parent="ConfirmationDialog" instance=ExtResource("2_lxp0b")] -anchor_right = 0.0 -anchor_bottom = 0.0 -offset_right = 636.0 -offset_bottom = 342.0 diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/override.gd b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/override.gd deleted file mode 100644 index 2e10602..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/override.gd +++ /dev/null @@ -1,106 +0,0 @@ -#============================================================ -# Override -#============================================================ -# - datetime: 2022-07-17 15:53:56 -#============================================================ - -## 重写 -class_name _ScriptMenu_Overrides -extends _ScriptMenu_SubItem - - -const DIALOG_SCRIPT = preload("dialog.gd") -const DIALOG_SCENE = preload("dialog.tscn") - - -var dialog = DIALOG_SCENE.instantiate() as DIALOG_SCRIPT - - -#============================================================ -# 自定义 -#============================================================ -#(override) -func _init_menu(menu_button: MenuButton): - # 添加弹窗 - dialog.selected_method.connect(_selected_method) - get_editor_interface().get_base_control().add_child(dialog) - dialog.theme = get_editor_interface().get_base_control().theme - # 添加菜单 - add_separator(menu_button) - add_menu_item(menu_button, "重写方法", { - "key": KEY_O, - "ctrl": true, - "shift": true, - }, _show_popup) - - -#(override) -func _uninstall(): - super._uninstall() - dialog.queue_free() - - -#============================================================ -# 连接信号 -#============================================================ -## 显示弹窗 -func _show_popup(): - var script = get_script_editor_util().get_current_script() as Script - dialog.show_popup(script) - - -const FORMAT = """ -#(override) -func {method_name}({arguments}){return_type}: - {return_value}super.{method_name}({parameters}) - -""" - -func _selected_method(method_names : Array): - - var text_edit = get_script_editor_util().get_current_code_editor() as TextEdit - var script = get_script_editor_util().get_current_script() as Script - - var code : String = "" - - var added = {} - for method_data in script.get_script_method_list(): - if added.has(method_data['name']) or not method_data['name'] in method_names: - continue - - added[method_data['name']] = null - - var method_name = method_data['name'] - var method_type = method_data.get("type", 0) - var method_args = method_data['args'] as Array - var method_return = method_data['return'] - - # 参数列表 - var arguments : String = ", ".join(method_args.map(func(arg): return arg['name'])) - arguments = arguments.strip_edges().trim_suffix(",") - - # 类型 - var return_type : String = ScriptCommentMenu_ScriptUtil.get_type_name(method_type) - var return_value : String = "" - if return_type == "null": - return_type = "" - if return_type != "": - return_type = " -> " + return_type - return_value = "return " - - code += FORMAT.format({ - "method_name": method_name, - "method_type": ScriptCommentMenu_ScriptUtil.get_type_name(method_type), - "return_type": return_type, - "return_value": "", - "arguments": arguments, - "parameters": arguments, - }) - - text_edit.set_caret_column(0) - text_edit.insert_text_at_caret(code) - - - - - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/check_label.gd b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/check_label.gd deleted file mode 100644 index be8c877..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/check_label.gd +++ /dev/null @@ -1,51 +0,0 @@ -#============================================================ -# Check check_box -#============================================================ -# - datetime: 2022-07-16 22:30:22 -#============================================================ -@tool -extends HBoxContainer - - -signal pressed - - -@export -var text : String = "": - set(value): - text = value - if check_box == null: - await ready - check_box.text = value - get: - return check_box.text - -@export -var selected : bool = false : - set(value): - selected = value - if check_box == null: - await ready - check_box.button_pressed = value - get: - return check_box.button_pressed - -@export -var color : Color = Color.WHITE : - set(value): - color = value - if check_box == null: - await ready - check_box.modulate = color - - -@onready var check_box = $CheckBox as CheckBox - - -func _ready(): - check_box.pressed.connect(_pressed) - - -func _pressed(): - pressed.emit() - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/check_label.tscn b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/check_label.tscn deleted file mode 100644 index e034436..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/check_label.tscn +++ /dev/null @@ -1,15 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://bvoxy56c0um5v"] - -[ext_resource type="Script" path="res://addons/script_comment_menu/sub_item/override/scene/check_label.gd" id="1_7qjn7"] - -[node name="CheckLabel" type="HBoxContainer"] -offset_right = 484.0 -offset_bottom = 24.0 -size_flags_horizontal = 3 -size_flags_vertical = 0 -script = ExtResource("1_7qjn7") - -[node name="CheckBox" type="CheckBox" parent="."] -offset_right = 484.0 -offset_bottom = 24.0 -size_flags_horizontal = 3 diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/item_list.gd b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/item_list.gd deleted file mode 100644 index baf1991..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/item_list.gd +++ /dev/null @@ -1,88 +0,0 @@ -#============================================================ -# Item List -#============================================================ -# - datetime: 2022-07-17 15:02:44 -#============================================================ -@tool -extends VBoxContainer - - -const CHECK_LABEL_SCENE = preload("check_label.tscn") -const CHECK_LABEL_SCRIPT = preload("check_label.gd") - - -var last_press_check : CHECK_LABEL_SCRIPT - - -## 添加 Item -##[br] -##[br][code]label[/code] -##[br][code]color[/code] -##[br] -##[br][code]return[/code] -func add_item(label: String, color : Color = Color.WHITE) -> CHECK_LABEL_SCRIPT: - var check_label = CHECK_LABEL_SCENE.instantiate() - add_child(check_label) - check_label.text = label - check_label.color = color - # 上一次点击的对象 - check_label.pressed.connect(_pressed.bind(check_label)) - return check_label - - -## 添加组别标签 -##[br] -##[br][code]text[/code] 标签名 -func add_label(text: String): - var space = Control.new() - space.custom_minimum_size.y = 4 - add_child(space) - var panel = Panel.new() - panel.custom_minimum_size.y = 1 - add_child(panel) - var label = Label.new() - label.text = text - add_child(label) - - -## 获取所有项 -func get_all_item() -> Array: - var list = [] - for child in get_children(): - if child is CHECK_LABEL_SCRIPT: - list.append(child) - return list - - -## 获取选中的项 -func get_selected_items() -> Array: - var list = [] - for item in get_all_item(): - item = item as CHECK_LABEL_SCRIPT - if item.selected: - list.append(item) - return list - -## 清除所有 -func clear(): - for child in get_children(): - child.queue_free() - - - -#============================================================ -# 连接信号 -#============================================================ -func _pressed(check: CHECK_LABEL_SCRIPT): - # 如果是按着 Shift 键 - var all_item = get_all_item() - if Input.is_key_pressed(KEY_SHIFT): - if last_press_check != check: - var last_index = all_item.find(last_press_check) - var curr_index = all_item.find(check) - var selected = check.selected - for i in range(last_index, curr_index, sign(curr_index - last_index)): - all_item[i].selected = selected - - last_press_check = check - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/item_list.tscn b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/item_list.tscn deleted file mode 100644 index 9177745..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/item_list.tscn +++ /dev/null @@ -1,10 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dmiw7e671j5ox"] - -[ext_resource type="Script" path="res://addons/script_comment_menu/sub_item/override/scene/item_list.gd" id="1_of1bk"] - -[node name="ItemList" type="VBoxContainer"] -offset_right = 1024.0 -offset_bottom = 600.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -script = ExtResource("1_of1bk") diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/script_method_list.gd b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/script_method_list.gd deleted file mode 100644 index 240df10..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/script_method_list.gd +++ /dev/null @@ -1,69 +0,0 @@ -#============================================================ -# Script Method List -#============================================================ -# - datetime: 2022-07-17 15:22:58 -#============================================================ -@tool -extends MarginContainer - - -const ITEM_LIST_SCRIPT = preload("item_list.gd") - - -@onready var item_list = $ScrollContainer/ItemList as ITEM_LIST_SCRIPT -@onready var scroll_container = $ScrollContainer - - -## 获取所有选中的项 -func get_selected_items() -> Array: - return item_list.get_selected_items() - - -## 更新数据 -##[br] -##[br][code]script[/code] 脚本 -func update_data(script: Script): - # 获取脚本的继承的所有脚本类 - var scripts = [] - script = script.get_base_script() - while script != null: - scripts.append(script) - script = script.get_base_script() - # 显示脚本的数据 - show_script_list_data(scripts) - - # 滚动到下面 -# await get_tree().create_timer(0.1).timeout -# scroll_container.scroll_vertical = 2000 - - -## 展示脚本列表数据 -##[br] -##[br][code]scripts[/code] -func show_script_list_data(scripts: Array): - item_list.clear() - # 已添加过的(防止重复获取) - var added : Dictionary = {} - # 开始遍历 - scripts.reverse() - for script in scripts: - var path = script.resource_path.get_file() - item_list.add_label(path) - - # 获取数据 - var data = {} - for method_data in script.get_script_method_list(): - var method_name : String = method_data['name'] - if not added.has(method_name): - data[method_name] = method_data - added[method_name] = null - - # 排序 - var list = data.keys() - list.sort() - for key in list: - var method_data : Dictionary = data[key] - var method : String = method_data['name'] - item_list.add_item(method) - - diff --git a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/script_method_list.tscn b/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/script_method_list.tscn deleted file mode 100644 index 8f47fd9..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/sub_item/override/scene/script_method_list.tscn +++ /dev/null @@ -1,17 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://btcf0syabq2et"] - -[ext_resource type="Script" path="res://addons/script_comment_menu/sub_item/override/scene/script_method_list.gd" id="1_ao6ev"] -[ext_resource type="PackedScene" uid="uid://dmiw7e671j5ox" path="res://addons/script_comment_menu/sub_item/override/scene/item_list.tscn" id="1_rynrx"] - -[node name="ScriptMethodList" type="MarginContainer"] -anchor_right = 1.0 -anchor_bottom = 1.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -script = ExtResource("1_ao6ev") - -[node name="ScrollContainer" type="ScrollContainer" parent="."] -offset_right = 1024.0 -offset_bottom = 600.0 - -[node name="ItemList" parent="ScrollContainer" instance=ExtResource("1_rynrx")] diff --git a/DungeonShooting_Godot/addons/script_comment_menu/util/@constant.gd b/DungeonShooting_Godot/addons/script_comment_menu/util/@constant.gd deleted file mode 100644 index 29fed0c..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/util/@constant.gd +++ /dev/null @@ -1,7 +0,0 @@ -class_name ScriptCommentMenuConstant - - -const AddMenu = preload("res://addons/script_comment_menu/util/add_menu.gd") -const MenuItemBuilder = preload("res://addons/script_comment_menu/util/menu_item_builder.gd") -const PopupMenuUtil = preload("res://addons/script_comment_menu/util/popup_menu_util.gd") -const ScriptEditorUtil = preload("res://addons/script_comment_menu/util/script_editor_util.gd") diff --git a/DungeonShooting_Godot/addons/script_comment_menu/util/add_menu.gd b/DungeonShooting_Godot/addons/script_comment_menu/util/add_menu.gd deleted file mode 100644 index 0415ba8..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/util/add_menu.gd +++ /dev/null @@ -1,106 +0,0 @@ -extends EditorScript - - -const EditorUtil_PopupMenu = preload("popup_menu_util.gd") - - -var json = JSON.new() -var util_popup_menu = EditorUtil_PopupMenu.new() - - -func _run(): - pass - - var menu = MenuButton.new() - menu.text = "测试菜单" - add_editor_menu(menu) - await get_tree().create_timer(2).timeout - menu.queue_free() - - - -var _top_container: HBoxContainer -func _get_top_container() -> HBoxContainer: - if _top_container == null: - for child in get_editor_interface().get_base_control().get_children(): - if child is VBoxContainer: - _top_container = child.get_child(0) - break - return _top_container - -var _editor_menu_container : HBoxContainer -func get_editor_menu_container() -> HBoxContainer: - if _editor_menu_container == null: - _editor_menu_container = _get_top_container().get_child(0) - return _editor_menu_container - - -func add_editor_menu(menu_button: MenuButton): - get_editor_menu_container().add_child(menu_button) - - -func get_tree(): - return get_editor_interface().get_tree() - - -## 添加脚本菜单按钮 -func add_script_editor_menu(menu_button: MenuButton, items: Array = []): - var popup = menu_button.get_popup() - for item in items: - if item.begins_with("-"): - popup.add_separator() - else: - while item.begins_with("-"): - item = item.trim_prefix("-") - popup.add_item(item) - - var menu_container : Control - while true: - var tmp = get_editor_interface() \ - .get_script_editor() \ - .get_current_editor() - if tmp == null: - await Engine.get_main_loop().create_timer(1).timeout - continue - for i in 4: - tmp = tmp.get_parent_control() - if tmp == null: - break - if tmp == null: - await Engine.get_main_loop().create_timer(1).timeout - continue - menu_container = tmp.get_child(0) as Control - break - - var node_index : int = 0 - for i in range(menu_container.get_child_count() - 1, -1, -1): - if menu_container.get_child(i) is MenuButton: - node_index = i + 1 - break - menu_container.add_child(menu_button) - menu_container.move_child(menu_button, node_index) - - -func connect_menu(menu, item_name: String, callable, method: String = ""): - var popup : PopupMenu - if menu is MenuButton: - popup = menu.get_popup() - elif menu is PopupMenu: - popup = menu - if method: - util_popup_menu.connect_popup_item(menu.get_popup(), item_name, callable, method) - else: - util_popup_menu.connect_popup_item(menu.get_popup(), item_name, callable.get_object(), callable.get_method()) - - -static func add_menu_item_shortcut( - menu: MenuButton - , item_name: String - , keycode: int - , ctrl : bool - , alt : bool - , shift : bool -): - EditorUtil_PopupMenu.add_popup_shortcut( - menu.get_popup(), item_name, keycode, ctrl, alt, shift - ) diff --git a/DungeonShooting_Godot/addons/script_comment_menu/util/menu_item_builder.gd b/DungeonShooting_Godot/addons/script_comment_menu/util/menu_item_builder.gd deleted file mode 100644 index 50640f6..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/util/menu_item_builder.gd +++ /dev/null @@ -1,139 +0,0 @@ -#============================================================ -# Menu Item Builder -#============================================================ -# - datetime: 2022-07-17 14:14:42 -#============================================================ -# 菜单项建造器 - -var _menu : PopupMenu -var _name : String -var _method : Callable -var _short : Dictionary = { - key = KEY_NONE, - ctrl = false, - alt = false, - shift = false, -} -var _as_separator : bool = false - -var _id : int = -1 - - -#============================================================ -# Set/Get -#============================================================ -## 设置添加的菜单 -##[br] -##[br][code]menu[/code] 菜单 -func set_menu(menu: PopupMenu): - self._menu = menu - return self - -## 设置菜单按钮对象 -func set_menu_by_menu_button(menu_button: MenuButton): - set_menu( menu_button.get_popup() ) - return self - - -## 设置菜单名 -##[br] -##[br][code]name[/code] -func set_item_name(name: String): - self._name = name - return self - -## 设置连接的方法 -##[br] -##[br][code]method[/code] 连接的方法 -func set_connect(method: Callable): - self._method = method - return self - -## 设置快捷键 -##[br] -##[br][code]key[/code] 按键 Key 值 -##[br][code]ctrl[/code] Ctrl -##[br][code]alt[/code] Alt -##[br][code]shift[/code] Shift -func set_shortcut( - key: int - , ctrl: bool = false - , alt: bool = false - , shift: bool = false -): - self._short.key = key - self._short.ctrl = ctrl - self._short.alt = alt - self._short.shift = shift - return self - -func set_key(key : int): - self._short.key = key - return self - -func set_ctrl(value : bool = true): - self._short.ctrl = value - return self - -func set_shift(value : bool = true): - self._short.shift = value - return self - -func set_alt(value : bool = true): - self._short.alt = value - return self - - -#============================================================ -# 自定义 -#============================================================ -## 实例化一个 Builder -##[br] -##[br][code]return[/code] 返回实例化对象 -static func instance(): - var builder = load("res://addons/script_comment_menu/util/menu_item_builder.gd").new() - return builder - - -## 添加分隔符 -func add_separator(): - _as_separator = true - return self - - -## 构建添加 -##[br] -##[br][code]return[/code] 返回菜单的 id 值 -func build() -> int: - _id = _menu.item_count - - # 引用这个 builder,不这样则会因为引用消失而造成下面的 _id_pressed 失效 - _menu.set_meta("MenuItemMenu_%d" % _id, self) - - if _menu.id_pressed.connect( _id_pressed ) != OK: - printerr(" > id_pressed 信号连接方法失败") - - if not _as_separator: - _menu.add_item(_name) - else: - _menu.add_separator(_name) - - if _short.key != KEY_NONE: - var input = InputEventKey.new() - input.keycode = _short.key - input.ctrl_pressed = _short.ctrl - input.alt_pressed = _short.alt - input.shift_pressed = _short.shift - var shortcut = Shortcut.new() - shortcut.events.append(input) - _menu.set_item_shortcut(_id, shortcut) - - return _id - - -#============================================================ -# 连接信号 -#============================================================ -func _id_pressed(id): - if id == _id: - _method.call() diff --git a/DungeonShooting_Godot/addons/script_comment_menu/util/popup_menu_util.gd b/DungeonShooting_Godot/addons/script_comment_menu/util/popup_menu_util.gd deleted file mode 100644 index e000a24..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/util/popup_menu_util.gd +++ /dev/null @@ -1,62 +0,0 @@ -extends RefCounted - - -static func find_popup_menu_id(popup: PopupMenu, item_name: String) -> int: - for idx in popup.get_item_count(): - # 找到这个菜单 - if popup.get_item_text(idx) == item_name: - return idx - return -1 - - -static func add_popup_shortcut( - popup: PopupMenu - , item_name: String - , keycode: int - , ctrl : bool - , alt : bool - , shift : bool -): - var idx = find_popup_menu_id(popup, item_name) - if idx > -1: - var shortcut = Shortcut.new() - var input = InputEventKey.new() - input.keycode = keycode - input.ctrl_pressed = ctrl - input.alt_pressed = alt - input.shift_pressed = shift - shortcut.events.append(input) - popup.set_item_shortcut(idx, shortcut) - else: - printerr("没有这个名称 ", item_name, " 的菜单项") - - - -var _popup_data := {} -func connect_popup_item(popup: PopupMenu, item_name: String, target: Object, method: String) -> int: - var idx = find_popup_menu_id(popup, item_name) - if idx > -1: - if not popup.id_pressed.is_connected(self._popup_id_pressed): - popup.id_pressed.connect(self._popup_id_pressed.bind(popup)) - if not _popup_data.has(popup): - _popup_data[popup] = {} - if not _popup_data[popup].has(idx): - _popup_data[popup][idx] = [] - # 记录这个菜单的 id 的点击数据 - _popup_data[popup][idx].append({ - "target": target, - "method": method, - }) - else: - printerr("这个菜单 popup 没有 ", item_name, " 的菜单项") - - return idx - - -func _popup_id_pressed(idx: int, popup: PopupMenu): - if _popup_data.has(popup): - var connected_data_list : Array = _popup_data[popup][idx] - for data in connected_data_list: - var target : Object = data['target'] - var method : String = data['method'] - target.call(method) diff --git a/DungeonShooting_Godot/addons/script_comment_menu/util/script_editor_util.gd b/DungeonShooting_Godot/addons/script_comment_menu/util/script_editor_util.gd deleted file mode 100644 index 853dcaf..0000000 --- a/DungeonShooting_Godot/addons/script_comment_menu/util/script_editor_util.gd +++ /dev/null @@ -1,65 +0,0 @@ -extends EditorScript - - -## 当前代码编辑器 -func get_current_code_editor() -> TextEdit: - return (get_editor_interface() - .get_script_editor() - .get_current_editor() - .get_base_editor()) as TextEdit - - -## 当前脚本的代码 -func get_current_script_code() -> String: - return get_current_code_editor().text - - -var _script_popup_id : int = -1 -var _script_popup := {} -## 添加脚本弹窗 -## @return 返回添加的弹窗菜单的[code]id[/code] -func add_script_popup(popup: PopupMenu) -> int: - _script_popup_id += 1 - _script_popup[_script_popup_id] = popup - get_editor_interface().get_script_editor().add_child(popup) - return _script_popup_id - - -## 弹出菜单 -## @id 菜单 [code]id[/code] 为 [method add_script_popup]add_script_popup[/method] 后返回的值 -func popup_menu(id: int): - if _script_popup.has(id): - var editor = get_current_code_editor() as TextEdit - var popup : PopupMenu = _script_popup[id] - popup.position = (get_current_code_editor().global_position - + get_current_code_editor().get_caret_draw_pos() - + Vector2(0, 50) - ) - popup.popup() - -func get_current_script() -> Script: - return get_editor_interface() \ - .get_script_editor() \ - .get_current_script() - - -func insert_code_current_pos(code: String, insert_first: bool = false): - var textedit = get_current_code_editor() - if insert_first: - textedit.set_caret_column(0) - textedit.insert_text_at_caret(code) - - -func _run(): - pass - - var popup = PopupMenu.new() - popup.add_item("test_01") - popup.add_item("test_02") - popup.add_item("test_03") - var id = add_script_popup(popup) - popup_menu(id) - - await get_editor_interface().get_tree().create_timer(1).timeout - popup.queue_free() - diff --git a/DungeonShooting_Godot/addons/table_data_editor/column_width_test.gdata b/DungeonShooting_Godot/addons/table_data_editor/column_width_test.gdata deleted file mode 100644 index 71ec83c..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/column_width_test.gdata +++ /dev/null Binary files differ diff --git a/DungeonShooting_Godot/addons/table_data_editor/plugin.cfg b/DungeonShooting_Godot/addons/table_data_editor/plugin.cfg deleted file mode 100644 index 26cdea3..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="table-data-editor" -description="" -author="张学徒" -version="1.3" -script="plugin.gd" diff --git a/DungeonShooting_Godot/addons/table_data_editor/plugin.gd b/DungeonShooting_Godot/addons/table_data_editor/plugin.gd deleted file mode 100644 index 610cba5..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/plugin.gd +++ /dev/null @@ -1,64 +0,0 @@ -#============================================================ -# Plugin -#============================================================ -# - datetime: 2022-11-27 22:27:12 -#============================================================ -@tool -extends EditorPlugin - - -const MAIN = preload("src/table_data_editor/table_data_editor.tscn") - -var main := MAIN.instantiate() as TableDataEditor -# 第一次显示出来 -var first_show := false - - -func _ready(): - if Time.get_ticks_msec() < 5000: - await Engine.get_main_loop().create_timer(5).timeout - - main.visible = false - get_editor_interface().get_editor_main_screen().add_child(main) - main.call_deferred("set_anchors_preset", Control.PRESET_FULL_RECT) - main.set_deferred("size", main.get_parent().size) - main.get_child(0).set_deferred("size", main.size) - - # 创建新文件时进行扫描 - main.created_file.connect(func(path): - await Engine.get_main_loop().create_timer(0.1).timeout - get_editor_interface() \ - .get_resource_filesystem() \ - .scan.call_deferred() - ) - - -func _exit_tree() -> void: - main.queue_free() - -func _has_main_screen(): - return true - -func _make_visible(visible): - main.visible = visible - -func _get_plugin_name(): - return "TableDataEditor" - -func _get_plugin_icon(): - var icon = get_editor_interface() \ - .get_base_control() \ - .get_theme_icon("GridContainer", "EditorIcons") as Texture2D - - icon = icon.duplicate(true) - var image = icon.get_image() as Image - var image_size = image.get_size() - var color : Color - for x in image_size.x: - for y in image_size.y: - color = image.get_pixel(x, y) - if color.a != 0: - color = get_editor_interface().get_editor_settings().get_setting("text_editor/theme/highlighting/text_color") - image.set_pixel(x, y, color) - var texture = ImageTexture.create_from_image(image) - return texture diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/cache_data.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/cache_data.gd deleted file mode 100644 index a6b2eae..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/cache_data.gd +++ /dev/null @@ -1,86 +0,0 @@ -#============================================================ -# Project Data -#============================================================ -# - author: zhangxuetu -# - datetime: 2023-05-17 17:37:56 -# - version: 4.0 -#============================================================ -## 项目数据 -## -##整个表格项目中的之前的缓存数据,也可视作整个项目数据 -##[br]启动这个节点后 -class_name TableDataEditor_CacheData - - -const CACHE_DATA_PATH = "res://.godot/table_data_editor/~json_edit_grid_cache_data.gdata" - - -## 最后一次操作的文件的路径 -var last_operation_path : String = "" -# 最近打开过的文件 -var recently_opend_paths = {}: - set(v): - if v is Array: - recently_opend_paths = {} - for item in v: - recently_opend_paths[item] = null - elif v is Dictionary: - recently_opend_paths = v - else: - assert(false, "错误的数据类型") -# 弹窗路径 -var dialog_path : String = "" - - -#============================================================ -# SetGet -#============================================================ -func get_recently_opend_paths() -> Array: - if recently_opend_paths is Array: - return recently_opend_paths - return recently_opend_paths.keys() - - - -#============================================================ -# 自定义 -#============================================================ -static func instance() -> TableDataEditor_CacheData: - var script = TableDataEditor_CacheData as GDScript - const KEY = "instance" - if script.has_meta(KEY): - return script.get_meta(KEY) - - else: - var object = TableDataEditor_CacheData.new() - var data - if FileAccess.file_exists(CACHE_DATA_PATH): - var bytes = FileAccess.get_file_as_bytes(CACHE_DATA_PATH) - data = bytes_to_var(bytes) - if data is Dictionary: - TableDataUtil.Classes.set_property_by_dict(object, data) - - script.set_meta(KEY, object) - return object - - -## 保存数据 -static func save_data() -> void: - var data = TableDataUtil.Classes.get_dict_by_property(instance()) - TableDataUtil.Files.save_data(CACHE_DATA_PATH, data) - - -## 存在打开的文件 -func exists_opened_path() -> bool: - return last_operation_path != "" and FileAccess.file_exists(last_operation_path) - - -func update_last_operation_path(path: String): - path = path.strip_edges() - last_operation_path = path - if path != "": - if not recently_opend_paths is Dictionary: - recently_opend_paths = {} - if FileAccess.file_exists(path): - recently_opend_paths[path] = null - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/export_preview/export_preview_window.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/export_preview/export_preview_window.gd deleted file mode 100644 index 6077a84..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/export_preview/export_preview_window.gd +++ /dev/null @@ -1,284 +0,0 @@ -#============================================================ -# Export Preview -#============================================================ -# - author: zhangxuetu -# - datetime: 2022-11-27 17:45:09 -# - version: 4.0 -#============================================================ -# 预览导出 -@tool -class_name ExportPreviewWindow -extends Window - - -## 最大示例数量 -const EXAMPLE_COUNT : int = 5 - - -## 导出 json 数据 -signal exported(path: String, type, data) - - -@export_node_path("TableDataEditor") var _table_data_editor : NodePath -@onready var table_data_editor : TableDataEditor = get_node(_table_data_editor) - -var __init_node = InjectUtil.auto_inject(self, "_") -var _text_box : TextEdit -var _head_as_key_panel : Control -var _head_line_box : SpinBox -var _save_dialog : FileDialog -var _compact : CheckBox -var _select_items : Control -var _selected_item_param : Control -var _resource_class_name : LineEdit - - -## 指定的 head 列数对应的值内容。_head_map[列数] = 值内容 -var _head_map : Dictionary = {} -## 类型选项按钮组 -var _button_group : ButtonGroup - - -#============================================================ -# 内置 -#============================================================ -func _ready() -> void: - _button_group = _select_items.get_child(0).button_group as ButtonGroup - _button_group.pressed.connect(func(button): - for child in _selected_item_param.get_children(): - if child is Control: - child.visible = false - - var item_node : Control = _selected_item_param.get_node_or_null(str(button.name)) - if item_node: - item_node.visible = true - - update_text_box_content() - ) - - -#============================================================ -# SetGet -#============================================================ -## 获取头部字段行。列值对应字段值 -func get_head_map() -> Dictionary: - var head_row_number : int = _head_line_box.value - var data_set = table_data_editor.get_table_edit().get_data_set() - var head_row_data : Dictionary = data_set.grid_data.get(head_row_number, {}) - return head_row_data - - -## 将有值的行的数据进行保存 -func get_data_by_head_row() -> Array: - var result : Array = [] - var head_row_number : int = _head_line_box.value - var data_set = table_data_editor.get_table_edit().get_data_set() - var head_row_data : Dictionary = data_set.grid_data.get(head_row_number, {}) - head_row_number += 1 - for row in range(head_row_number, data_set.grid_data.size() + 1): - var data = {} - var row_data = data_set.grid_data[row] - for column in head_row_data: - data[head_row_data[column]] = row_data.get(column, "") - result.append(data) - return result - - -## 获取 CSV 格式数据 -func get_csv_data() -> Array[String]: - var data_set = table_data_editor.get_table_edit().data_set as TableDataEditor_TableDataSet - var max_column : int = data_set.get_max_column() - if max_column == 0: - return [] - - var csv_list : Array[String] = [] - for row in data_set.get_row_list(): - var line : Array = [] - for column in range(1, max_column + 1): - line.append( - JSON.stringify(data_set.get_value(Vector2i(column, row))) - ) - csv_list.append(",".join(line)) - - return csv_list - - -## 获取转为资源的数据 -func get_resources_by_path(path: String) -> Array[Resource]: - var head_row_data : Dictionary = get_head_map() - var head_row_number : int = _head_line_box.value - var data_set = table_data_editor.get_table_edit().get_data_set() - var row_list = data_set.get_row_list() - for idx in row_list.size(): - var row = row_list[idx] - if row > head_row_number: - row_list = row_list.slice(idx, row_list.size()) - break - - # 类名 - var r_class_name : String = _resource_class_name.text.strip_edges() - - # 属性列表 - var propertys : Array = [] - for column in head_row_data: - - # 寻找这个字段有数据的行,判断数据类型 - var value = "" - for row in row_list: - value = data_set.grid_data[row].get(column) - if value != "": - break - - # 判断数据类型 - var type = "String" - if value != "": - var json = JSON.parse_string(value) - match typeof(json): - TYPE_STRING, TYPE_NIL: type = "String" - TYPE_INT: type = "int" - TYPE_FLOAT: type = "float" - TYPE_BOOL: type = "bool" - TYPE_ARRAY: type = "Array" - TYPE_DICTIONARY: type = "Dictionary" - TYPE_COLOR: type = "Color" - TYPE_VECTOR2: type = "Vector2" - TYPE_VECTOR2I: type = "Vector2i" - TYPE_VECTOR3: type = "Vector3" - TYPE_VECTOR3I: type = "Vector3i" - TYPE_VECTOR4: type = "Vector4" - TYPE_VECTOR4I: type = "Vector4i" - _: "String" - - # 生成 @export s属性 - var property = head_row_data[column] - printt(column, property, value) - propertys.append("@export var %s : %s " % [property, type]) - - # 生成脚本 - var script = GDScript.new() - script.source_code = """# {ScriptName} -{ClassName}extends Resource - -{Propertys} -""".format({ - "ScriptName": path.get_file(), - "ClassName": ("class_name %s\n" % [r_class_name]) if r_class_name else "", - "Propertys": "\n".join(propertys), - }) - ResourceSaver.save(script, path) - - # 生成资源 - var resources : Array[Resource] = [] - var new_script = load(path) as GDScript - for row in row_list: - # 生成数据 - var data = {} - var row_data = data_set.grid_data[row] - for column in head_row_data: - data[head_row_data[column]] = row_data.get(column, "") - - # 生成资源。避免 new 时跟已有的类冲突造成的报错 - var resource = Resource.new() - resource.set_script(new_script) - for property in data: - resource[property] = data[property] - resources.append(resource) - - return resources - - - -#============================================================ -# 自定义 -#============================================================ -func _data_format(data) -> String: - return JSON.stringify(data, "" if _compact.button_pressed else "\t") - - -func _update_by_head_row(): - var data_list = get_data_by_head_row() - var examples = [] - for i in range(min(data_list.size(), EXAMPLE_COUNT)): - examples.append(data_list[i]) - _text_box.text = JSON.stringify(examples, "\t") - - -func _update_by_csv(): - var data_list = get_csv_data() - var examples = [] - for i in range(min(data_list.size(), EXAMPLE_COUNT)): - examples.append(data_list[i]) - _text_box.text = "\n".join(examples) - - -# 更新文本框的内容 -func update_text_box_content(): - _text_box.text = "" - match _button_group.get_pressed_button().name: - "json", "resource": - _update_by_head_row() - "csv": - _update_by_csv() - - - -#============================================================ -# 连接信号 -#============================================================ -func _on_head_line_box_value_changed(value: float) -> void: - update_text_box_content() - - -func _on_export_pressed() -> void: - var extension = str(_button_group.get_pressed_button().name) - if extension == "resource": - var r_class_name = _resource_class_name.text.strip_edges() - if r_class_name == "": - r_class_name = "res_0" - _save_dialog.current_file = r_class_name.to_snake_case() + ".gd" - - else: - _save_dialog.current_file = "new_file." + extension - - _save_dialog.popup_centered_ratio(0.5) - - -func _on_save_dialog_file_selected(path: String) -> void: - print(path) - var data - var type = str(_button_group.get_pressed_button().name) - match type: - "csv": - data = "\n".join(get_csv_data()) - TableDataUtil.Files.save_as_string( path, data ) - - # 导出的文件保持默认文件,不作为翻译文件 - var keep_import_path = path + ".import" - TableDataUtil.Files.save_as_string(keep_import_path, '[remap]\n\nimporter="keep"\n\n') - - "json": - data = get_data_by_head_row() - TableDataUtil.Files.save_as_string( path, _data_format(data) ) - - "resource": - data = get_resources_by_path(path) - var idx : int = 0 - var dir = path.get_base_dir() - var filename = path.get_file().get_basename() - for resource in data: - var file_path = dir.path_join("%s_%002d.tres" % [filename, idx]) - while FileAccess.file_exists(file_path): - idx += 1 - file_path = dir.path_join("%s_%002d.tres" % [filename, idx]) - ResourceSaver.save(resource, file_path) - idx += 1 - - _save_dialog.current_path = path - - self.hide() - print("[ ExportPreview ] 保存数据:", path) - self.exported.emit(path, type, data ) - - -func _on_cancel_pressed(): - self.hide() diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/export_preview/export_preview_window.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/export_preview/export_preview_window.tscn deleted file mode 100644 index 3d5ee97..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/export_preview/export_preview_window.tscn +++ /dev/null @@ -1,181 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://cqpmbxqgny2kq"] - -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/export_preview/export_preview_window.gd" id="1_h8l6h"] - -[sub_resource type="ButtonGroup" id="ButtonGroup_pxfjs"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_2ocp7"] - -[sub_resource type="InputEventKey" id="InputEventKey_s3ym3"] -pressed = true -keycode = 4194305 - -[sub_resource type="Shortcut" id="Shortcut_5m7cm"] -events = [SubResource("InputEventKey_s3ym3")] - -[node name="export_preview_window" type="Window"] -title = "Export" -size = Vector2i(800, 400) -wrap_controls = true -exclusive = true -script = ExtResource("1_h8l6h") - -[node name="export_preview" type="MarginContainer" parent="."] -editor_description = "导出预览" -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Panel" type="Panel" parent="export_preview"] -layout_mode = 2 - -[node name="MarginContainer" type="MarginContainer" parent="export_preview"] -layout_mode = 2 -theme_override_constants/margin_left = 4 -theme_override_constants/margin_top = 4 -theme_override_constants/margin_right = 4 -theme_override_constants/margin_bottom = 8 - -[node name="VBoxContainer" type="VBoxContainer" parent="export_preview/MarginContainer"] -layout_mode = 2 - -[node name="HSplitContainer" type="HSplitContainer" parent="export_preview/MarginContainer/VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -split_offset = 200 - -[node name="VBoxContainer" type="VBoxContainer" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer"] -layout_mode = 2 - -[node name="HBoxContainer" type="HBoxContainer" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer"] -layout_mode = 2 - -[node name="select_items" type="HBoxContainer" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="csv" type="CheckBox" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/select_items"] -layout_mode = 2 -button_pressed = true -button_group = SubResource("ButtonGroup_pxfjs") -text = "CSV" - -[node name="json" type="CheckBox" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/select_items"] -layout_mode = 2 -button_group = SubResource("ButtonGroup_pxfjs") -text = "JSON" - -[node name="resource" type="CheckBox" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/select_items"] -layout_mode = 2 -button_group = SubResource("ButtonGroup_pxfjs") -text = "Resource" - -[node name="VSeparator" type="VSeparator" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/separation = 16 - -[node name="selected_item_param" type="HBoxContainer" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="csv" type="HBoxContainer" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param"] -layout_mode = 2 -theme_override_constants/separation = 8 - -[node name="Label" type="Label" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param/csv"] -layout_mode = 2 -text = "delim" - -[node name="LineEdit" type="LineEdit" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param/csv"] -layout_mode = 2 -text = "," -placeholder_text = "表格间的分隔符,默认为 ," - -[node name="json" type="HBoxContainer" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param"] -visible = false -layout_mode = 2 - -[node name="Label" type="Label" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param/json"] -layout_mode = 2 -tooltip_text = "作为 key 的行" -text = "Key Row: " - -[node name="head_line_box" type="SpinBox" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param/json"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "作为 key 的行" -min_value = 1.0 -max_value = 10000.0 -value = 1.0 - -[node name="compact" type="CheckBox" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param/json"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -tooltip_text = "紧凑的格式导出,这样JSON会占用空间会最小。数据量不是非常大可以不用勾选" -text = "compact" - -[node name="resource" type="HBoxContainer" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param"] -visible = false -layout_mode = 2 - -[node name="Label" type="Label" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param/resource"] -layout_mode = 2 -text = "ClassName" - -[node name="resource_class_name" type="LineEdit" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param/resource"] -unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) -layout_mode = 2 -placeholder_text = "Class Name" - -[node name="Label" type="Label" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer"] -modulate = Color(1, 1, 1, 0.462745) -layout_mode = 2 -text = "Sample data in the first few lines..." - -[node name="text_box" type="TextEdit" parent="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -editable = false - -[node name="HBoxContainer" type="HBoxContainer" parent="export_preview/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="Control" type="Control" parent="export_preview/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="export" type="Button" parent="export_preview/MarginContainer/VBoxContainer/HBoxContainer"] -custom_minimum_size = Vector2(100, 32) -layout_mode = 2 -text = "Export" - -[node name="VSeparator" type="VSeparator" parent="export_preview/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/separation = 32 -theme_override_styles/separator = SubResource("StyleBoxEmpty_2ocp7") - -[node name="cancel" type="Button" parent="export_preview/MarginContainer/VBoxContainer/HBoxContainer"] -custom_minimum_size = Vector2(80, 0) -layout_mode = 2 -shortcut = SubResource("Shortcut_5m7cm") -text = "Cancel" - -[node name="Control3" type="Control" parent="export_preview/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="save_dialog" type="FileDialog" parent="."] -unique_name_in_owner = true -size = Vector2i(375, 161) -access = 2 -filters = PackedStringArray("*.json; JSON", "*.csv; CSV", "*.tres; TRES", "*.res; RES", "*.gd; GDScript") - -[connection signal="value_changed" from="export_preview/MarginContainer/VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/selected_item_param/json/head_line_box" to="." method="_on_head_line_box_value_changed"] -[connection signal="pressed" from="export_preview/MarginContainer/VBoxContainer/HBoxContainer/export" to="." method="_on_export_pressed"] -[connection signal="pressed" from="export_preview/MarginContainer/VBoxContainer/HBoxContainer/cancel" to="." method="_on_cancel_pressed"] -[connection signal="file_selected" from="save_dialog" to="." method="_on_save_dialog_file_selected"] diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/file_data.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/file_data.gd deleted file mode 100644 index d282f53..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/file_data.gd +++ /dev/null @@ -1,106 +0,0 @@ -#============================================================ -# File Data -#============================================================ -# - author: zhangxuetu -# - datetime: 2023-03-23 23:30:46 -# - version: 4.0 -#============================================================ -## 当前文件数据 -## -##新建/打开/存储 处理其中的数据。 -##[br]文件相关的数据都在这里保存,加载存储获取都在这里,这样保证数据不会乱 -class_name TableDataEditor_FileData - - -## 原始数据 -var origin_data : Dictionary -# 数据格式版本 -var version: - get: return 1_3_0 -# 数据集 -var data_set = TableDataEditor_TableDataSet.new(): - set(v): - data_set = TableDataEditor_TableDataSet.new(v) \ - if v is Dictionary \ - else v -## 列宽数据 -var column_width : Dictionary = {} -## 行高数据 -var row_height : Dictionary = {} -## 编辑框大小 -var edit_dialog_size : Vector2 = Vector2(100, 50) -## 文件路径 -var path : String = "" - - -#============================================================ -# SetGet -#============================================================ -func is_empty() -> bool: - return origin_data.is_empty() - -func is_new_file() -> bool: - return path.is_empty() - - -#============================================================ -# 内置 -#============================================================ -func _init(origin_data: Dictionary): - self.origin_data = origin_data - - # 加载旧版本数据 - var version = origin_data.get("version") - if not ((version is float or version is int) and version >= 1.3): - var grid_data : Dictionary = origin_data.get("grid_data", {}) - for coords in grid_data: - self.data_set.set_value(coords, grid_data[coords]) - - # 根据字典数据设置当前对象属性 - TableDataUtil.Classes.set_property_by_dict(self, origin_data) - - -#============================================================ -# 自定义 -#============================================================ -## 加载文件。 -static func load_file(path: String) -> TableDataEditor_FileData: - if FileAccess.file_exists(path): - var data = TableDataUtil.Files.load_file(path) - if not data is Dictionary: - var reader = FileAccess.open(path, FileAccess.READ) - if reader: - data = reader.get_var() - - if not data is Dictionary: - data = {} - - var file_data = TableDataEditor_FileData.new(data) - file_data.path = path - return file_data - else: - return TableDataEditor_FileData.new({}) - - -## 保存当前文件的数据 -##[br] -##[br][code]saved_path[/code] 保存到的路径,默认不传参数保存为当前路径, -##如果当前没有设置路径则会报错,所以第一次要传入路径进行保存 -func save_data(saved_path: String = "") -> bool: - if saved_path == "": - saved_path = self.path - self.path = saved_path - - assert(self.path.strip_edges() != "", "当前没有设置文件路径") - - # 获取数据 - var data : Dictionary = {} - var propertys = TableDataUtil.Classes.get_propertys(self.get_script()) - for property in propertys: - if property in self: - data[property] = self[property] - - data["data_set"] = data_set.get_config_data() - - return TableDataUtil.Files.save_data(self.path, data) - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/menu_list.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/menu_list.gd deleted file mode 100644 index 1378434..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/menu_list.gd +++ /dev/null @@ -1,331 +0,0 @@ -#============================================================ -# Menu List -#============================================================ -# - author: zhangxuetu -# - datetime: 2022-11-27 01:01:10 -# - version: 4.0 -#============================================================ -## 菜单列表 -@tool -class_name MenuList -extends MenuBar - - -## 菜单被点击 -##[br] -##[br][code]idx[/code] 菜单的索引值 -##[br][code]menu_path[/code] 菜单路径 -signal menu_pressed(idx: int, menu_path: StringName) -## 复选框状态发生切换 -signal menu_check_toggled(idx: int, menu_path: StringName) - - -# 自动增长的菜单 idx。用以下面添加菜单项时记录添加的菜单的 idx -var _auto_increment_menu_idx := -1 -# 菜单路径对应 PopupMenu -var _menu_path_to_popup_menu_map := {} -# 菜单的 idx 对应的菜单路径 -var _idx_to_menu_path_map := {} -# 菜单路径对应的菜单 idx -var _menu_path_to_idx_map := {} -# 子节点路径 -var _child_menu_path_idx_list := {} - - -#===================================================== -# Set/Get -#===================================================== -## 获取弹窗菜单 -##[br] -##[br][code]menu_path[/code] 这个菜单路径的父弹窗菜单节点 -func get_menu(menu_path: StringName) -> PopupMenu: - return _menu_path_to_popup_menu_map.get(menu_path) as PopupMenu - - -## 添加快捷键 -##[br] -##[br][code]menu_path[/code] 菜单路径 -##[br][code]data[/code] 快捷键数据,示例数据:ctrl + shift + C 快捷键 -##[codeblock] -##{ -## "ctrl": true, -## "shift": true, -## "keycode": KEY_C, -##} -##[/codeblock] -func set_menu_shortcut(menu_path: StringName, data: Dictionary): - var shortcut = Shortcut.new() - var input = InputEventKey.new() - shortcut.events.append(input) - input.keycode = data.get("keycode", 0) - input.ctrl_pressed = data.get("ctrl", false) - input.alt_pressed = data.get("alt", false) - input.shift_pressed = data.get("shift", false) - - var popup_menu := _menu_path_to_popup_menu_map.get(menu_path) as PopupMenu - var menu_name = menu_path.get_file() - if popup_menu: - for i in popup_menu.item_count: - if popup_menu.get_item_text(i) == menu_name: - popup_menu.set_item_shortcut(i, shortcut) - break - - - -# 获取菜单的 ID -func _get_menu_id(menu_path: String) -> int: - return _menu_path_to_idx_map.get(menu_path, -1) - -func _execute_menu_by_path(menu_path: StringName, method_name: String, params: Array = []): - var menu = get_menu(menu_path) - var idx = get_menu_idx(menu_path) - if menu and idx > 0: - return menu.call(method_name, params) - return null - -## 设置菜单的可用性 -func set_menu_disabled_by_path(menu_path: StringName, value: bool): - var menu = get_menu(menu_path) - var idx = get_menu_idx(menu_path) - if menu and idx > -1: - menu.set_item_disabled(idx, value) - -func set_menu_as_checkable(menu_path: StringName, value: bool): - var menu = get_menu(menu_path) - var idx = get_menu_idx(menu_path) - if menu and idx > 0: - menu.set_item_as_checkable(idx, value) - -func set_menu_check_by_path(menu_path: StringName, value: bool): - var menu = get_menu(menu_path) - var idx = get_menu_idx(menu_path) - if menu and idx > 0 and menu.is_item_checked(idx) != value: - menu.set_item_checked(idx, value) - self.menu_check_toggled.emit(idx, menu_path) - -func get_menu_check_by_path(menu_path: StringName) -> bool: - var menu = get_menu(menu_path) - var idx = get_menu_idx(menu_path) - if menu and idx > 0: - return menu.is_item_checked(idx) - return false - -func toggle_menu_check_by_path(menu_path: StringName) -> bool: - return _execute_menu_by_path(menu_path, "is_item_checked", []) - -## 获取这个菜单的索引,如果不存在这个菜单,则返回 [code]-1[/code] -func get_menu_idx(menu_path: StringName) -> int: - var id = _menu_path_to_idx_map.get(menu_path, -1) - var menu = get_menu(menu_path) - if menu == null: - var parent_path = get_parent_menu_path(menu_path) - menu = get_menu(parent_path) - return menu.get_item_index(id) - - -## 获取这个索引的菜单路径 -func get_menu_path(menu_path: StringName) -> StringName: - var idx = get_menu_idx(menu_path) - return _idx_to_menu_path_map.get(idx, "") - - -## 是否有这个菜单路径 -func has_menu_path(menu_path: StringName) -> bool: - return _menu_path_to_popup_menu_map.has(menu_path) - - -## 获取父菜单路径 -func get_parent_menu_path(menu_path: StringName) -> StringName: - var idx : int = _menu_path_to_idx_map.get(menu_path, -1) - if idx == -1: - return "" - for parent_path in _child_menu_path_idx_list: - var list = _child_menu_path_idx_list[parent_path] as Array - if list.has(idx): - return parent_path - return "" - - -#===================================================== -# 自定义方法 -#===================================================== -## 初始化菜单。示例: -## [codeblock] -## init_menu({ -## "File": ["Open", "Save", "Save As", { -## "Export As...": [ "Export PNG", "Export JPG" ] -## } ], -## "item": { -## "letter": ["a", "b", "c"], -## "number": [ "1", "2"], -## }, -## }) -## [/codeblock] -func init_menu(data: Dictionary): - add_menu(data, "/") - - -## 初始化快捷键,需要添加对应菜单。示例: -##[codeblock] -##{ -## "/File/Open": {"keycode": KEY_O, "ctrl": true}, -## "/File/Save": {"keycode": KEY_S, "ctrl": true}, -##} -##[/codeblock] -func init_shortcut(data_list: Dictionary): - var data : Dictionary - for menu_path in data_list: - data = data_list[menu_path] - set_menu_shortcut(menu_path, data) - - -## 添加菜单项 -##[br] -##[br][code]menu_data[/code] 这个菜单项包含的数据 -##[br][code]parent_menu_path[/code] 父级菜单路径 -func add_menu(menu_data, parent_menu_path: StringName): - var parent_popup_menu : PopupMenu = get_menu(parent_menu_path) - - _auto_increment_menu_idx += 1 - - # 不是根路径时 - if parent_menu_path != "/": - # Dictionary - if menu_data is Dictionary: - for menu_name in menu_data: - add_menu( menu_data[menu_name], parent_menu_path.path_join(menu_name)) - - # Array - elif menu_data is Array: - for data in menu_data: - add_menu(data, parent_menu_path) - - # String - elif menu_data is String or menu_data is StringName: - # 添加菜单 - if not _menu_path_to_popup_menu_map.has(parent_menu_path): - create_menu(parent_menu_path, null) - parent_popup_menu = get_menu(parent_menu_path) - # 不是 Array 和 Dictionary 类型时,只能是 String 类型了 - var menu_name := StringName(menu_data) - if not menu_name.begins_with("-"): - var menu_path := "%s/%s" % [parent_menu_path, menu_name] - # 添加菜单项 - parent_popup_menu.add_item(menu_name, _auto_increment_menu_idx) - _idx_to_menu_path_map[_auto_increment_menu_idx] = menu_path - _menu_path_to_idx_map[menu_path] = _auto_increment_menu_idx - _menu_path_to_popup_menu_map[menu_path] = parent_popup_menu - if not _child_menu_path_idx_list.has(parent_menu_path): - _child_menu_path_idx_list[parent_menu_path] = [] - _child_menu_path_idx_list[parent_menu_path].append(_auto_increment_menu_idx) - - else: - parent_popup_menu.add_separator() - - else: - assert(false, "错误的数据类型:" + str(typeof(menu_data)) ) - - else: - - # 根菜单按钮 - for menu_name in menu_data: - # 添加菜单按钮 - - var menu := PopupMenu.new() - menu.name = menu_name - add_child(menu) - - # 设置属性 - var menu_path = parent_menu_path.path_join(menu_name) - _set_popup_menu(menu_path, menu) - - # 添加这个按钮菜单的子菜单 - add_menu(menu_data[menu_name], menu_path) - - -## 移除菜单 -func remove_menu(menu_path: StringName) -> bool: - if has_menu_path(menu_path): - # 移除子菜单及其数据 - var child_menu_idx_list = _child_menu_path_idx_list.get(menu_path, []) - for child_menu_idx in child_menu_idx_list: - var child_menu_path = get_menu_idx(child_menu_idx) - if has_menu_path(child_menu_path): - remove_menu(child_menu_path) - - # 移除自身数据 - var idx = get_menu_idx(menu_path) - - # 移除菜单节点 - var menu = get_menu(menu_path) as PopupMenu - if menu != null: - menu.queue_free() - else: - var parent_menu_path = get_parent_menu_path(menu_path) - var parent_menu = get_menu(parent_menu_path) - parent_menu.remove_item(idx) - - _menu_path_to_popup_menu_map.erase(menu_path) - _menu_path_to_idx_map.erase(menu_path) - _idx_to_menu_path_map.erase(idx) - return true - return false - - -## 清空菜单 -func clear_menu(menu_path: StringName) -> bool: - if has_menu_path(menu_path): - var menu = get_menu(menu_path) - if menu != null: - menu.clear() - return true - return false - - -## 创建菜单 -##[br] -##[br][code]menu_path[/code] 菜单路径 -##[br][code]parent_menu[/code] 父级菜单 -func create_menu(menu_path: StringName, parent_menu: PopupMenu): - # 切分菜单名 - var parent_menu_names := menu_path.split("/") - # 因为切分后 0 索引都是空字符串,所以移除 - parent_menu_names.remove_at(0) - - # 逐个添加菜单 - parent_menu = get_menu("/" + "/".join(parent_menu_names.slice(0, 1))) - for i in parent_menu_names.size(): - var sub_menu_path = "/" + "/".join(parent_menu_names.slice(0, i + 1)) - # 没有这个菜单则添加 - if not _menu_path_to_popup_menu_map.has(sub_menu_path): - var menu_name = parent_menu_names[i] - var menu_popup = _create_popup_menu(sub_menu_path) - _menu_path_to_popup_menu_map[sub_menu_path] = menu_popup - parent_menu.add_child(menu_popup) - parent_menu.add_submenu_item( menu_name, menu_name ) - # 开始记录这个菜单,用以这个菜单的下一级别的菜单 - parent_menu = get_menu(sub_menu_path) - - - -#===================================================== -# 连接信号 -#===================================================== -# 创建这个路径的菜单 -func _create_popup_menu(path: StringName) -> PopupMenu: - var menu_popup = PopupMenu.new() - menu_popup.name = path.get_file() - _set_popup_menu(path, menu_popup) - return menu_popup - - -# 设置菜单属性 -func _set_popup_menu(menu_path: StringName, menu_popup: PopupMenu): - self._menu_path_to_popup_menu_map[menu_path] = menu_popup - # 点击菜单时 - menu_popup.id_pressed.connect(func(id): - self.menu_pressed.emit(id, _idx_to_menu_path_map[id]) - ) - - - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_data_editor.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_data_editor.gd deleted file mode 100644 index e533e12..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_data_editor.gd +++ /dev/null @@ -1,456 +0,0 @@ -#============================================================ -# Json Editor -#============================================================ -# - datetime: 2022-11-27 01:31:14 -#============================================================ -## JSON 数据编辑器 -## -##这里将各独立的组件组合起来,功能整合 -@tool -class_name TableDataEditor -extends MarginContainer - - -## 没有保存文件时的颜色 -const NOT_SAVED_COLOR = Color(1, 0.65, 0.275, 1) -## 保存文件后的颜色 -const SAVED_COLOR = Color(1, 1, 1, 0.625) -## 最大显示的最近打开的文件数量 -const RECENTLY_OPEND_MAX_COUNT = 10 - - -## 文件弹窗文件过滤 -const FILTERS = ["*.gdata; GData"] -## 菜单项数据 -const MENU_ITEM : Dictionary = { - "File": [ - "New", "Open", {"Recently Opened": ["/"]}, "-", - "Save", "Save As...", "-", - "Export...", - "Import...", - ], - "Edit": [ - "Undo", "Redo", "-", - "Double click edit" - ], - "Help": ["Help"], -} -## 菜单快捷键 -const MENU_SHORTCUT : Dictionary = { - "/File/New": { "keycode": KEY_N, "ctrl": true }, - "/File/Open": { "keycode": KEY_O, "ctrl": true }, - "/File/Save": { "keycode": KEY_S, "ctrl": true }, - "/File/Save As...": { "keycode": KEY_S, "ctrl": true, "shift": true }, - "/File/Export...": { "keycode": KEY_E, "ctrl": true }, - "/File/Import...": { "keycode": KEY_I, "ctrl": true }, - "/Edit/Undo": {"keycode": KEY_Z, "ctrl": true}, - "/Edit/Redo": {"keycode": KEY_Z, "ctrl": true, "shift": true}, -} -const MENU_CHECKABLE : Array = [ - "/Edit/Double click edit", -] - - -## 创建新的文件 -signal created_file(path: String) - - -# 保存到的文件路径 -var _saved_path : String = "" : - set(v): - _saved_path = v - _file_path_label.text = _saved_path -# 是否已保存 -var _saved: bool = true: - set(v): - _saved = v - if _saved_status_label == null: - await ready - if _saved: - _saved_status_label.text = "(saved)" - _saved_status_label.self_modulate = SAVED_COLOR - else: - _saved_status_label.text = "(unsaved)" - _saved_status_label.self_modulate = NOT_SAVED_COLOR - -# 行映射。记录哪些行有数据 -var _has_value_row_map := {} -# 列映射。记录哪些列有数据 -var _has_value_column_map := {} -# 撤销重做 -var _undo_redo : UndoRedo = UndoRedo.new() - -# 上次打开的文件路径 -var _dialog_path : String = "" -# 是否已加载完成 -var _is_reloaded := false : - set(v): - if _is_reloaded == false: - _is_reloaded = v - - -var __init_node = InjectUtil.auto_inject(self, "_") - - -var _table_edit : TableEdit # 编辑表格节点 -var _menu_list : MenuList # 菜单列表 -var _scroll_pos : LineEdit # 滚动条位置输入框 -var _pages : ItemList # 切换页面(暂未开始实现功能) -var _export_preview_window : ExportPreviewWindow -var _confirm_dialog : ConfirmationDialog -var _tooltip_dialog : AcceptDialog -var _save_as_dialog : FileDialog -var _open_file_dialog : FileDialog -var _import_dialog : FileDialog -var _saved_status_label : Label -var _file_path_label : Label -var _prompt_message : Label -var _prompt_message_player : AnimationPlayer - - -var file_data := TableDataEditor_FileData.new({}) -var cache_data := TableDataEditor_CacheData.instance() - - - -#============================================================ -# SetGet -#============================================================ -## 获取编辑表格对象 -func get_table_edit() -> TableEdit: - return _table_edit - - -#============================================================ -# 内置 -#============================================================ -func _ready() -> void: - file_data = TableDataEditor_FileData.new({}) - cache_data = TableDataEditor_CacheData.instance() - - (func(): - _saved_path = "" - - _init_dialog() - _init_menu() - - _load_last_cache_data() - - _is_reloaded = true - - ).call_deferred() - - -func _exit_tree(): - if not Engine.is_editor_hint() or TableDataUtil.Editor.is_enabled(): - cache_data.save_data() - - -#============================================================ -# 私有方法 -#============================================================ -# 新建文件 -func _new_file() -> void: - load_file_path("") - - -# 初始化菜单列表 -func _init_menu(): - # TODO: 最近打开的文件替换增加数据 - _menu_list.init_menu(MENU_ITEM) - # 设置快捷键 - _menu_list.init_shortcut(MENU_SHORTCUT) - - _menu_list.set_menu_disabled_by_path("/Edit/Undo", true) - _menu_list.set_menu_disabled_by_path("/Edit/Redo", true) - - for menu_path in MENU_CHECKABLE: - _menu_list.set_menu_as_checkable(menu_path, true) - _menu_list.set_menu_check_by_path("/Edit/Double click edit", true) - - -# 初始化弹窗 -func _init_dialog(): - - # 数据导出预览 - _export_preview_window.close_requested.connect( func(): _export_preview_window.visible = false ) - - # 添加文件类型var FILTERS = ["*.gdata; GData"] - _open_file_dialog.filters = FILTERS - _save_as_dialog.filters = FILTERS - _import_dialog.filters = ["*.csv; CSV"] - - # 打开窗口的路径位置 - var callable = func(dialog: FileDialog): - if dialog.current_dir != _dialog_path: - _dialog_path = dialog.current_dir - _open_file_dialog.visibility_changed.connect(callable.bind(_open_file_dialog)) - _save_as_dialog.visibility_changed.connect(callable.bind(_save_as_dialog)) - - -# 加载上次缓存的数据 -func _load_last_cache_data(): - for dialog in [_open_file_dialog, _save_as_dialog, _import_dialog]: - dialog.current_dir = cache_data.dialog_path - dialog.visibility_changed.connect(func(): - if not dialog.visible: - cache_data.dialog_path = dialog.current_dir - ) - - if cache_data.exists_opened_path(): - load_file_path(cache_data.last_operation_path) - - # 添加打开过的路径 - const RECENTLY_OPEND_MENU = "/File/Recently Opened" - var list : Array = cache_data.get_recently_opend_paths() - list.reverse() - for idx in range(min(list.size(), RECENTLY_OPEND_MAX_COUNT)): - var path = list[idx] - if FileAccess.file_exists(path): - _menu_list.add_menu(path, RECENTLY_OPEND_MENU) - - -#============================================================ -# 自定义 -#============================================================ -## 显示提示信息 -func display_prompt_message(message: String, color: Color = Color.WHITE) -> void: - _prompt_message.text = message - _prompt_message.modulate = color - _prompt_message_player.stop() - _prompt_message_player.play("flicker") - - -## 加载路径的数据 -##[br] -##[br][code]path[/code] 加载这个路径的数据,如果为空字符串,则是为临时数据,保存时会弹窗保存位置 -func load_file_path(path: String): - # 这个文件的数据 - load_file_data(TableDataEditor_FileData.load_file(path)) - - _saved_path = path - - cache_data.update_last_operation_path(_saved_path) - cache_data.save_data() - - -## 加载文件数据 -##[br] -##[br][code]file_data[/code] 加载文件数据 -func load_file_data(file_data: TableDataEditor_FileData): - self.file_data = file_data - - # 加载到表格中 - (func(): - _table_edit.row_to_height_map = file_data.row_height - _table_edit.column_to_width_map = file_data.column_width - _table_edit.data_set = file_data.data_set - - _table_edit.get_edit_dialog().box_size = file_data.edit_dialog_size - _table_edit.update_cell_list() - ).call_deferred() - - # 其他 - _saved = true - _saved_path = "" - - _undo_redo.clear_history() - _menu_list.set_menu_disabled_by_path("/Edit/Undo", true) - _menu_list.set_menu_disabled_by_path("/Edit/Redo", true) - - _table_edit.get_edit_dialog().showed = false - - -## 保存数据到这个路径中 -func save_data_to(path: String): - if file_data.save_data(path): - # 保存成功,则进行处理 - self._saved = true - self._saved_path = path - cache_data.update_last_operation_path(path) - cache_data.save_data() - - self.created_file.emit(path) - - display_prompt_message("保存成功. %s" % [Time.get_datetime_string_from_system().replace("T", " ")]) - print("[ TableDataEditor ] 保存成功 ", Time.get_datetime_string_from_system()) - - else: - display_prompt_message("保存失败") - printerr("[ TableDataEditor ] 保存失败") - - -## 保存为 JSON -func save_as_json(path: String): - var data = _table_edit.data_set.get_origin_data() - TableDataUtil.Files.save_as_string(path, data) - self.created_file.emit(path) - - -## 显示保存 Dialog -func show_save_dialog(default_file_name: String = ""): - if default_file_name != "": - _save_as_dialog.current_file = default_file_name - _save_as_dialog.popup_centered_ratio(0.5) - - -## 导入文件 -func import_file(path: String): - const FILE_TYPE = ["csv"] - if not path.get_extension() in FILE_TYPE: - display_prompt_message("错误的文件类型:%s。暂不支持 %s 以外的文件类型" % [ - path.get_extension(), FILE_TYPE - ]) - assert(false, "错误的文件类型") - - # 加载 csv数据 到 数据集 中 - var data_set = TableDataEditor_TableDataSet.new() - var csv_lines = TableDataUtil.Files.read_csv_file(path) - - var line : PackedStringArray - for row in csv_lines.size(): - line = csv_lines[row] - for column in line.size(): - data_set.set_value(Vector2i(column, row) + Vector2i.ONE, line[column]) - - # 加载数据 - var tmp_file_data = file_data.load_file("") - tmp_file_data.data_set = data_set - load_file_data(tmp_file_data) - - cache_data.dialog_path = path - cache_data.save_data() - - - -#============================================================ -# 连接信号 -#============================================================ -func _on_table_edit_cell_value_changed(cell: InputCell, coords: Vector2i, previous: String, value: String): - _saved = false - -# print("[ TableDataEditor ] 单元格发生改变") - - # 记录存在有数据的行列 - _undo_redo.create_action("修改单元格的值") - _undo_redo.add_do_method( _table_edit.alter_value.bind(coords, value, false) ) - _undo_redo.add_do_method( _table_edit.update_cell_list ) - _undo_redo.add_undo_method( _table_edit.alter_value.bind(coords, previous, false) ) - _undo_redo.add_undo_method( _table_edit.update_cell_list ) - _undo_redo.commit_action() - - # 撤销可用性 - _menu_list.set_menu_disabled_by_path("/Edit/Undo", false) - - -func _on_table_edit_scroll_changed(coords: Vector2i): - _scroll_pos.text = str(coords) - - -func _on_scroll_pos_text_submitted(new_text): - var re = RegEx.new() - re.compile("(\\d+)\\s*,\\s*(\\d+)") - var result = re.search(new_text) - if result == null: - return - - var pos = str_to_var("Vector2i(%s, %s)" % [result.get_string(1), result.get_string(2)]) - if pos is Vector2i: - _table_edit.scroll_to(pos) - print("[ TableDataEditor ] 跳转到位置:", pos) - - -func _on_menu_list_menu_pressed(idx, menu_path: StringName): -# print_debug("[ TableDataEditor ] 点击菜单 ", menu_path) - - match menu_path: - "/File/New": - if not _saved: - _confirm_dialog.dialog_text = "当前还没有保存,是否要继续创建?" - _confirm_dialog.popup_centered() - else: - _new_file() - - "/File/Open": - _open_file_dialog.popup_centered_ratio(0.5) - - "/File/Save": - if _saved_path == "": - show_save_dialog() - else: - save_data_to(_saved_path) - - "/File/Save As...": - show_save_dialog("new_file.gdata") - - "/File/Export...": - _export_preview_window.popup_centered_ratio(0.5) - _export_preview_window.update_text_box_content() - - "/File/Import...": - _import_dialog.popup_centered_ratio(0.5) - - "/Edit/Undo": - _undo_redo.undo() - _menu_list.set_menu_disabled_by_path("/Edit/Undo", not _undo_redo.has_undo()) - _menu_list.set_menu_disabled_by_path("/Edit/Redo", false) - - "/Edit/Redo": - _undo_redo.redo() - _menu_list.set_menu_disabled_by_path("/Edit/Redo", not _undo_redo.has_redo()) - _menu_list.set_menu_disabled_by_path("/Edit/Undo", false) - - "/Edit/Double click edit": - var status = _menu_list.get_menu_check_by_path("/Edit/Double click edit") - _menu_list.set_menu_check_by_path("/Edit/Double click edit", not status) - _table_edit.double_click_edit = not status - - "/Help/Help": - _tooltip_dialog.popup_centered() - - _: - # 最近打开的文件 - if menu_path.contains("/File/Recently Opened"): - var file_path = menu_path.trim_prefix("/File/Recently Opened/") - if FileAccess.file_exists(file_path): - load_file_path(file_path) - - else: - printerr("文件不存在") - _menu_list.remove_menu(menu_path) - - -func _on_save_as_dialog_file_selected(path): - _saved_path = path - match _saved_path.get_extension(): - "gdata": - save_data_to( _saved_path ) - "json": - save_as_json( _saved_path ) - _: - display_prompt_message("错误的文件类型:%s" % [ _saved_path.get_extension() ]) - printerr("[ TableDataEditor ] ", _saved_path.get_extension()) - - -func _on_export_preview_window_exported(path, type, data): - _export_preview_window.visible = false - display_prompt_message("已导出 %s 资源" % [type]) - self.created_file.emit(path) - - -func _on_open_file_dialog_file_selected(path: String): - cache_data.dialog_path = path.get_base_dir() - load_file_path(path) - - -func _on_file_path_label_gui_input(event): - if event is InputEventMouseButton: - if event.button_index == MOUSE_BUTTON_LEFT and event.double_click: - if _saved_path != "" and DirAccess.dir_exists_absolute(_saved_path.get_base_dir()): - var path = TableDataUtil.Files.get_absolute_path(_saved_path) - OS.shell_open(path.get_base_dir()) - - -func _on_table_edit_popup_edit_box_size_changed(box_size): - file_data.edit_dialog_size = box_size - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_data_editor.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_data_editor.tscn deleted file mode 100644 index 120a8dd..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_data_editor.tscn +++ /dev/null @@ -1,233 +0,0 @@ -[gd_scene load_steps=8 format=3 uid="uid://68vjwfxquvlf"] - -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_data_editor.gd" id="1_j3oce"] -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/menu_list.gd" id="2_o7gjv"] -[ext_resource type="PackedScene" uid="uid://ctppgkl2dpksd" path="res://addons/table_data_editor/src/table_data_editor/table_edit/table_edit.tscn" id="3_87xax"] -[ext_resource type="PackedScene" uid="uid://cqpmbxqgny2kq" path="res://addons/table_data_editor/src/table_data_editor/export_preview/export_preview_window.tscn" id="4_8p413"] - -[sub_resource type="Animation" id="Animation_jmtv6"] -length = 0.001 - -[sub_resource type="Animation" id="Animation_lfmqt"] -resource_name = "flicker" -length = 8.0 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:modulate:a") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 5, 8), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [0.0, 0.55, 1.0, 0.55, 1.0, 0.55, 1.0, 0.55, 1.0, 1.0, 0.0] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_xid6c"] -_data = { -"RESET": SubResource("Animation_jmtv6"), -"flicker": SubResource("Animation_lfmqt") -} - -[node name="table_data_editor" type="MarginContainer"] -clip_contents = true -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 2 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 2 -script = ExtResource("1_j3oce") - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -layout_mode = 2 - -[node name="menu_list" type="MenuBar" parent="VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -focus_mode = 1 -flat = true -script = ExtResource("2_o7gjv") - -[node name="GridContainer" type="HSplitContainer" parent="VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -split_offset = 120 - -[node name="pages" type="ItemList" parent="VBoxContainer/GridContainer"] -unique_name_in_owner = true -visible = false -layout_mode = 2 - -[node name="table_edit" parent="VBoxContainer/GridContainer" instance=ExtResource("3_87xax")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 - -[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"] -layout_mode = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/PanelContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 4 -theme_override_constants/margin_top = 2 -theme_override_constants/margin_right = 4 -theme_override_constants/margin_bottom = 2 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/PanelContainer/MarginContainer"] -layout_mode = 2 - -[node name="scroll_pos" type="LineEdit" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) -layout_mode = 2 -focus_mode = 1 -text = "(1, 1)" -alignment = 1 -select_all_on_focus = true - -[node name="MarginContainer3" type="MarginContainer" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 4 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 4 - -[node name="Panel" type="Panel" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer3"] -custom_minimum_size = Vector2(1, 0) -layout_mode = 2 - -[node name="Control" type="HBoxContainer" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -focus_mode = 1 - -[node name="prompt_message" type="Label" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/Control"] -unique_name_in_owner = true -modulate = Color(1, 1, 1, 0) -layout_mode = 2 -text = "(Prompt Message)" - -[node name="prompt_message_player" type="AnimationPlayer" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/Control/prompt_message"] -unique_name_in_owner = true -libraries = { -"": SubResource("AnimationLibrary_xid6c") -} - -[node name="MarginContainer2" type="MarginContainer" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 4 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 4 - -[node name="Panel" type="Panel" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer2"] -custom_minimum_size = Vector2(1, 0) -layout_mode = 2 - -[node name="file_path_label" type="Label" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -tooltip_text = "双击打开所在文件目录" -focus_mode = 1 -mouse_filter = 0 -text = "res://addons/table_data_editor/column_width_test.gdata" - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 4 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 4 - -[node name="Panel" type="Panel" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer"] -custom_minimum_size = Vector2(1, 0) -layout_mode = 2 - -[node name="saved_status_label" type="Label" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] -unique_name_in_owner = true -self_modulate = Color(1, 1, 1, 0.625) -layout_mode = 2 -size_flags_horizontal = 8 -focus_mode = 1 -text = "(saved)" - -[node name="export_preview_window" parent="." instance=ExtResource("4_8p413")] -unique_name_in_owner = true -position = Vector2i(0, -500) -visible = false -_table_data_editor = NodePath("..") - -[node name="confirm_dialog" type="ConfirmationDialog" parent="."] -unique_name_in_owner = true - -[node name="tooltip_dialog" type="AcceptDialog" parent="."] -unique_name_in_owner = true -gui_embed_subwindows = true -title = "Help" -size = Vector2i(500, 317) - -[node name="MarginContainer" type="MarginContainer" parent="tooltip_dialog"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 8.0 -offset_top = 8.0 -offset_right = -8.0 -offset_bottom = -49.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Label" type="Label" parent="tooltip_dialog/MarginContainer"] -layout_mode = 2 -size_flags_vertical = 0 -text = "双击单元格进行编辑 - -按住 Alt 键进行左右滚动,松开即可上下滚动 - -按住 Tab 键或 Enter 键进行切换到下一个编辑的单元格,如果同时按下 Shift 则是切换到上一个单元格 - - -" - -[node name="save_as_dialog" type="FileDialog" parent="."] -unique_name_in_owner = true -filters = PackedStringArray("*.gdata; GData") - -[node name="open_file_dialog" type="FileDialog" parent="."] -unique_name_in_owner = true -title = "Open a File" -size = Vector2i(312, 157) -ok_button_text = "打开" -file_mode = 0 -filters = PackedStringArray("*.gdata; GData") - -[node name="import_dialog" type="FileDialog" parent="."] -unique_name_in_owner = true -title = "Open a File" -size = Vector2i(295, 161) -ok_button_text = "打开" -file_mode = 0 -access = 2 -filters = PackedStringArray("*.csv; CSV") - -[connection signal="menu_pressed" from="VBoxContainer/menu_list" to="." method="_on_menu_list_menu_pressed"] -[connection signal="cell_value_changed" from="VBoxContainer/GridContainer/table_edit" to="." method="_on_table_edit_cell_value_changed"] -[connection signal="popup_edit_box_size_changed" from="VBoxContainer/GridContainer/table_edit" to="." method="_on_table_edit_popup_edit_box_size_changed"] -[connection signal="scroll_changed" from="VBoxContainer/GridContainer/table_edit" to="." method="_on_table_edit_scroll_changed"] -[connection signal="text_submitted" from="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/scroll_pos" to="." method="_on_scroll_pos_text_submitted"] -[connection signal="gui_input" from="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/file_path_label" to="." method="_on_file_path_label_gui_input"] -[connection signal="exported" from="export_preview_window" to="." method="_on_export_preview_window_exported"] -[connection signal="confirmed" from="confirm_dialog" to="." method="_new_file"] -[connection signal="file_selected" from="save_as_dialog" to="." method="_on_save_as_dialog_file_selected"] -[connection signal="file_selected" from="open_file_dialog" to="." method="_on_open_file_dialog_file_selected"] -[connection signal="file_selected" from="import_dialog" to="." method="import_file"] diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.gd deleted file mode 100644 index 74ee159..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.gd +++ /dev/null @@ -1,13 +0,0 @@ -#============================================================ -# Base Cell Element -#============================================================ -# - datetime: 2022-11-26 22:25:48 -#============================================================ -## 基础的单元格元素 -@tool -class_name BaseCellElement -extends MarginContainer - - - - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.tscn deleted file mode 100644 index 5f02d1f..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.tscn +++ /dev/null @@ -1,11 +0,0 @@ -[gd_scene load_steps=2 format=3] - -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.gd" id="1_wjxc7"] - -[node name="base_cell_element" type="MarginContainer"] -offset_right = 80.0 -offset_bottom = 32.0 -focus_mode = 2 -theme_override_constants/margin_right = 4 -theme_override_constants/margin_bottom = 4 -script = ExtResource("1_wjxc7") diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/input_cell/input_cell.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/input_cell/input_cell.gd deleted file mode 100644 index c5af1c7..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/input_cell/input_cell.gd +++ /dev/null @@ -1,145 +0,0 @@ -#============================================================ -# Input Cell -#============================================================ -# - datetime: 2022-11-26 18:12:34 -#============================================================ -##输入单元格 -@tool -class_name InputCell -extends MarginContainer - - -##单击单元格 -signal single_clicked -##双击单元格 -signal double_clicked -##水平方向拖拽 -##[br] -##[br][code]distance[/code] 为当前鼠标位置与第一次按下时鼠标位置的距离 -##[br][code]pressed_size[/code] 为点击时的节点的大小 -signal h_dragged(distance: float, pressed_node_size: Vector2i) -##垂直方向拖拽 -##[br] -##[br][code]distance[/code] 为当前鼠标位置与第一次按下时鼠标位置的距离 -##[br][code]pressed_size[/code] 为点击时的节点的大小 -signal v_dragged(distance: float, pressed_node_size: Vector2i) - - -var _data : String -var _latest_v_dragged := false -var _latest_h_dragged := false -var _latest_dragged := false - -# 点击时的鼠标位置 -var _pressed_mouse_pos: Vector2 -# 点击时节点的大小 -var _pressed_node_size: Vector2i -# 是否可以拖拽,防止 _event 发送速度过快 -var _enabled_dragged := true - - -@onready -var _text_edit := %text_edit as TextEdit -@onready -var _process_timer := %process_timer as Timer - - -#============================================================ -# SetGet -#============================================================ -func set_value(v: String): - _data = v - show_value(v) - -func get_value() -> String: - return _data - -func show_value(v): - _text_edit.text = v if v else "" - -## 值发生了改变 -func is_changed(): - return _text_edit.text != _data - - -#============================================================ -# 内置 -#============================================================ -func _ready(): -# _text_edit.gui_input.connect(self._gui_input) - - _text_edit.focus_entered.connect( func(): self.focus_entered.emit() ) - _text_edit.focus_exited.connect( func(): - self.focus_exited.emit() - if is_changed(): - set_value(_text_edit.text) - ) - set_process(false) - _process_timer.timeout.connect( set_process.bind(false) ) - self.mouse_entered.connect(func(): - set_process(true) - _process_timer.stop() - ) - self.mouse_exited.connect(func(): - _process_timer.start() - ) - - - -func _process(delta): - # 更新显示的鼠标图像 - var margin = custom_minimum_size - get_local_mouse_position() - if margin.x < self["theme_override_constants/margin_right"] and margin.y < self["theme_override_constants/margin_bottom"]: - self.mouse_default_cursor_shape = Control.CURSOR_MOVE - elif margin.x <= self["theme_override_constants/margin_right"]: - self.mouse_default_cursor_shape = Control.CURSOR_HSPLIT - elif margin.y <= self["theme_override_constants/margin_bottom"]: - self.mouse_default_cursor_shape = Control.CURSOR_VSPLIT - else: - if not(_latest_h_dragged or _latest_v_dragged): - self.mouse_default_cursor_shape = Control.CURSOR_ARROW - - _enabled_dragged = true - - -func _gui_input(event): - if event is InputEventMouseMotion: - if _enabled_dragged: - var diff = get_local_mouse_position() - _pressed_mouse_pos - if _latest_h_dragged: - self.custom_minimum_size.x = _pressed_node_size.x + diff.x - h_dragged.emit(self.custom_minimum_size.x - _pressed_node_size.x, _pressed_node_size) - _process_timer.stop() - if _latest_v_dragged: - self.custom_minimum_size.y = _pressed_node_size.y + diff.y - v_dragged.emit(self.custom_minimum_size.y - _pressed_node_size.y, _pressed_node_size) - _process_timer.stop() - _enabled_dragged = false - - elif event is InputEventMouseButton: - if event.pressed and event.button_index == MOUSE_BUTTON_LEFT: - var margin = custom_minimum_size - get_local_mouse_position() - if event.double_click: - self.double_clicked.emit() - else: - - _pressed_node_size = self.size - _pressed_mouse_pos = get_local_mouse_position() - - if margin.x <= self["theme_override_constants/margin_right"]: - _latest_h_dragged = true - if margin.y <= self["theme_override_constants/margin_bottom"]: - _latest_v_dragged = true - - self.single_clicked.emit() - - else: - self.mouse_default_cursor_shape = Control.CURSOR_ARROW - _latest_h_dragged = false - _latest_v_dragged = false - - var diff = self.custom_minimum_size - get_local_mouse_position() - if diff.x < 0 or diff.y < 0: - _process_timer.start() - - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/input_cell/input_cell.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/input_cell/input_cell.tscn deleted file mode 100644 index d03cf28..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/input_cell/input_cell.tscn +++ /dev/null @@ -1,124 +0,0 @@ -[gd_scene load_steps=16 format=3] - -[ext_resource type="PackedScene" path="res://addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.tscn" id="1_ney3p"] -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/cell/input_cell/input_cell.gd" id="2_y6m17"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_54uk8"] - -[sub_resource type="Image" id="Image_pbgwo"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 255, 255, 255, 41, 255, 255, 255, 67, 255, 255, 255, 67, 255, 255, 255, 40, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 41, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 67, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 67, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 67, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 67, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 40, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 255, 255, 255, 40, 255, 255, 255, 67, 255, 255, 255, 67, 255, 255, 255, 40, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 12, -"mipmaps": false, -"width": 12 -} - -[sub_resource type="ImageTexture" id="ImageTexture_o2enw"] -image = SubResource("Image_pbgwo") - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_hq7i2"] -content_margin_left = 2.0 -content_margin_top = 2.0 -content_margin_right = 2.0 -content_margin_bottom = 2.0 -texture = SubResource("ImageTexture_o2enw") -margin_left = 6.0 -margin_top = 6.0 -margin_right = 6.0 -margin_bottom = 6.0 -region_rect = Rect2(0, 0, 12, 12) - -[sub_resource type="Image" id="Image_s7tle"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 6, 248, 248, 248, 102, 249, 249, 249, 168, 249, 249, 249, 168, 248, 248, 248, 101, 213, 213, 213, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 248, 248, 248, 102, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 248, 248, 248, 101, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 249, 249, 249, 168, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 168, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 249, 249, 249, 168, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 248, 248, 248, 168, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 248, 248, 248, 101, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 250, 250, 250, 99, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 213, 213, 213, 6, 248, 248, 248, 101, 249, 249, 249, 168, 248, 248, 248, 168, 250, 250, 250, 99, 213, 213, 213, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 12, -"mipmaps": false, -"width": 12 -} - -[sub_resource type="ImageTexture" id="ImageTexture_pi2w1"] -image = SubResource("Image_s7tle") - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_daefy"] -content_margin_left = 2.0 -content_margin_top = 2.0 -content_margin_right = 2.0 -content_margin_bottom = 2.0 -texture = SubResource("ImageTexture_pi2w1") -margin_left = 5.0 -margin_top = 5.0 -margin_right = 5.0 -margin_bottom = 5.0 -region_rect = Rect2(0, 0, 12, 12) - -[sub_resource type="Image" id="Image_4ojul"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 213, 213, 213, 6, 180, 180, 180, 102, 181, 181, 181, 168, 181, 181, 181, 168, 179, 179, 179, 101, 170, 170, 170, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 180, 180, 180, 102, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 179, 179, 179, 101, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 181, 181, 181, 168, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 181, 181, 181, 168, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 181, 181, 181, 168, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 179, 179, 179, 168, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 179, 179, 179, 101, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 181, 181, 181, 99, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 170, 170, 170, 6, 179, 179, 179, 101, 181, 181, 181, 168, 179, 179, 179, 168, 181, 181, 181, 99, 170, 170, 170, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 12, -"mipmaps": false, -"width": 12 -} - -[sub_resource type="ImageTexture" id="ImageTexture_tvj35"] -image = SubResource("Image_4ojul") - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_x7jas"] -content_margin_left = 2.0 -content_margin_top = 2.0 -content_margin_right = 2.0 -content_margin_bottom = 2.0 -texture = SubResource("ImageTexture_tvj35") -margin_left = 6.0 -margin_top = 6.0 -margin_right = 6.0 -margin_bottom = 6.0 -region_rect = Rect2(0, 0, 12, 12) - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_eycgy"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_64aem"] - -[sub_resource type="Theme" id="Theme_cy8yd"] -HScrollBar/icons/decrement = null -HScrollBar/icons/decrement_highlight = null -HScrollBar/icons/decrement_pressed = null -HScrollBar/icons/increment = null -HScrollBar/icons/increment_highlight = null -HScrollBar/icons/increment_pressed = null -HScrollBar/styles/grabber = null -HScrollBar/styles/grabber_highlight = null -HScrollBar/styles/grabber_pressed = null -HScrollBar/styles/scroll = SubResource("StyleBoxEmpty_54uk8") -HScrollBar/styles/scroll_focus = null -VScrollBar/icons/decrement = null -VScrollBar/icons/decrement_highlight = null -VScrollBar/icons/decrement_pressed = null -VScrollBar/icons/increment = null -VScrollBar/icons/increment_highlight = null -VScrollBar/icons/increment_pressed = null -VScrollBar/styles/grabber = SubResource("StyleBoxTexture_hq7i2") -VScrollBar/styles/grabber_highlight = SubResource("StyleBoxTexture_daefy") -VScrollBar/styles/grabber_pressed = SubResource("StyleBoxTexture_x7jas") -VScrollBar/styles/scroll = SubResource("StyleBoxEmpty_eycgy") -VScrollBar/styles/scroll_focus = SubResource("StyleBoxEmpty_64aem") - -[node name="input_cell" instance=ExtResource("1_ney3p")] -custom_minimum_size = Vector2(80, 35) -offset_bottom = 35.0 -mouse_filter = 0 -script = ExtResource("2_y6m17") - -[node name="text_edit" type="TextEdit" parent="." index="0"] -unique_name_in_owner = true -offset_right = 76.0 -offset_bottom = 31.0 -mouse_filter = 2 -theme = SubResource("Theme_cy8yd") - -[node name="process_timer" type="Timer" parent="." index="1"] -unique_name_in_owner = true -wait_time = 2.0 -one_shot = true diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/serial_number_cell/serial_number_cell.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/serial_number_cell/serial_number_cell.gd deleted file mode 100644 index 9cf22d6..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/serial_number_cell/serial_number_cell.gd +++ /dev/null @@ -1,19 +0,0 @@ -#============================================================ -# Serial Number Cell -#============================================================ -# - datetime: 2022-11-26 22:33:13 -#============================================================ -# 序列号表格 -@tool -class_name SerialNumberCell -extends BaseCellElement - - -@onready -var label := $label as Label - - -func show_number(v: int): - if label == null: await ready - label.text = str(v) - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/serial_number_cell/serial_number_cell.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/serial_number_cell/serial_number_cell.tscn deleted file mode 100644 index c262db6..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/cell/serial_number_cell/serial_number_cell.tscn +++ /dev/null @@ -1,17 +0,0 @@ -[gd_scene load_steps=3 format=3] - -[ext_resource type="PackedScene" path="res://addons/table_data_editor/src/table_data_editor/table_edit/cell/base_cell_element.tscn" id="1_5yxaj"] -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/cell/serial_number_cell/serial_number_cell.gd" id="2_bf00s"] - -[node name="serial_number_cell" instance=ExtResource("1_5yxaj")] -offset_right = 50.0 -offset_bottom = 30.0 -theme_override_constants/margin_right = 8 -script = ExtResource("2_bf00s") - -[node name="label" type="Label" parent="." index="0"] -offset_right = 42.0 -offset_bottom = 26.0 -size_flags_vertical = 1 -text = "0" -vertical_alignment = 1 diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/edit_box_window/edit_box_window.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/edit_box_window/edit_box_window.gd deleted file mode 100644 index d356a90..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/edit_box_window/edit_box_window.gd +++ /dev/null @@ -1,136 +0,0 @@ -#============================================================ -# Edit Box Window -#============================================================ -# - author: zhangxuetu -# - datetime: 2023-03-19 11:48:30 -# - version: 4.0 -#============================================================ -@tool -class_name PopupEditBox -extends Control - - -signal popup_hide(text: String) -signal box_size_changed(box_size: Vector2) -signal input_switch_char(character: int) - - -@export -var text : String = "" : - set(v): - text = v - if not is_inside_tree(): await ready - if _edit_box.text != text: - _edit_box.text = text -@export -var showed : bool = true: - set(v): - if v != self.visible: - showed = v - self.visible = v -@export -var box_size: Vector2 : - set(v): - box_size = v - if not is_inside_tree(): await ready - if _edit_box.size != box_size: - _edit_box.size = box_size - get: - if _edit_box: - return _edit_box.size - return Vector2(0, 0) - - -@onready var _edit_box := %edit_box as TextEdit -@onready var _scale_rect := %scale_rect as Control - - -var _resize_pressed : bool = false -var _pressed_size : Vector2 = Vector2(0,0) -var _pressed_pos : Vector2 = Vector2(0,0) - - -#============================================================ -# SetGet -#============================================================ -func get_edit_box() -> TextEdit: - return _edit_box - -func get_text() -> String: - return _edit_box.text - - -#============================================================ -# 内置 -#============================================================ -func _ready(): - _edit_box.position = Vector2(0,0) - - _scale_rect.gui_input.connect(func(event): - if event is InputEventMouseMotion: - if _resize_pressed: - var diff_v = get_global_mouse_position() - _pressed_pos - _edit_box.size = _pressed_size + diff_v - - elif event is InputEventMouseButton: - if event.button_index == MOUSE_BUTTON_LEFT: - _resize_pressed = event.pressed - if _resize_pressed: - _pressed_size = _edit_box.size - _pressed_pos = get_global_mouse_position() - ) - - -#============================================================ -# 自定义 -#============================================================ -func popup(rect: Rect2 = Rect2()): - if _edit_box == null: await ready - - if rect.position != Vector2(): - _edit_box.global_position = rect.position - if rect.size != Vector2(): - _edit_box.size = rect.size - - # 聚焦编辑 - _edit_box.visible = true - _edit_box.set_caret_line( _edit_box.get_line_count() ) - _edit_box.set_caret_column( _edit_box.text.length() ) - self.showed = true - -# print("[ PopupEditBox ] 弹出窗口") - - # 取消焦点时隐藏 - var t = _edit_box.text - _edit_box.grab_focus() - _edit_box.focus_exited.connect(func(): - if t != _edit_box.text: - self.popup_hide.emit(_edit_box.text) - _edit_box.visible = false -# print("[ PopupEditBox ] 弹窗隐藏") - , Object.CONNECT_ONE_SHOT) - - -func _on_edit_box_resized(): - if _edit_box == null: await ready - self.box_size_changed.emit(_edit_box.size) - - -func _on_edit_box_gui_input(event): - if event is InputEventKey: - if event.pressed: - if not event.alt_pressed: - # Enter/Tab 切换单元格 - if event.keycode in [KEY_ENTER, KEY_KP_ENTER]: - self.input_switch_char.emit(KEY_ENTER) - get_tree().root.set_input_as_handled() - - elif event.keycode in [KEY_TAB]: - self.input_switch_char.emit(KEY_TAB) - get_tree().root.set_input_as_handled() - - else: - # Alt+Enter换行 - if event.keycode in [KEY_ENTER, KEY_KP_ENTER]: - _edit_box.insert_text_at_caret("\n") - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/edit_box_window/edit_box_window.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/edit_box_window/edit_box_window.tscn deleted file mode 100644 index ed890f1..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/edit_box_window/edit_box_window.tscn +++ /dev/null @@ -1,42 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://4xts0ha85fja"] - -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/edit_box_window/edit_box_window.gd" id="1_qj0ea"] - -[node name="popup_edit_box" type="Control"] -visible = false -layout_mode = 3 -anchors_preset = 0 -size_flags_horizontal = 0 -size_flags_vertical = 0 -mouse_filter = 2 -script = ExtResource("1_qj0ea") -box_size = Vector2(200, 120) - -[node name="edit_box" type="TextEdit" parent="."] -unique_name_in_owner = true -custom_minimum_size = Vector2(100, 30) -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = 200.0 -offset_bottom = 120.0 -grow_horizontal = 2 -grow_vertical = 2 -wrap_mode = 1 - -[node name="scale_rect" type="Control" parent="edit_box"] -unique_name_in_owner = true -layout_mode = 1 -anchor_left = 0.996 -anchor_top = 0.987 -anchor_right = 0.996 -anchor_bottom = 0.987 -offset_left = -0.200012 -offset_top = -0.440002 -offset_right = 7.79999 -offset_bottom = 7.56 -mouse_default_cursor_shape = 12 - -[connection signal="gui_input" from="edit_box" to="." method="_on_edit_box_gui_input"] -[connection signal="resized" from="edit_box" to="." method="_on_edit_box_resized"] diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/serial_number_container.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/serial_number_container.gd deleted file mode 100644 index c5baa17..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/serial_number_container.gd +++ /dev/null @@ -1,88 +0,0 @@ -#============================================================ -# Serial Number Container -#============================================================ -# - datetime: 2022-11-26 23:09:40 -#============================================================ -# 显示左上的数字序号的容器 -@tool -class_name SerialNumberContainer -extends GridContainer - - -## 显示序号的单元格场景 -@export var serial_number_cell : PackedScene - - -var __init_node = InjectUtil.auto_inject(self, "_", true) - -var _table_container : TableContainer -var _h_serial_number_container : HBoxContainer -var _v_serial_number_container : VBoxContainer -var _space : Control - - -var _last_top_left : Vector2i - - - -#============================================================ -# 自定义 -#============================================================ -## 更新横竖列数字 -##[br] -##[br][code]top_left[/code] 以 top_left 值开始向下更新 -func update_serial_number(top_left: Vector2i): - var serial_number : SerialNumberCell - for i in _h_serial_number_container.get_child_count(): - serial_number = _h_serial_number_container.get_child(i) as SerialNumberCell - serial_number.show_number(top_left.x + i) - for i in _v_serial_number_container.get_child_count(): - serial_number = _v_serial_number_container.get_child(i) as SerialNumberCell - serial_number.show_number(top_left.y + i) - _last_top_left = top_left - - _space.custom_minimum_size = Vector2(_v_serial_number_container.size.x, _h_serial_number_container.size.y) - if _space.custom_minimum_size == Vector2(0,0): - _space.custom_minimum_size = Vector2(27, 35) - -## 更新这个行高 -func update_row_height(origin_row: int, height: int): - if _v_serial_number_container.get_child_count() > 0: - var node = _v_serial_number_container.get_child(origin_row) as Control - node.custom_minimum_size.y = height - -## 更新这个列宽 -func update_column_width(origin_column: int, width: int): - if _h_serial_number_container.get_child_count() > 0: - var node = _h_serial_number_container.get_child(origin_column) as Control - node.custom_minimum_size.x = width - - -## 更新行列数字标题节点的数量 -func update_grid_cell_count(grid_size: Vector2i): - if _table_container == null: - while _table_container == null: - await get_tree().process_frame - - # 表格数量发生改变时添加序号节点单元格 - var tile_size = _table_container.get_tile_size() -# print_debug("单元格大小:", tile_size) - - # 水平单元格 - if grid_size.x > _h_serial_number_container.get_child_count(): - var diff_count = grid_size.x - _h_serial_number_container.get_child_count() - for i in diff_count: - var node = serial_number_cell.instantiate() as Control - node.custom_minimum_size = tile_size - _h_serial_number_container.add_child(node) - - # 垂直单元格 - if grid_size.y > _v_serial_number_container.get_child_count(): - var diff_count = grid_size.y - _v_serial_number_container.get_child_count() - for i in diff_count: - var node = serial_number_cell.instantiate() as Control - node.custom_minimum_size.y = tile_size.y - _v_serial_number_container.add_child(node) - - update_serial_number(_last_top_left) - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/column_container/column_container.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/column_container/column_container.gd deleted file mode 100644 index 518641f..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/column_container/column_container.gd +++ /dev/null @@ -1,39 +0,0 @@ -#============================================================ -# Line -#============================================================ -# - datetime: 2022-11-26 16:57:14 -#============================================================ -@tool -class_name ColumnContainer -extends MarginContainer - - -signal newly_added_cell(cell: Node) - - -@export -var item : PackedScene - - -@onready -var container := %container as HBoxContainer - - -func update_cell_amount(count: int): - if container == null: - await self.ready - if item: - var node - for i in count - container.get_child_count(): - node = item.instantiate() - container.add_child(node) - newly_added_cell.emit(node) - - -func get_cells(): - return container.get_children() - - -func get_cell(idx: int) -> Node: - return container.get_child(idx) - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/column_container/column_container.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/column_container/column_container.tscn deleted file mode 100644 index 71f2879..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/column_container/column_container.tscn +++ /dev/null @@ -1,18 +0,0 @@ -[gd_scene load_steps=2 format=3] - -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/table_container/column_container/column_container.gd" id="1_1xecd"] - -[node name="column_container" type="MarginContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_1xecd") -metadata/_edit_lock_ = true - -[node name="container" type="HBoxContainer" parent="."] -unique_name_in_owner = true -offset_right = 1152.0 -offset_bottom = 648.0 -theme_override_constants/separation = 0 diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/row_container/row_container.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/row_container/row_container.gd deleted file mode 100644 index 6b30ef6..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/row_container/row_container.gd +++ /dev/null @@ -1,36 +0,0 @@ -#============================================================ -# List -#============================================================ -# - datetime: 2022-11-26 16:57:09 -#============================================================ -## 数据行的容器 - -@tool -class_name RowContainer -extends MarginContainer - - -signal newly_added_line(line: ColumnContainer) - - -@export var item : PackedScene - - -@onready var container = %container as VBoxContainer - - -func get_columns_containers() -> Array: - return container.get_children() - - -## 更新行数量 -func update_row_amount(count: int): - if container == null: - await self.ready - var node - for i in count - container.get_child_count(): - node = item.instantiate() - container.add_child(node) - newly_added_line.emit(node) - - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/row_container/row_container.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/row_container/row_container.tscn deleted file mode 100644 index 3e8685d..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/row_container/row_container.tscn +++ /dev/null @@ -1,20 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://dyhbjld6bhk1p"] - -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/table_container/row_container/row_container.gd" id="1_hd2dr"] -[ext_resource type="PackedScene" path="res://addons/table_data_editor/src/table_data_editor/table_edit/table_container/column_container/column_container.tscn" id="2_cbcfu"] - -[node name="row_container" type="MarginContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 1.0 -offset_right = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_hd2dr") -item = ExtResource("2_cbcfu") - -[node name="container" type="VBoxContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 -theme_override_constants/separation = 0 diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/table_container.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/table_container.gd deleted file mode 100644 index eb1764e..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/table_container.gd +++ /dev/null @@ -1,147 +0,0 @@ -#============================================================ -# Table Container -#============================================================ -# - datetime: 2022-11-26 17:01:54 -#============================================================ -## 表格 -## -##这里只进行表格单元格相关管理,不进行数据的处理,仅作为表格样式显示 -@tool -class_name TableContainer -extends MarginContainer - - -## 新增单元格 -signal newly_added_cell(coords: Vector2i, new_cell: Control) -## 网格中的单元格大小发生改变 -signal grid_cell_size_changed(grid_size: Vector2i) - - -@export var cell : PackedScene - - -var __init_node = InjectUtil.auto_inject(self, "_", true) - -var _row_container : RowContainer -var _update_row_column_amount_timer : Timer - - -# 表格单元格数量大小 -var _grid_cell_count_size := Vector2i() -# 单个单元格大小 -var _tile_size := Vector2i() -# 单元格列表 -var _cell_list : Array[Control] = [] -# 列对应的单元格 -var _column_to_cells_map := {} -# 行对应的单元格 -var _row_to_cells_map := {} - - -#============================================================ -# SetGet -#============================================================ -## 获取单元格行列数量大小 -func get_grid_row_column_count_size() -> Vector2i: - return _grid_cell_count_size - -## 获取表格的行数量 -func get_grid_row_count() -> int: - return _grid_cell_count_size.y - -## 获取表格的列数量 -func get_grid_column_count() -> int: - return _grid_cell_count_size.x - -## 获取单元格大小 -func get_tile_size() -> Vector2i: - return _tile_size - -## 获取行容器 -func get_row_container() -> RowContainer: - return _row_container - -## 获取所有行的单元格列容器 -func get_column_container() -> Array[ColumnContainer]: - return _row_container.get_columns_containers() - -## 获取所有单元格 -func get_all_cell() -> Array[Control]: - return _cell_list - -## 获取一列的单元格。column 从 0 开始,最大为 [method get_grid_row_column_count_siz] 的 x 值 -func get_column_cells(column: int) -> Array: - return _column_to_cells_map[column] - -## 获取这一行的单元格。row 从 0 开始,最大为 [method get_grid_row_column_count_siz] 的 y 值 -func get_row_cells(row: int) -> Array: - return _row_to_cells_map[row] - - - -#============================================================ -# 内置 -#============================================================ -func _ready() -> void: - assert(cell != null, "还没有设置 cell 属性!") - - # cell 的更新与大小 - _row_container.newly_added_line.connect(func(new_line: ColumnContainer): - new_line.newly_added_cell.connect( func(new_cell: Control): - self._cell_list.append(new_cell) - - var column : int = new_cell.get_index() - var row : int = new_line.get_index() - self.newly_added_cell.emit( Vector2i(column, row), new_cell ) - - if _column_to_cells_map.has(column): - _column_to_cells_map[column].append(new_cell) - else: - _column_to_cells_map[column] = [] - _column_to_cells_map[column].append(new_cell) - if _row_to_cells_map.has(row): - _row_to_cells_map[row].append(new_cell) - else: - _row_to_cells_map[row] = [] - _row_to_cells_map[row].append(new_cell) - ) - new_line.item = self.cell - new_line.update_cell_amount(_grid_cell_count_size.x) - ) - self.resized.connect(_update_row_column_amount) - - # 先创建出来第一个,用以获取最小 cell 大小 - _row_container.update_row_amount(1) - (_row_container.get_columns_containers()[0] as ColumnContainer).update_cell_amount(1) - var first_cell = _row_container.get_columns_containers()[0].get_cells()[0] as Control - _tile_size = first_cell.size - - # 更新单元格数量 - _update_row_column_amount_timer.timeout.connect(func(): - var tmp_cell_amount = _grid_cell_count_size - _grid_cell_count_size.x = int(self.size.x / _tile_size.x) + 1 - _grid_cell_count_size.y = int(self.size.y / _tile_size.y) + 1 - - if tmp_cell_amount != _grid_cell_count_size: - print("[ TableContainer ] 单元格小:", _grid_cell_count_size) - self.grid_cell_size_changed.emit(_grid_cell_count_size) - - for line in _row_container.get_columns_containers(): - line = line as ColumnContainer - line.update_cell_amount(_grid_cell_count_size.x) - _row_container.update_row_amount(_grid_cell_count_size.y) - ) - _update_row_column_amount_timer.start() - _update_row_column_amount_timer.autostart = true - _update_row_column_amount_timer.one_shot = true - _update_row_column_amount_timer.timeout.emit() - - - -#============================================================ -# 自定义 -#============================================================ -func _update_row_column_amount(): - _update_row_column_amount_timer.stop() - _update_row_column_amount_timer.start() - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/table_container.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/table_container.tscn deleted file mode 100644 index de628d8..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_container/table_container.tscn +++ /dev/null @@ -1,42 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://d02f0rqt6qnpv"] - -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/table_container/table_container.gd" id="1_v7wlj"] -[ext_resource type="PackedScene" path="res://addons/table_data_editor/src/table_data_editor/table_edit/cell/input_cell/input_cell.tscn" id="2_t8gur"] -[ext_resource type="PackedScene" uid="uid://dyhbjld6bhk1p" path="res://addons/table_data_editor/src/table_data_editor/table_edit/table_container/row_container/row_container.tscn" id="3_auuku"] - -[node name="table_container" type="MarginContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_v7wlj") -cell = ExtResource("2_t8gur") -metadata/_edit_lock_ = true - -[node name="control" type="Control" parent="."] -unique_name_in_owner = true -clip_contents = true -layout_mode = 2 -mouse_filter = 2 -metadata/_edit_lock_ = true - -[node name="row_container" parent="control" instance=ExtResource("3_auuku")] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 0 -anchor_right = 0.0 -anchor_bottom = 0.0 -offset_left = 0.0 -offset_right = 0.0 -grow_horizontal = 1 -grow_vertical = 1 -size_flags_horizontal = 3 -size_flags_vertical = 3 -metadata/_edit_lock_ = true - -[node name="update_row_column_amount_timer" type="Timer" parent="."] -unique_name_in_owner = true -wait_time = 0.05 -one_shot = true -autostart = true diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_data_set.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_data_set.gd deleted file mode 100644 index 287ba13..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_data_set.gd +++ /dev/null @@ -1,105 +0,0 @@ -#============================================================ -# Table Data Set -#============================================================ -# - author: zhangxuetu -# - datetime: 2023-05-16 23:22:41 -# - version: 4.0 -#============================================================ -## 表格数据集 -## -##专门存储管理表单的数据。处理每个单元格中的数据 -class_name TableDataEditor_TableDataSet - - -enum { - COLUMN, - ROW, -} - -# 表格数据。以 [code]grid_data[行][列] = 值[/code] 的格式存储数据。 -var grid_data : Dictionary = {} -# 列集合。所有行哪些列有值 -var column_set : Dictionary = {} - - -#============================================================ -# SetGet -#============================================================ -func get_config_data(): - return { - "grid_data": grid_data, - "column_set": column_set, - } - -func set_config_data(data: Dictionary): - self.grid_data = data.get("grid_data", {}) - self.column_set = data.get("column_set", {}) - -func get_origin_data() -> Dictionary: - return grid_data - -func is_empty() -> bool: - return grid_data.is_empty() - -func has_value(coords: Vector2i) -> bool: - return (grid_data.has(coords[ROW]) - and grid_data[coords[ROW]].has(coords[COLUMN]) - ) - -func get_value(coords: Vector2i): - if has_value(coords): - var row : int = coords[ROW] - var column : int = coords[COLUMN] - return grid_data[row][column] - return "" - -func set_value(coords: Vector2i, value) -> void: - var row : int = coords[ROW] - var column : int = coords[COLUMN] - - if not grid_data.has(row): - grid_data[row] = {} - grid_data[row][column] = value - - if not column_set.has(column): - column_set[column] = 0 - column_set[column] += 1 - - -func get_max_column() -> int: - if column_set.is_empty(): - return 0 - return column_set.keys().max() - -func remove_value(coords: Vector2i) -> bool: - if has_value(coords): - var row : int = coords[ROW] - var column : int = coords[COLUMN] - grid_data[row].erase(column) - column_set[column] -= 1 - - # 没有数据时,进行移除 - if Dictionary(grid_data[row]).is_empty(): - grid_data.erase(row) - if column_set[column] == 0: - column_set.erase(column) - return true - return false - -func get_row_list() -> Array[int]: - return Array(grid_data.keys(), TYPE_INT, "", null) - - - -#============================================================ -# 内置 -#============================================================ -func _to_string(): - return var_to_str( TableDataUtil.Classes.get_dict_by_property(self) ) - - -func _init(data: Dictionary = {}): - self.grid_data = data.get("grid_data", {}) - self.column_set = data.get("column_set", {}) - - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_edit.gd b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_edit.gd deleted file mode 100644 index 0cb00a7..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_edit.gd +++ /dev/null @@ -1,498 +0,0 @@ -#============================================================ -# Table Edit -#============================================================ -# - author: zhangxuetu -# - datetime: 2022-11-26 17:53:52 -# - version: 4.0 -#============================================================ -## 编辑网格 -## -##这里管理 Cell 单元格的数据内容,真正开始对表格数据进行处理。 -@tool -class_name TableEdit -extends MarginContainer - - -## 数据发生改变 -signal data_set_changed -## 选中单元格 -signal selected_cell(cell: InputCell) -## 取消选中单元格 -signal deselected_cell(cell: InputCell) -## 单击单元格 -signal single_clicked_cell(cell: InputCell) -## 双击单元格 -signal double_clicked_cell(cell: InputCell) -## 准备编辑单元格 -signal ready_edit_cell(cell: InputCell) -## 已编辑单元格 -signal edited_cell(cell: InputCell) -## 单元格数据发生改变 -signal cell_value_changed(cell: InputCell, coords: Vector2i, previous: String, value: String) -## 滚动条滚动 -signal scroll_changed(coords: Vector2i) -## 行高发生改变 -signal row_height_changed(value: int) -## 列宽发生改变 -signal column_width_changed(value: int) -## 弹窗编辑器表格大小发生改变 -signal popup_edit_box_size_changed(box_size: Vector2) - - -## 双击单元格进行编辑 -@export var double_click_edit : bool = true - - -## 表格中的数据。格式:[code]data[row][column] = data[/code] -var grid_data := {}: - set(v): - grid_data = v - - update_cell_list() - scroll_to(Vector2i(0,0)) - self.data_set_changed.emit() -## 默认单元格大小 -var default_tile_size : Vector2i -## 数据集,管理获取数据 -var data_set : TableDataEditor_TableDataSet = TableDataEditor_TableDataSet.new(): - set(v): - data_set = v - - # 当前线程其他代码调用完成后调用这个 - (func(): - update_cell_list() - scroll_to(Vector2i(0,0)) - ).call_deferred() -## 行对应的行高 -var row_to_height_map := {} -## 列对应的列宽 -var column_to_width_map := {} - - -var __init_node = InjectUtil.auto_inject(self, "_", true) - -var _table_container : TableContainer -var _popup_edit_box : PopupEditBox -var _v_scroll_bar : VScrollBar -var _h_scroll_bar : HScrollBar -var _update_grid_data_timer : Timer -var _serial_number_container : SerialNumberContainer - - -# 是否允许发出取消选中 cell 的信号,用于编辑表格数据,编辑的时候代表这个单元格还是被选中的 -var _enabled_emit_deselected_signal := true - -# 原始坐标位置对应的单元格 -var _origin_coords_to_cell_map := {} -# 单元格对应的原点坐标位置 -var _cell_to_origin_coords_map := {} -# 当前选中的单元格 -var _selected_cell : InputCell: - set(v): - _selected_cell = v - if v != null: - _last_cell = v -# 最后一次选中的单元格 -var _last_cell : InputCell -# 上一次左上角的坐标位置 -var _latest_top_left := Vector2i() - -# 正在按着 alt 键 -var _pressing_alt := false -# 是否已经开始更新 -var _updated : bool = false - - -#============================================================ -# SetGet -#============================================================ -## 获取编辑弹窗 -func get_edit_dialog() -> PopupEditBox: - return _popup_edit_box - -func get_grid_data() -> Dictionary: - return grid_data - -func get_data_set() -> TableDataEditor_TableDataSet: - return data_set - -## 获取当前滚动到的左上角位置 -func get_scroll_top_left() -> Vector2i: - return Vector2i( _h_scroll_bar.value, _v_scroll_bar.value ) - -## 获取滚动条最顶部 Y 的值 -func get_scroll_top() -> int: - return int(_v_scroll_bar.value) - -## 获取滚动条最左边 X 的值 -func get_scroll_left() -> int: - return int(_h_scroll_bar.value) - -## 获取这个 cell 的当前坐标位置 -func get_cell_coords(cell: InputCell) -> Vector2i: - return get_scroll_top_left() + _cell_to_origin_coords_map.get(cell, Vector2i(-1, -1)) - -## 获取这个坐标上的 cell -func get_cell_node(coords: Vector2i) -> InputCell: - var origin_coords = coords - get_scroll_top_left() - return _origin_coords_to_cell_map.get(origin_coords) as InputCell - -## 获取列宽 -func get_column_width(column: int, default_width: int = 0) -> int: - if default_width <= 0: - default_width = _table_container.get_tile_size().x - return column_to_width_map.get(column, default_width) - -## 获取行高 -func get_row_height(row: int, default_heigt : int = 0): - if default_heigt <= 0: - default_heigt = _table_container.get_tile_size().y - return row_to_height_map.get(row, default_heigt) - -## 获取列宽数据,数据中的 key 为列值,对应列宽 -func get_column_width_data() -> Dictionary: - return column_to_width_map - -## 获取行高数据,数据中的 key 为行值,对应行宽 -func get_row_height_data() -> Dictionary: - return row_to_height_map - -## 获取单元格行列大小数量 -func get_column_row_size() -> Vector2i: - return _table_container.get_grid_row_column_count_size() - -## 获取单元格当前整个矩形数据的位置 -func get_current_rect() -> Rect2i: - return Rect2i(get_scroll_top_left(), get_column_row_size()) - - -#============================================================ -# 内置 -#============================================================ -func _ready() -> void: - - # 滚动条 - _h_scroll_bar.scrolling.connect(func(): - _h_scroll_bar.max_value = _h_scroll_bar.value + 100 - update_cell_list() - ) - _v_scroll_bar.scrolling.connect(func(): - _v_scroll_bar.max_value = _v_scroll_bar.value + 100 - update_cell_list() - ) - - # 编辑表格窗。隐藏就更新对应的单元格的数据 - _popup_edit_box.popup_hide.connect(func(value): - # 弹窗消失后才允许发送取消选中的信号 - _enabled_emit_deselected_signal = true - # 更新选中的 cell - if _last_cell: - _last_cell.set_value( value ) - var coords = get_cell_coords(_last_cell) - alter_value(coords, value) - self.edited_cell.emit(_last_cell) - - ) - - # 必须要等空闲时间时调用,否则 _table_container 中的节点没有加载完成,则看不到节点的大小 - update_serial_num.call_deferred(Vector2i(0, 0)) - self.default_tile_size = _table_container.get_tile_size() - - # 切换窗口时取消 alt - while get_window() == null: - await Engine.get_main_loop().process_frame - _pressing_alt = false - - # 更新表格数据 - update_cell_list() - - _serial_number_container.update_serial_number(Vector2i(0,0)) - - -func _notification(what): - if what == NOTIFICATION_WM_WINDOW_FOCUS_OUT: - _pressing_alt = false - - -func _unhandled_input(event): - if event is InputEventKey: - # 按下 alt 键 - if event.keycode == KEY_ALT: -# if not _pressing_alt and event.is_pressed(): -# print("[ TableEdit ] 按下了 Alt 键") - _pressing_alt = event.is_pressed() - - -#============================================================ -# 自定义 -#============================================================ -# 真正进行修改行高,但数据不会缓存到数据中 -func _alter_row_height(row: int, height: int): - height = max(height, default_tile_size.y) - for cell in _table_container.get_row_cells(row - get_scroll_top()): - cell.custom_minimum_size.y = height - _serial_number_container.update_row_height(row - get_scroll_top(), height) - -# 真正进行修改单元格宽度,但数据不会缓存到数据中 -func _alter_column_width(column: int, width: int): - width = max(width, default_tile_size.x) - for cell in _table_container.get_column_cells( column - get_scroll_left() ): - cell.custom_minimum_size.x = width - _serial_number_container.update_column_width(column - get_scroll_left(), width) - - -## 修改单元格数据 -##[br] -##[br][code]coords[/code] 修改的坐标位置 -##[br][code]value[/code] 修改的值,如果为需改为 [code]""[/code],则会删除掉这个数据 -##[br][code]emit_signal_state[/code] 是否发送信号 -func alter_value( - coords: Vector2i, - value: String, - emit_signal_state: bool = true -) -> void: - var previous = data_set.get_value(coords) - if value: - if previous != value: - data_set.set_value(coords, value) - if emit_signal_state: - var cell = get_cell_node(coords) - self.cell_value_changed.emit(cell, coords, previous, value ) - else: - if data_set.remove_value(coords): - if emit_signal_state: - var cell = get_cell_node(coords) - self.cell_value_changed.emit(cell, coords, previous, "") - - -## 修改行高 -##[br] -##[br][code]row[/code] 所在的行,从 1 开始 -##[br][code]height[/code] 设置的行高 -func alter_row_height(row: int, height: int): - row_to_height_map[row] = height - _alter_row_height(row, height) - - -## 修改列宽 -##[br] -##[br][code]column[/code] 所在的列,从 1 开始 -##[br][code]width[/code] 设置的列宽 -func alter_column_width(column: int, width: int): - column_to_width_map[column] = width - _alter_column_width(column, width) - - -## 更新单元格信息(使用计时器缓冲更新,防止同一时间多次重复调用) -func update_cell_list(): - if _updated: - return - _updated = true - await Engine.get_main_loop().process_frame - _updated = false - force_update_cell_list() - - -# 真正实际执行的更新 -func force_update_cell_list(): - # 更新数据 - var top_left = get_scroll_top_left() - var coords : Vector2i - for cell in _cell_to_origin_coords_map: - coords = get_cell_coords(cell) - cell.show_value(data_set.get_value(coords)) - - # 更新单元格的宽高 - var grid_row_column_size = _table_container.get_grid_row_column_count_size() - for column in range(top_left.x, top_left.x + grid_row_column_size.x): - _alter_column_width(column, get_column_width(column, 0) ) - for row in range(top_left.y, top_left.y + grid_row_column_size.y): - _alter_row_height(row, get_row_height(row, 0) ) - - - if _latest_top_left != top_left: - _latest_top_left = top_left - self.scroll_changed.emit( _latest_top_left ) - _popup_edit_box.showed = false - _popup_edit_box.get_edit_box().visible = false - _serial_number_container.update_serial_number(top_left) - - -## 更新行列序号的值 -##[br] -##[br][code]left_top[/code] 左上角行列值 -func update_serial_num(left_top: Vector2i): - _serial_number_container.update_column_width(left_top.x, default_tile_size.x) - _serial_number_container.update_row_height(left_top.y, default_tile_size.y) - - -## 滚动到指定位置 -func scroll_to(left_top: Vector2i): - _h_scroll_bar.value = left_top.x - _v_scroll_bar.value = left_top.y - _h_scroll_bar.scrolling.emit() - _v_scroll_bar.scrolling.emit() - - -## 编辑单元格 -func edit_cell(cell_coords: Vector2i): - _enabled_emit_deselected_signal = false - - # 设置选中的 cell - var cell = get_cell_node(cell_coords) - _selected_cell = cell - - # 弹窗 - _popup_edit_box.text = data_set.get_value(cell_coords) - _popup_edit_box.popup(Rect2(cell.global_position, Vector2(0,0))) - self.ready_edit_cell.emit(cell) - - -## 切换到下一个位置进行编辑。表格坐标是从 Vector2i(1, 1) 开始的,不是 Vector2i(0, 0) -func edit_to_next_cell(coords: Vector2i, direction : Vector2i): - if _selected_cell: - var next_coords = coords + direction - next_coords.x = max(1, next_coords.x) - next_coords.y = max(1, next_coords.y) - - _popup_edit_box.showed = false - _popup_edit_box.showed = true - - # 如果所在的单元格超出当前视图内的单元格,则进行滚动 - if direction.x > 0 or direction.y > 0: - var get_width_height_callback : Callable = self.get_column_width \ - if direction.x != 0 \ - else self.get_row_height - var dir_idx = 0 \ - if direction.x != 0 \ - else 1 - var total = 0 - var top_left = get_scroll_top_left() - for i in range(next_coords[dir_idx] - 1, top_left[dir_idx] - 1, -1): - total += abs(get_width_height_callback.call(i)) + 8 - if total > self.size[dir_idx]: - # 超出屏幕则换行 - scroll_to(top_left + direction * (i - top_left[dir_idx] + 1)) - break - - else: - var rect = get_current_rect() - rect.size -= Vector2i.ONE - if not rect.has_point(next_coords): - var top_left = get_scroll_top_left() - scroll_to(top_left + direction) - - # 切换到下一个网格的位置编辑网格 - await Engine.get_main_loop().create_timer(0.1).timeout - edit_cell.call_deferred(next_coords) - - - -#============================================================ -# 连接信号 -#============================================================ -# 添加新的单元格时 -func _newly_added_cell(coords: Vector2i, new_cell: InputCell): - # 滑轮滚动 - new_cell.gui_input.connect(func(event): - # 单元格 Input - if event is InputEventMouseButton and event.is_pressed(): - var scroll_bar : ScrollBar - if _pressing_alt: - scroll_bar = _h_scroll_bar - else: - scroll_bar = _v_scroll_bar - if event.button_index == MOUSE_BUTTON_WHEEL_DOWN: - scroll_bar.value += scroll_bar.step - scroll_bar.scrolling.emit() - elif event.button_index == MOUSE_BUTTON_WHEEL_UP: - scroll_bar.value -= scroll_bar.step - scroll_bar.scrolling.emit() - ) - - # 单元格行列坐标映射 - _cell_to_origin_coords_map[new_cell] = coords - _origin_coords_to_cell_map[coords] = new_cell - - update_cell_list() - - # 选中单元格 - new_cell.focus_entered.connect(func(): - _selected_cell = new_cell - if _popup_edit_box.showed: - _popup_edit_box.showed = false - if _selected_cell: - # 取消上次选中的单元格 - self.deselected_cell.emit(_selected_cell) - _selected_cell = null - - # 当前 cell - self.selected_cell.emit(new_cell) - _popup_edit_box.showed = false - ) - - # 取消选中单元格 - new_cell.focus_exited.connect(func(): - if _enabled_emit_deselected_signal: - _selected_cell = null - self.deselected_cell.emit(new_cell) - ) - - # 单击 - new_cell.single_clicked.connect(func(): - if not double_click_edit: - edit_cell(get_cell_coords(new_cell)) - self.single_clicked_cell.emit(new_cell) - ) - - # 双击 - new_cell.double_clicked.connect(func(): - if double_click_edit: - edit_cell(get_cell_coords(new_cell)) - self.double_clicked_cell.emit(new_cell) - ) - - # 水平拖拽移动 - new_cell.h_dragged.connect(func(distance: float, pressed_node_size: Vector2i): - # 表格当前坐标位置 - var current_coords = get_cell_coords(new_cell) - var width = pressed_node_size.x + int(distance) - alter_column_width(current_coords.x, width) - - # 记录改变的列宽 - column_to_width_map[current_coords.x] = width - self.column_width_changed.emit(width) - ) - - # 垂直拖拽移动 - new_cell.v_dragged.connect(func(distance: float, pressed_node_size: Vector2i): - - # 表格当前坐标位置 - var current_coords = get_cell_coords(new_cell) - var height = pressed_node_size.y + int(distance) - alter_row_height(current_coords.y, height) - - # 记录改变的行高 - row_to_height_map[current_coords.y] = height - self.row_height_changed.emit(height) - - ) - -func _on_table_container_grid_cell_size_changed(grid_size): - # 更新序号 - _serial_number_container.update_grid_cell_count(grid_size) - -func _on_popup_edit_box_box_size_changed(box_size): - self.popup_edit_box_size_changed.emit(box_size) - - -func _on_popup_edit_box_input_switch_char(character): - match character: - KEY_TAB: - var coords = get_cell_coords(_selected_cell) - edit_to_next_cell(coords, Vector2i.LEFT if Input.is_key_pressed(KEY_SHIFT) else Vector2i.RIGHT) - - KEY_ENTER: - var coords = get_cell_coords(_selected_cell) - edit_to_next_cell(coords, Vector2i.UP if Input.is_key_pressed(KEY_SHIFT) else Vector2i.DOWN) - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_edit.tscn b/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_edit.tscn deleted file mode 100644 index 213cd2f..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/table_data_editor/table_edit/table_edit.tscn +++ /dev/null @@ -1,118 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://ctppgkl2dpksd"] - -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/table_edit.gd" id="1_b56jx"] -[ext_resource type="Script" path="res://addons/table_data_editor/src/table_data_editor/table_edit/serial_number_container.gd" id="2_irx05"] -[ext_resource type="PackedScene" path="res://addons/table_data_editor/src/table_data_editor/table_edit/cell/serial_number_cell/serial_number_cell.tscn" id="3_xe81h"] -[ext_resource type="PackedScene" uid="uid://d02f0rqt6qnpv" path="res://addons/table_data_editor/src/table_data_editor/table_edit/table_container/table_container.tscn" id="4_sm235"] -[ext_resource type="PackedScene" uid="uid://4xts0ha85fja" path="res://addons/table_data_editor/src/table_data_editor/table_edit/edit_box_window/edit_box_window.tscn" id="6_mt1mb"] - -[node name="table_edit" type="MarginContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 2 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 2 -script = ExtResource("1_b56jx") - -[node name="serial_number_container" type="GridContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 -theme_override_constants/h_separation = 0 -theme_override_constants/v_separation = 0 -columns = 2 -script = ExtResource("2_irx05") -serial_number_cell = ExtResource("3_xe81h") - -[node name="space" type="Control" parent="serial_number_container"] -unique_name_in_owner = true -custom_minimum_size = Vector2(27, 35) -layout_mode = 2 - -[node name="Control" type="Control" parent="serial_number_container"] -clip_contents = true -layout_mode = 2 -mouse_filter = 2 - -[node name="h_serial_number_container" type="HBoxContainer" parent="serial_number_container/Control"] -unique_name_in_owner = true -layout_mode = 0 -theme_override_constants/separation = 0 - -[node name="Control2" type="Control" parent="serial_number_container"] -clip_contents = true -custom_minimum_size = Vector2(32, 0) -layout_mode = 2 -mouse_filter = 2 - -[node name="v_serial_number_container" type="VBoxContainer" parent="serial_number_container/Control2"] -unique_name_in_owner = true -layout_mode = 0 -theme_override_constants/separation = 0 - -[node name="Control3" type="Control" parent="serial_number_container"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -mouse_filter = 2 - -[node name="grid_container" type="GridContainer" parent="serial_number_container/Control3"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/h_separation = 0 -theme_override_constants/v_separation = 0 -columns = 2 - -[node name="table_container" parent="serial_number_container/Control3/grid_container" instance=ExtResource("4_sm235")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="v_scroll_bar" type="VScrollBar" parent="serial_number_container/Control3/grid_container"] -unique_name_in_owner = true -layout_mode = 2 -focus_mode = 1 -min_value = 1.0 -step = 1.0 -page = 10.0 -value = 1.0 -exp_edit = true - -[node name="h_scroll_bar" type="HScrollBar" parent="serial_number_container/Control3/grid_container"] -unique_name_in_owner = true -layout_mode = 2 -focus_mode = 1 -min_value = 1.0 -step = 1.0 -page = 10.0 -value = 1.0 -exp_edit = true - -[node name="Control" type="Control" parent="serial_number_container/Control3/grid_container"] -layout_mode = 2 - -[node name="update_grid_data_timer" type="Timer" parent="serial_number_container/Control3/grid_container"] -unique_name_in_owner = true -wait_time = 0.02 -one_shot = true -autostart = true - -[node name="popup_edit_box" parent="." instance=ExtResource("6_mt1mb")] -unique_name_in_owner = true -layout_mode = 2 - -[connection signal="grid_cell_size_changed" from="serial_number_container/Control3/grid_container/table_container" to="." method="_on_table_container_grid_cell_size_changed"] -[connection signal="newly_added_cell" from="serial_number_container/Control3/grid_container/table_container" to="." method="_newly_added_cell"] -[connection signal="box_size_changed" from="popup_edit_box" to="." method="_on_popup_edit_box_box_size_changed"] -[connection signal="input_switch_char" from="popup_edit_box" to="." method="_on_popup_edit_box_input_switch_char"] diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/util/inject_util.gd b/DungeonShooting_Godot/addons/table_data_editor/src/util/inject_util.gd deleted file mode 100644 index d85f0e2..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/util/inject_util.gd +++ /dev/null @@ -1,45 +0,0 @@ -#============================================================ -# Inject Util -#============================================================ -# - author: zhangxuetu -# - datetime: 2023-05-14 23:53:46 -# - version: 4.0 -#============================================================ -## 注入节点工具 -class_name InjectUtil - - -## 自动注入 unique (唯一名称)节点属性 -##[br] -##[br][code]parent[/code] 目标节点,对这个节点的属性进行自动注入节点属性 -##[br][code]prefix[/code] 注入的属性的前缀值 -##[br]示例: -##[codeblock] -##extends Node -## -##var __init_node__ = InjectUtil.auto_inject(self, "_") -### 当前场景中有 %sprite 、%collision 节点则会自动获取并自动设置下面两个属性 -##var _sprite : Sprite2D -##var _collision: Collision -## -##[/codeblock] -static func auto_inject(parent: Node, prefix: String = "", open_err: bool = false): - var method : Callable = func(): - for data in (parent.get_script() as GDScript).get_script_property_list(): - if data['type'] == TYPE_OBJECT and parent[data['name']] == null: - var prop = str(data['name']).trim_prefix(prefix) - if parent.has_node("%" + prop): - # 注入属性 - var node = parent.get_node_or_null("%" + prop) - if node: - parent[data['name']] = node - else: - if open_err: - printerr("没有 ", prop, " 属性相关节点") - - if parent.is_inside_tree(): - method.call() - else: - parent.tree_entered.connect(method, Object.CONNECT_ONE_SHOT) - return true - diff --git a/DungeonShooting_Godot/addons/table_data_editor/src/util/table_data_util.gd b/DungeonShooting_Godot/addons/table_data_editor/src/util/table_data_util.gd deleted file mode 100644 index f3542b2..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/src/util/table_data_util.gd +++ /dev/null @@ -1,151 +0,0 @@ -#============================================================ -# Table Data Util -#============================================================ -# - author: zhangxuetu -# - datetime: 2023-05-17 19:14:50 -# - version: 4.0 -#============================================================ -class_name TableDataUtil - - -class SingletonData: - - static func get_value(key, default: Callable): - if not Engine.has_meta(key): - Engine.set_meta(key, default.call()) - return Engine.get_meta(key) - - static func get_child_value(key, child_key, child_default: Callable): - var data = get_value(key, func(): return {}) - if data.has(child_key): - return data[child_key] - else: - data[child_key] = child_default.call() - return data[child_key] - - - -class Files: - - static func load_file(path: String): - if FileAccess.file_exists(path): - var bytes = FileAccess.get_file_as_bytes(path) - return bytes_to_var(bytes) - - static func make_dir(dir: String) -> bool: - if not DirAccess.dir_exists_absolute(dir): - DirAccess.make_dir_recursive_absolute(dir) - return true - return false - - static func save_data(path: String, data) -> bool: - make_dir(path.get_base_dir()) - if not path.is_empty(): - var bytes : PackedByteArray = var_to_bytes(data) - var writer : FileAccess = FileAccess.open(path, FileAccess.WRITE) - if writer.get_open_error() != OK: - printerr("打开文件失败!", writer.get_open_error()) - return false - - writer.store_buffer(bytes) - if writer.get_error() != OK: - printerr("写入文件失败:", writer.get_error()) - return false - - writer = null - return true - return false - - static func save_as_string(path:String, data): - make_dir(path.get_base_dir()) - var writer = FileAccess.open(path, FileAccess.WRITE) - writer.store_string( - JSON.stringify(data) - if not data is String - else data - ) - - static func read_as_string(path: String) -> String: - if FileAccess.file_exists(path): - var reader = FileAccess.open(path, FileAccess.READ) - return reader.get_as_text() - return "" - - static func read_csv_file(path: String, delim: String = ",") -> Array[PackedStringArray]: - if FileAccess.file_exists(path): - var reader = FileAccess.open(path, FileAccess.READ) - var lines : Array[PackedStringArray]= [] - var line = reader.get_csv_line(delim) - while line != PackedStringArray([""]): - lines.append(line) - line = reader.get_csv_line(delim) - return lines - return [] - - static func get_absolute_path(path: String) -> String: - var reader = FileAccess.open(path, FileAccess.READ) - if reader: - return reader.get_path_absolute() - return "" - - - -class Classes: - - static func get_propertys(script: Script) -> Array[String]: - return SingletonData.get_child_value("TableDataUtil_Classes_propertys", script, func(): - var list : Array[String] = [] - list.append_array(script \ - .get_script_property_list() \ - .map(func(data): return data['name']) - .filter(func(name: String): return name.find(".") == -1) - ) - return list - ) - - static func set_property_by_dict(object: Object, dict: Dictionary): - for property in dict: - if property in object: - object[property] = dict[property] - - static func get_dict_by_property(object: Object) -> Dictionary: - var dict : Dictionary = {} - var list = get_propertys(object.get_script()) - for property in get_propertys(object.get_script()): - dict[property] = object[property] - return dict - - - -class Editor: - - ## 获取编辑器接口 - static func get_editor_interface() -> EditorInterface: - if not Engine.is_editor_hint(): - return null - const KEY = "TableDataUtil_get_editor_interface" - if Engine.has_meta(KEY): - return Engine.get_meta(KEY) - else: - var plugin = ClassDB.instantiate("EditorPlugin") - Engine.set_meta(KEY, plugin.get_editor_interface()) - return plugin.get_editor_interface() - - ## 是否开启了插件 - static func is_enabled() -> bool: - if not Engine.is_editor_hint(): - return false - if get_editor_interface() == null: - return false - return get_editor_interface().is_plugin_enabled("table_data_editor") - - ## 当前插件是否是打开的 - static func is_main_node() -> bool: - var node = get_editor_interface().get_editor_main_screen() - for child in node.get_children(): - if child is Control and child.visible: - # 显示的是当前插件的名称 - return child.name == 'table_data_editor' - return false - - diff --git a/DungeonShooting_Godot/addons/table_data_editor/test.gdata b/DungeonShooting_Godot/addons/table_data_editor/test.gdata deleted file mode 100644 index 2047ed3..0000000 --- a/DungeonShooting_Godot/addons/table_data_editor/test.gdata +++ /dev/null Binary files differ