1use gpui::{actions, Div, Render};
2use itertools::Itertools;
3use story::Story;
4
5use crate::prelude::*;
6use crate::KeyBinding;
7
8pub struct KeybindingStory;
9
10actions!(NoAction);
11
12pub fn binding(key: &str) -> gpui::KeyBinding {
13 gpui::KeyBinding::new(key, NoAction {}, None)
14}
15
16impl Render for KeybindingStory {
17 type Element = Div;
18
19 fn render(&mut self, _cx: &mut ViewContext<Self>) -> Self::Element {
20 let all_modifier_permutations = ["ctrl", "alt", "cmd", "shift"].into_iter().permutations(2);
21
22 Story::container()
23 .child(Story::title_for::<KeyBinding>())
24 .child(Story::label("Single Key"))
25 .child(KeyBinding::new(binding("Z")))
26 .child(Story::label("Single Key with Modifier"))
27 .child(
28 div()
29 .flex()
30 .gap_3()
31 .child(KeyBinding::new(binding("ctrl-c")))
32 .child(KeyBinding::new(binding("alt-c")))
33 .child(KeyBinding::new(binding("cmd-c")))
34 .child(KeyBinding::new(binding("shift-c"))),
35 )
36 .child(Story::label("Single Key with Modifier (Permuted)"))
37 .child(
38 div().flex().flex_col().children(
39 all_modifier_permutations
40 .chunks(4)
41 .into_iter()
42 .map(|chunk| {
43 div()
44 .flex()
45 .gap_4()
46 .py_3()
47 .children(chunk.map(|permutation| {
48 KeyBinding::new(binding(&*(permutation.join("-") + "-x")))
49 }))
50 }),
51 ),
52 )
53 .child(Story::label("Single Key with All Modifiers"))
54 .child(KeyBinding::new(binding("ctrl-alt-cmd-shift-z")))
55 .child(Story::label("Chord"))
56 .child(KeyBinding::new(binding("a z")))
57 .child(Story::label("Chord with Modifier"))
58 .child(KeyBinding::new(binding("ctrl-a shift-z")))
59 .child(KeyBinding::new(binding("fn-s")))
60 }
61}