1use gpui::NoAction;
2use gpui::Render;
3use itertools::Itertools;
4use story::Story;
5
6use crate::{KeyBinding, prelude::*};
7
8pub struct KeybindingStory;
9
10pub fn binding(key: &str) -> gpui::KeyBinding {
11 gpui::KeyBinding::new(key, NoAction {}, None)
12}
13
14impl Render for KeybindingStory {
15 fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
16 let all_modifier_permutations = ["ctrl", "alt", "cmd", "shift"].into_iter().permutations(2);
17
18 Story::container(cx)
19 .child(Story::title_for::<KeyBinding>(cx))
20 .child(Story::label("Single Key", cx))
21 .child(KeyBinding::new_from_gpui(binding("Z"), cx))
22 .child(Story::label("Single Key with Modifier", cx))
23 .child(
24 div()
25 .flex()
26 .gap_3()
27 .child(KeyBinding::new_from_gpui(binding("ctrl-c"), cx))
28 .child(KeyBinding::new_from_gpui(binding("alt-c"), cx))
29 .child(KeyBinding::new_from_gpui(binding("cmd-c"), cx))
30 .child(KeyBinding::new_from_gpui(binding("shift-c"), cx)),
31 )
32 .child(Story::label("Single Key with Modifier (Permuted)", cx))
33 .child(
34 div().flex().flex_col().children(
35 all_modifier_permutations
36 .chunks(4)
37 .into_iter()
38 .map(|chunk| {
39 div()
40 .flex()
41 .gap_4()
42 .py_3()
43 .children(chunk.map(|permutation| {
44 KeyBinding::new_from_gpui(
45 binding(&(permutation.join("-") + "-x")),
46 cx,
47 )
48 }))
49 }),
50 ),
51 )
52 .child(Story::label("Single Key with All Modifiers", cx))
53 .child(KeyBinding::new_from_gpui(
54 binding("ctrl-alt-cmd-shift-z"),
55 cx,
56 ))
57 .child(Story::label("Chord", cx))
58 .child(KeyBinding::new_from_gpui(binding("a z"), cx))
59 .child(Story::label("Chord with Modifier", cx))
60 .child(KeyBinding::new_from_gpui(binding("ctrl-a shift-z"), cx))
61 .child(KeyBinding::new_from_gpui(binding("fn-s"), cx))
62 .child(Story::label("Single Key with All Modifiers (Linux)", cx))
63 .child(
64 KeyBinding::new_from_gpui(binding("ctrl-alt-cmd-shift-z"), cx)
65 .platform_style(PlatformStyle::Linux),
66 )
67 .child(Story::label("Chord (Linux)", cx))
68 .child(
69 KeyBinding::new_from_gpui(binding("a z"), cx).platform_style(PlatformStyle::Linux),
70 )
71 .child(Story::label("Chord with Modifier (Linux)", cx))
72 .child(
73 KeyBinding::new_from_gpui(binding("ctrl-a shift-z"), cx)
74 .platform_style(PlatformStyle::Linux),
75 )
76 .child(
77 KeyBinding::new_from_gpui(binding("fn-s"), cx).platform_style(PlatformStyle::Linux),
78 )
79 .child(Story::label("Single Key with All Modifiers (Windows)", cx))
80 .child(
81 KeyBinding::new_from_gpui(binding("ctrl-alt-cmd-shift-z"), cx)
82 .platform_style(PlatformStyle::Windows),
83 )
84 .child(Story::label("Chord (Windows)", cx))
85 .child(
86 KeyBinding::new_from_gpui(binding("a z"), cx)
87 .platform_style(PlatformStyle::Windows),
88 )
89 .child(Story::label("Chord with Modifier (Windows)", cx))
90 .child(
91 KeyBinding::new_from_gpui(binding("ctrl-a shift-z"), cx)
92 .platform_style(PlatformStyle::Windows),
93 )
94 .child(
95 KeyBinding::new_from_gpui(binding("fn-s"), cx)
96 .platform_style(PlatformStyle::Windows),
97 )
98 }
99}