mirror of
https://github.com/lotabout/skim.git
synced 2026-09-10 15:26:18 -04:00
* chore: remove skim::Item run_items wrapper * fix: properly trigger re-render on custom previews * feat: add AppendItems event * feat!: internally compute indexes at match time (removes get/set_index) * chore: generate completions & manpage * chore: better benchmarks --------- Co-authored-by: Skim bot <skim-bot@skim-rs.github.io>
52 lines
1.2 KiB
Rust
52 lines
1.2 KiB
Rust
extern crate skim;
|
|
use skim::prelude::*;
|
|
|
|
/// This example illustrates downcasting custom structs that implement
|
|
/// `SkimItem` after calling `Skim::run_with`.
|
|
|
|
#[derive(Debug, Clone)]
|
|
struct Item {
|
|
text: String,
|
|
}
|
|
|
|
impl SkimItem for Item {
|
|
fn text(&self) -> Cow<'_, str> {
|
|
Cow::Borrowed(&self.text)
|
|
}
|
|
|
|
fn preview(&self, _context: PreviewContext) -> ItemPreview {
|
|
ItemPreview::Text(self.text.to_owned())
|
|
}
|
|
}
|
|
|
|
pub fn main() {
|
|
let options = SkimOptionsBuilder::default()
|
|
.height("50%")
|
|
.multi(true)
|
|
.preview("")
|
|
.build()
|
|
.unwrap();
|
|
|
|
let (tx, rx): (SkimItemSender, SkimItemReceiver) = unbounded();
|
|
|
|
tx.send(vec![
|
|
Arc::new(Item { text: "a".into() }) as Arc<dyn SkimItem>,
|
|
Arc::new(Item { text: "b".into() }) as Arc<dyn SkimItem>,
|
|
Arc::new(Item { text: "c".into() }) as Arc<dyn SkimItem>,
|
|
])
|
|
.unwrap();
|
|
|
|
drop(tx);
|
|
|
|
let selected_items = Skim::run_with(options, Some(rx))
|
|
.map(|out| out.selected_items)
|
|
.unwrap_or_default()
|
|
.iter()
|
|
.map(|selected_item| selected_item.downcast_item::<Item>().unwrap().to_owned())
|
|
.collect::<Vec<Item>>();
|
|
|
|
for item in selected_items {
|
|
println!("{item:?}");
|
|
}
|
|
}
|