Rust上下文菜单插件库re_context_menu的使用,为GUI应用提供灵活可定制的右键菜单功能
Rust上下文菜单插件库re_context_menu的使用,为GUI应用提供灵活可定制的右键菜单功能
re_context_menu
是rerun
系列crate中的一个支持库,用于为GUI应用程序添加上下文菜单和操作功能。
安装
在项目目录中运行以下Cargo命令:
cargo add re_context_menu
或者在Cargo.toml中添加:
re_context_menu = "0.24.1"
使用示例
以下是一个完整的demo示例,展示如何使用re_context_menu
为GUI应用添加右键菜单:
use egui::Context;
use re_context_menu::{ContextMenu, MenuItem, MenuSeparator};
fn show_context_menu(ctx: &Context) {
// 创建上下文菜单
let menu = ContextMenu::default()
// 添加菜单项
.item(MenuItem::new("复制").action(|| {
println!("复制操作被触发");
}))
.item(MenuItem::new("粘贴").action(|| {
println!("粘贴操作被触发");
}))
// 添加分隔线
.separator(MenuSeparator)
// 添加带有图标的菜单项
.item(
MenuItem::new("删除")
.icon("🗑️")
.action(|| {
println!("删除操作被触发");
})
.shortcut_text("Del"),
)
// 添加子菜单
.submenu(
"更多操作",
ContextMenu::default()
.item(MenuItem::new("重命名").action(|| {
println!("重命名操作被触发");
}))
.item(MenuItem::new("属性").action(|| {
println!("属性操作被触发");
})),
);
// 在GUI中显示上下文菜单
menu.show(ctx);
}
// 在egui的update函数中调用
fn update(ctx: &Context) {
// 检测右键点击
if ctx.input(|i| i.pointer.button_clicked(egui::PointerButton::Secondary)) {
show_context_menu(ctx);
}
}
完整示例代码
以下是一个完整的可运行示例,展示了如何在egui应用中使用re_context_menu:
use eframe::egui;
use egui::Context;
use re_context_menu::{ContextMenu, MenuItem, MenuSeparator};
fn main() -> eframe::Result<()> {
let options = eframe::NativeOptions::default();
eframe::run_native(
"Rust上下文菜单示例",
options,
Box::new(|_cc| Box::new(MyApp::default())),
)
}
#[derive(Default)]
struct MyApp;
impl eframe::App for MyApp {
fn update(&mut self, ctx: &Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.label("右键点击窗口任意位置显示上下文菜单");
// 检测右键点击
if ui.input(|i| i.pointer.button_clicked(egui::PointerButton::Secondary)) {
show_context_menu(ctx);
}
});
}
}
fn show_context_menu(ctx: &Context) {
// 创建上下文菜单
let menu = ContextMenu::default()
// 添加文件操作菜单项
.item(MenuItem::new("新建").action(|| {
println!("新建文件");
}))
.item(MenuItem::new("打开").action(|| {
println!("打开文件");
}))
.separator(MenuSeparator)
// 添加编辑操作菜单项
.item(
MenuItem::new("剪切")
.icon("✂️")
.action(|| {
println!("剪切内容");
})
.shortcut_text("Ctrl+X"),
)
.item(
MenuItem::new("复制")
.icon("📋")
.action(|| {
println!("复制内容");
})
.shortcut_text("Ctrl+C"),
)
.item(
MenuItem::new("粘贴")
.icon("📌")
.action(|| {
println!("粘贴内容");
})
.shortcut_text("Ctrl+V"),
)
.separator(MenuSeparator)
// 添加子菜单
.submenu(
"查看",
ContextMenu::default()
.item(MenuItem::new("放大").action(|| {
println!("放大视图");
}))
.item(MenuItem::new("缩小").action(|| {
println!("缩小视图");
})),
)
// 添加带图标的退出菜单项
.item(
MenuItem::new("退出")
.icon("🚪")
.action(|| {
println!("退出应用");
std::process::exit(0);
})
.shortcut_text("Alt+F4"),
);
// 显示上下文菜单
menu.show(ctx);
}
功能特性
- 支持创建多级菜单结构
- 可以添加菜单项、分隔线和子菜单
- 支持为菜单项添加图标和快捷键提示
- 与egui框架无缝集成
- 提供灵活的回调机制处理菜单项点击
许可证
re_context_menu
采用MIT或Apache-2.0双许可证。
1 回复