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