1use itertools::Itertools;
2use strum::IntoEnumIterator;
3use ui::prelude::*;
4use ui::{Keybinding, ModifierKey, ModifierKeys};
5
6use crate::story::Story;
7
8#[derive(Element, Default)]
9pub struct KeybindingStory {}
10
11impl KeybindingStory {
12 fn render<V: 'static>(&mut self, _: &mut V, cx: &mut ViewContext<V>) -> impl IntoElement<V> {
13 let all_modifier_permutations = ModifierKey::iter().permutations(2);
14
15 Story::container(cx)
16 .child(Story::title_for::<_, Keybinding>(cx))
17 .child(Story::label(cx, "Single Key"))
18 .child(Keybinding::new("Z".to_string(), ModifierKeys::new()))
19 .child(Story::label(cx, "Single Key with Modifier"))
20 .child(
21 div()
22 .flex()
23 .gap_3()
24 .children(ModifierKey::iter().map(|modifier| {
25 Keybinding::new("C".to_string(), ModifierKeys::new().add(modifier))
26 })),
27 )
28 .child(Story::label(cx, "Single Key with Modifier (Permuted)"))
29 .child(
30 div().flex().flex_col().children(
31 all_modifier_permutations
32 .chunks(4)
33 .into_iter()
34 .map(|chunk| {
35 div()
36 .flex()
37 .gap_4()
38 .py_3()
39 .children(chunk.map(|permutation| {
40 let mut modifiers = ModifierKeys::new();
41
42 for modifier in permutation {
43 modifiers = modifiers.add(modifier);
44 }
45
46 Keybinding::new("X".to_string(), modifiers)
47 }))
48 }),
49 ),
50 )
51 .child(Story::label(cx, "Single Key with All Modifiers"))
52 .child(Keybinding::new("Z".to_string(), ModifierKeys::all()))
53 .child(Story::label(cx, "Chord"))
54 .child(Keybinding::new_chord(
55 ("A".to_string(), ModifierKeys::new()),
56 ("Z".to_string(), ModifierKeys::new()),
57 ))
58 .child(Story::label(cx, "Chord with Modifier"))
59 .child(Keybinding::new_chord(
60 ("A".to_string(), ModifierKeys::new().control(true)),
61 ("Z".to_string(), ModifierKeys::new().shift(true)),
62 ))
63 }
64}