Rust选择面板插件库re_selection_panel的使用:高效UI组件与交互式选择功能实现
Rust选择面板插件库re_selection_panel的使用:高效UI组件与交互式选择功能实现
re_selection_panel是rerun系列crate之一,提供了选择面板的UI实现。
安装
在项目目录中运行以下Cargo命令:
cargo add re_selection_panel
或者在Cargo.toml中添加:
re_selection_panel = "0.24.1"
许可证
该库采用MIT或Apache-2.0双许可证
完整示例代码
以下是一个使用re_selection_panel创建交互式选择面板的完整示例:
use eframe::egui;
use re_selection_panel::SelectionPanel;
fn main() -> eframe::Result<()> {
// 创建选择项列表
let items = vec![
"Item 1".to_string(),
"Item 2".to_string(),
"Item 3".to_string(),
];
let mut selected_item = None;
eframe::run_simple_native(
"Selection Panel Demo",
move |ctx, _frame| {
egui::CentralPanel::default().show(ctx, |ui| {
// 创建选择面板
SelectionPanel::new("example_panel")
.show(
ui,
&items,
&mut selected_item,
|item| item.clone(), // 如何显示每个项目
|ui, item| { // 如何渲染每个项目
ui.label(item);
}
);
// 显示当前选择
if let Some(selected) = &selected_item {
ui.label(format!("Selected: {}", selected));
}
});
},
)
}
功能说明
- 创建了一个简单的选择面板,包含3个项目
- 使用
SelectionPanel::new()
初始化面板 show()
方法用于渲染面板并处理交互- 可以跟踪当前选中的项目
高级用法
您还可以自定义选择面板的行为和外观:
SelectionPanel::new("advanced_panel")
.with_height(300.0) // 设置固定高度
.with_default_selected(1) // 默认选中第二个项目
.show(
ui,
&items,
&mut selected_item,
|item| format!(">>> {} <<<", item), // 自定义显示格式
|ui, item| {
ui.horizontal(|ui| {
ui.label("•");
ui.label(item);
});
}
);
这个库非常适合需要实现交互式选择功能的Rust GUI应用,特别是在数据可视化或需要用户从多个选项中选择的场景中。
进阶完整示例
以下是一个更完整的示例,展示了如何在实际应用中使用re_selection_panel:
use eframe::egui;
use re_selection_panel::SelectionPanel;
struct MyApp {
items: Vec<String>,
selected_item: Option<String>,
selected_index: Option<usize>,
}
impl MyApp {
fn new() -> Self {
// 初始化数据
let items = (1..=10)
.map(|i| format!("选项 {}", i))
.collect::<Vec<_>>();
Self {
items,
selected_item: None,
selected_index: None,
}
}
}
impl eframe::App for MyApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("高级选择面板演示");
// 创建两列布局
egui::SidePanel::left("left_panel").show(ctx, |ui| {
// 使用选择面板
SelectionPanel::new("my_selection_panel")
.with_height(400.0)
.with_default_selected(0)
.show(
ui,
&self.items,
&mut self.selected_index,
|item| item.clone(),
|ui, item| {
ui.horizontal(|ui| {
ui.label("✓");
ui.label(item);
});
}
);
});
// 右侧面板显示详细信息
egui::SidePanel::right("right_panel").show(ctx, |ui| {
if let Some(idx) = self.selected_index {
ui.label(format!("当前选择: {}", self.items[idx]));
ui.separator();
ui.label("详细信息:");
ui.label(format!("这是第 {} 个选项的详细信息区域", idx + 1));
} else {
ui.label("请从左侧选择一个项目");
}
});
});
}
}
fn main() -> eframe::Result<()> {
let options = eframe::NativeOptions::default();
eframe::run_native(
"高级选择面板演示",
options,
Box::new(|_cc| Box::new(MyApp::new())),
)
}
这个进阶示例展示了:
- 创建一个包含10个项目的选择面板
- 使用左右分栏布局
- 跟踪选择索引而不仅仅是项目内容
- 在右侧面板显示选中项的详细信息
- 自定义项目渲染方式(带复选框样式)
- 设置默认选中第一个项目
- 固定面板高度为400像素
1 回复
根据您提供的内容,我将整理完整的re_selection_panel示例demo。以下是完整的示例代码,展示了如何使用re_selection_panel库创建一个功能完善的选择面板应用:
use eframe::egui;
use re_selection_panel::{SelectionPanel, SelectionStyle};
use std::sync::Arc;
fn main() -> eframe::Result<()> {
let options = eframe::NativeOptions::default();
eframe::run_native(
"re_selection_panel演示",
options,
Box::new(|_cc| Box::new(MyApp::default())),
)
}
struct MyApp {
// 单选示例
single_items: Vec<&'static str>,
single_selected: Option<usize>,
// 多选示例
multi_items: Arc<Vec<&'static str>>,
multi_selected: Vec<usize>,
// 自定义渲染示例
custom_items: Vec<(&'static str, &'static str)>,
custom_selected: Option<usize>,
}
impl Default for MyApp {
fn default() -> Self {
Self {
single_items: vec!["选项1", "选项2", "选项3", "选项4"],
single_selected: None,
multi_items: Arc::new(vec!["苹果", "香蕉", "橙子", "葡萄"]),
multi_selected: vec![0, 2], // 默认选中苹果和橙子
custom_items: vec![
("项目A", "这是项目A的描述"),
("项目B", "这是项目B的描述"),
("项目C", "这是项目C的描述"),
],
custom_selected: None,
}
}
}
impl eframe::App for MyApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("re_selection_panel演示");
// 单选面板示例
ui.label("单选面板:");
let single_panel = SelectionPanel::new()
.with_items(&self.single_items)
.with_style(SelectionStyle::Single)
.with_selected_index(self.single_selected)
.with_placeholder_text("请选择一项");
if let Some(selected) = single_panel.show(ui) {
self.single_selected = selected;
println!("单选选择: {}", self.single_items[selected.unwrap()]);
}
ui.separator();
// 多选面板示例
ui.label("多选面板:");
let multi_panel = SelectionPanel::new()
.with_shared_items(self.multi_items.clone())
.with_style(SelectionStyle::Multiple)
.with_selected_indices(self.multi_selected.clone())
.with_search_enabled(true);
if let Some(selected) = multi_panel.show(ui) {
self.multi_selected = selected;
println!("多选选择: {:?}", self.multi_selected);
}
ui.separator();
// 自定义渲染面板示例
ui.label("自定义渲染面板:");
let custom_panel = SelectionPanel::new()
.with_items(&self.custom_items)
.with_renderer(|ui, item, selected| {
ui.horizontal(|ui| {
ui.label(item.0);
if selected {
ui.label("✓");
}
ui.label(item.1);
});
});
if let Some(selected) = custom_panel.show(ui) {
self.custom_selected = selected;
println!("自定义选择: {:?}", selected);
}
ui.separator();
// 性能优化示例
ui.label("性能优化面板 (虚拟滚动):");
let perf_panel = SelectionPanel::new()
.with_virtual_scrolling(true)
.with_item_height(32.0)
.with_items((0..1000).map(|i| format!("项目 {}", i)).collect::<Vec<_>>());
let _ = perf_panel.show(ui);
});
}
}
这个完整示例演示了以下功能:
- 创建基本的单选选择面板
- 实现多选面板功能并启用搜索
- 自定义面板项的渲染方式
- 使用虚拟滚动优化大型数据集性能
- 使用Arc共享数据以提高性能
- 集成到egui框架中
要运行此示例,请确保在Cargo.toml中添加以下依赖:
[dependencies]
eframe = "0.22"
egui = "0.22"
re_selection_panel = "0.3"
这个示例展示了re_selection_panel库的主要功能,包括单选/多选模式、自定义渲染、性能优化以及与egui的集成。您可以根据实际需求进一步扩展和定制。