Rust上下文菜单插件库re_context_menu的使用,为GUI应用提供灵活可定制的右键菜单功能

Rust上下文菜单插件库re_context_menu的使用,为GUI应用提供灵活可定制的右键菜单功能

re_context_menurerun系列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);
}

功能特性

  1. 支持创建多级菜单结构
  2. 可以添加菜单项、分隔线和子菜单
  3. 支持为菜单项添加图标和快捷键提示
  4. 与egui框架无缝集成
  5. 提供灵活的回调机制处理菜单项点击

许可证

re_context_menu采用MIT或Apache-2.0双许可证。


1 回复

re_context_menu: Rust上下文菜单插件库

介绍

re_context_menu是一个为Rust GUI应用提供灵活可定制右键菜单功能的库。它支持多种GUI框架,允许开发者轻松创建和管理上下文菜单,包括子菜单、快捷键、图标等功能。

主要特性

  • 跨平台支持(Windows、macOS、Linux)
  • 支持多种GUI框架(如egui、iced等)
  • 可定制的菜单项和子菜单
  • 支持快捷键绑定
  • 支持菜单项图标
  • 菜单状态动态更新

完整示例

以下是一个结合了多种特性的完整示例:

use re_context_menu::{ContextMenu, MenuItem, KeyCode, Modifiers, CustomMenuItem};
use egui::Context;

fn main() {
    // 创建主菜单
    let mut main_menu = ContextMenu::new();
    
    // 添加基本菜单项
    main_menu.add_item(MenuItem::new("新建窗口", || {
        println!("创建新窗口");
    }));
    
    // 添加带快捷键的菜单项
    main_menu.add_item(
        MenuItem::new("保存", || println!("保存文件"))
            .shortcut(KeyCode::S, Modifiers::CTRL)
    );
    
    // 添加分隔线
    main_menu.add_separator();
    
    // 创建编辑子菜单
    let mut edit_menu = ContextMenu::new();
    edit_menu.add_item(
        MenuItem::new("撤销", || println!("撤销操作"))
            .shortcut(KeyCode::Z, Modifiers::CTRL)
    );
    edit_menu.add_item(
        MenuItem::new("重做", || println!("重做操作"))
            .shortcut(KeyCode::Y, Modifiers::CTRL)
    );
    
    // 添加子菜单到主菜单
    main_menu.add_submenu("编辑", edit_menu);
    
    // 添加动态菜单项
    let has_content = true;
    if has_content {
        main_menu.add_item(MenuItem::new("打印内容", || {
            println!("打印当前内容");
        }));
    }
    
    // 添加自定义渲染项
    main_menu.add_custom_item(CustomMenuItem::new(Box::new(|ui| {
        ui.label("自定义控件");
        if ui.button("特殊操作").clicked() {
            println!("执行特殊操作");
        }
    })));
    
    // 添加菜单事件
    main_menu.on_show(|| println!("菜单即将显示"));
    main_menu.on_hide(|| println!("菜单已隐藏"));
    
    // 模拟在egui框架中使用
    let egui_ctx = Context::default();
    main_menu.show_in_egui(&egui_ctx);
    
    // 或者直接显示
    // main_menu.show();
}

代码说明

  1. 首先创建主菜单ContextMenu对象
  2. 使用add_item添加普通菜单项,可绑定回调函数
  3. 使用shortcut方法为菜单项添加快捷键
  4. 使用add_separator添加菜单分隔线
  5. 创建子菜单并添加到主菜单
  6. 根据条件动态添加菜单项
  7. 使用add_custom_item添加自定义渲染的菜单项
  8. 使用on_showon_hide添加菜单显示/隐藏事件
  9. 最后可选择在egui框架中显示或直接显示

注意事项

  1. 确保GUI框架已正确初始化
  2. 菜单操作应在主线程执行
  3. 不同平台对菜单样式的支持可能略有差异
  4. 复杂的自定义渲染项可能影响性能
回到顶部