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

news2025/5/19 20:14:28

前言

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

开始

@tool
extends EditorPlugin

var window
var scene_menu


static 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_list

func _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:
		return
	var 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

func 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:
		return
	var 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.coloradmin.cn/o/550087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OneDrive同步角标消失 - 解决方案

问题 在电脑端使用OneDrive时,文件管理器OneDrive文件夹内的文件会在左下角显示同步状态,如下图。若没有显示同步角标,则此功能出现异常,下文介绍如何显示同步角标。 值得一提的是,同步角标只起到显示作用&#xff0…

secure CRT 颜色主题 系统间拷贝

文章目录 颜色主题如何切换 SecureCRT 颜色主题如何新建SecureCRT 颜色 主题如何拷贝我的颜色主题,主题名为pic VIM系统间拷贝vim中 ubuntu 拷贝 到 win1. 确保 ubuntu 上的 vim 支持 clipboard 特性2. 在 ~/.vim/vimrc 中添加设置3. vim中 win拷贝到ubuntu SecureCRT 关键字高…

STM32实现基于RS485的简单的Modbus协议

背景 我这里用STM32实现,其实可以搬移到其他MCU,之前有项目使用STM32实现Modbus协议 这个场景比较正常,很多时候都能碰到 这里主要是Modbus和变频器通信 最常见的是使用Modbus实现传感器数据的采集,我记得之前用过一些传感器都…

pg事务:隔离级别历史与SSI

事务隔离级别的历史 ANSI SQL-92定义的隔离级别和异常现象确实对数据库行业影响深远,甚至30年后的今天,绝大部分工程师对事务隔离级别的概念还停留在此,甚至很多真实的数据库隔离级别实现也停留在此。但后ANSI92时代对事物隔离有许多讨论甚至…

队列的实现(附含两道经典例题)

🍉文章主页:阿博历练记 📖文章专栏:数据结构与算法 🚍代码仓库:阿博编程日记 🍥欢迎关注:欢迎友友们点赞收藏关注哦🌹 文章目录 🌾前言🎬队列&…

探索Windows CMD命令的经典应用:实用技巧大揭秘,值得收藏

文章目录 导语:第一部分:CMD命令基础1. ipconfig:获取网络配置信息2. ping:测试网络连接3. dir:查看目录内容4. telnet:远程登录和测试网络服务 第二部分:进程管理5. tasklist:查看正…

10-Docker发布微服务

文章目录 搭建SpringBoot项目发布微服务项目到Docker容器 搭建SpringBoot项目 搭建一个简单的SpringBoot项目&#xff1a; 创建maven工程&#xff0c;pom为&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://m…

【Java多线程案例】单例模式

本期讲解单例模式的饿汉模式与懒汉模式&#xff0c;以及如何解决懒汉模式造成线程的不安全问题。 目录 什么是单例模式&#xff1f; 1. 饿汉模式 2. 懒汉模式 2.1 懒汉模式单线程版 2.2 懒汉模式多线程版 3. 解决懒汉模式不安全问题 3.1 保证原子性 3.2 防止指令重排序…

MAC移动硬盘无法识别解决方案(超详细图文教程)

目录 步骤1&#xff1a;先找到外接移动硬盘&#xff0c;在 Mac “终端”执行命令 步骤2&#xff1a;加载移动硬盘&#xff0c;可以在终端执行以下两个命令之一 步骤3&#xff1a;终止后台自动执行的“磁盘修复进程” 步骤4&#xff1a;手动执行磁盘修复命令 步骤5&#xf…

lwIP更新记01:全局互斥锁替代消息机制

从 lwIP-2.0.0 开始&#xff0c;在 opt.h 中多了一个宏开关 LWIP_TCPIP_CORE_LOCKING&#xff0c;默认使能。这个宏用于启用 内核锁定 功能&#xff0c;使用 全局互斥锁 实现。在之前&#xff0c;lwIP 使用 消息机制 解决 lwIP 内核线程安全问题。消息机制易于实现&#xff0c;…

基于Linux安装Docker

Docker官网&#xff1a;Docker Docs: How to build, share, and run applications | Docker Documentation 学习任何技术&#xff0c;一定要参考相应的官网学习&#xff0c;一定要参考官网学习&#xff01;&#xff01;&#xff01; 目录 一、环境准备 1.1 配置源 1.1.1 下载…

Vue+uniapp桃源婚恋交友APP 安卓小程序 nodejs java python

小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 开发模式&#xff1a;混合开发本文先提出了开发基于小程序的桃源婚恋交友APP系统的背景意义&#xff0c;然后通过功能性和非功能性分析阐述本系统的需求&#xff0c;然后进行系统设计。技术实现部分选择Jav…

c++ 11标准模板(STL) std::set(九)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

vue参照企业微信日程写一个小组件

今天公司要求做日程 这体的话 和企业微信的日程功能挺想的 也没有找到特别好的工具 就直接自己手敲了一个 先看效果 因为样式使用 sass 写的 所以 项目中要引入 sass 感兴趣的 可以把代码拿去二开一下 <template><section class "skeletonPositioning"…

Java线程概述 (一)线程介绍

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1fa85;什么是程序 、进程、线程&#xff1f;&#x1fa85;线程的生命周期&#x1fa85;多线程&#x1fa85;守护者线程&#x1fa85;线程并行与并发&#x1fa85;死锁&#x1f…

机器学习项目实战-能源利用率 Part-4(模型构建)

博主前期相关的博客可见下&#xff1a; 机器学习项目实战-能源利用率 Part-1&#xff08;数据清洗&#xff09; 机器学习项目实战-能源利用率 Part-2&#xff08;探索性数据分析&#xff09; 机器学习项目实战-能源利用率 Part-3&#xff08;特征工程与特征筛选&#xff09; 这…

AList挂载工具安装搭建使用教程,快速访问多个网盘的资源(保姆级图文)

目录 1. 下载AList2. 命令行启动快速启动小技巧 3. 用户登录4. 添加阿里云网盘帐号5. 添加百度云网盘资源总结 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 软件功能&#xff1a;将多个网盘的资源聚合在一起&…

本地部署 privateGPT

本地部署 privateGPT 1. 什么是 privateGPT2. Github 地址3. 创建虚拟环境4. 部署 privateGPT5. 配置 .env6. 下载模型7. 将文件放入 source_documents 目录中8. 摄取所有数据9. 向本地文档提问 1. 什么是 privateGPT 利用 GPT 的强大功能&#xff0c;私密地与您的文档交互&am…

Flutter 笔记 | Flutter 中的路由、包、资源、异常和调试

路由管理 Flutter中的路由通俗的讲就是页面跳转。在Flutter中通过Navigator组件管理路由导航。并提供了管理堆栈的方法。如&#xff1a;Navigator.push和Navigator.pop Flutter中给我们提供了两种配置路由跳转的方式&#xff1a;1、基本路由&#xff0c; 2、命名路由 普通路…

详解c++STL—函数对象

目录 1、函数对象 1.1、函数对象概念 1.2、函数对象的使用 2、谓词 2.1、谓词概念 2.2、一元谓词 2.3、二元谓词 3、内建函数对象 3.1、理解内建函数对象 3.2、算术仿函数 3.3、关系仿函数 3.4、逻辑仿函数 1、函数对象 1.1、函数对象概念 概念&#xff1a; 重载…