Godot4节点树右键菜单添加自定义选项

news/2024/12/22 8:51:30/

前言

查看godot的源码推荐使用在线版vscode直接从github上看。(直接把网址的com改成dev即可)
重点查看以下源码
scene_tree_dock.h
scene_tree_dock.cpp

开始

@tool
extends EditorPluginvar window
var scene_menustatic func find_child_by_class(node:Node, cls:String):var child_list = []for child in node.get_children():if child.get_class() == cls:child_list.append(child)return child_listfunc _enter_tree():#创建窗口window = preload("res://addons/ps/WWindows.gd").new()self.add_child(window)var base = get_editor_interface().get_base_control()var scene_tree_dock = base.find_child("Scene", true, false)scene_menu = find_child_by_class(scene_tree_dock,"PopupMenu")scene_menu[0].menu_changed.connect(self.menu_changed)scene_menu[0].id_pressed.connect(self.id_pressed)func menu_changed():if scene_menu[0].item_count == 0:returnvar name = scene_menu[0].get_item_text(clamp(scene_menu[0].item_count - 1,0,9999))var m:PopupMenu = scene_menu[0]if name == "删除节点":m.add_item("UI Editor",99)#不能超过100func id_pressed(id):if id == 99:window.show()func _exit_tree():# Clean-up of the plugin goes here.pass

在源码中

SceneTreeDock类的名字就叫Scene,所以我通过 find_child来直接获取引用

var scene_tree_dock = base.find_child("Scene", true, false)

因为SceneTreeDock里面有两个PopupMenu,经过分析,第一个是编辑器右键菜单。

 我们也可以通过如下方式遍历打印一个控件的所有子控件

for child in node.get_children():print(child.get_class())

在上图源码这里创建了menu,鼠标点击以后会自动清空menu重新添加所有子项

 所以menu每次点击都会不同,我们无法直接在gds内给menu添加子项,因为会被清除

这里我跟着_tree_rmb看到一些信号

但是这些信号我使用gds绑定以后有些不会触发,经过我测试(重命名信号)会触发,右键点击信号不会触发,所以我们还得想其他办法,在每次初始化 menu的时候添加子项。

这里是 PopupMenu的文档,里面的menu_changed信号会在menu初始化的时候触发,所以在这个时候添加子项是有效的,不会被清除。

func menu_changed():if scene_menu[0].item_count == 0:returnvar name = scene_menu[0].get_item_text(clamp(scene_menu[0].item_count - 1,0,9999))var m:PopupMenu = scene_menu[0]if name == "删除节点":m.add_item("UI Editor",99)#不能超过100

这里我要把子项加到删除节点的下面,注意我这样写在其他语言中可能有问题,但是大概思路是这样的。

要点是id=99,因为0-30左右都被占用了,默认是-1好像也会报错,于是我找了源码看到了

 所以需要填大于30小于100的ID才不会报错

总结

 至此原理就讲完了,浪费了两天时间,提高了查看源码的能力

 


http://www.ppmy.cn/news/75275.html

相关文章

C语言中链表经典面试题目——设计循环队列

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,数据结构 🔥座右铭:“不要等到什么都没…

【Unity】UGUI基础控件的使用介绍

UGUI基础控件的使用 一、基本介绍二、UI控件介绍1. Text(文本)2. Image(图片)3. Button(按钮)4. Input Field(输入框)5. Toggle(开关)6. Slider(滑动条)7. ScrollBar(滚动条)8. DropDown(下拉列表)9. Panel(面板)10. ScrollRect(滚动视图)一、基本介绍 Un…

Chatbot UI老外在用的gpt网页版 搭建方法分享!

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT资源 Chatbot UI 高仿ChatGPT官网,中文还支持贼好,界面美观度间距还需要打磨。是老外做的吗? ​ 环境部署 更新环境 apt update -y && apt upg…

SpringCloud学习-实用篇04

以下内容的代码可见:SpringCloud_learn/day04 1.初始MQ 同步通讯和异步通讯 微服务间通讯有同步和异步两种方式,同步通讯就像打电话需要实时响应,异步通讯就像发邮件不需要马上回复。两种方式各有优劣,比如打电话能立即得到响应&a…

Kali-linux分析密码

在实现密码破解之前,介绍一下如何分析密码。分析密码的目的是,通过从目标系统、组织中收集信息来获得一个较小的密码字典。本节将介绍使用Ettercap工具或MSFCONSOLE来分析密码。 8.2.1 Ettercap工具 Ettercap是Linux下一个强大的欺骗工具,也…

08 集合框架1

什么是数据结构? 存储数据,组织数据的方法,就是对数据做增删改查的操作 常见的数据结构有哪些?各自的优缺点是什么? 数组:擅长修改 查找操作,不擅长增加 删除操作 链表:有单项链表和双向链表,擅长增加和删除操作,不擅长修改和查找的操作 队列:擅长操作头和尾,先进先出,…

LeetCode94. 二叉树的中序遍历(递归与非递归)

写在前面: 题目链接:添加链接描述 编程语言:c 题目难度:简单 一、题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2:…

使用Amazon EC2实例部署三个项目

在部署这三个项目时,以下是一种可能的思路: 1. **配置服务器环境:**确保你的服务器已经安装了适当的操作系统(例如Linux)和所需的软件(如Python、Node.js等)。 2. **设置域名和端口:…