1use gpui::NoAction;
2use gpui::Render;
3use itertools::Itertools;
4use story::Story;
5
6use crate::{prelude::*, KeyBinding};
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, _cx: &mut ViewContext<Self>) -> impl IntoElement {
16 let all_modifier_permutations = ["ctrl", "alt", "cmd", "shift"].into_iter().permutations(2);
17
18 Story::container()
19 .child(Story::title_for::<KeyBinding>())
20 .child(Story::label("Single Key"))
21 .child(KeyBinding::new(binding("Z")))
22 .child(Story::label("Single Key with Modifier"))
23 .child(
24 div()
25 .flex()
26 .gap_3()
27 .child(KeyBinding::new(binding("ctrl-c")))
28 .child(KeyBinding::new(binding("alt-c")))
29 .child(KeyBinding::new(binding("cmd-c")))
30 .child(KeyBinding::new(binding("shift-c"))),
31 )
32 .child(Story::label("Single Key with Modifier (Permuted)"))
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(binding(&(permutation.join("-") + "-x")))
45 }))
46 }),
47 ),
48 )
49 .child(Story::label("Single Key with All Modifiers"))
50 .child(KeyBinding::new(binding("ctrl-alt-cmd-shift-z")))
51 .child(Story::label("Chord"))
52 .child(KeyBinding::new(binding("a z")))
53 .child(Story::label("Chord with Modifier"))
54 .child(KeyBinding::new(binding("ctrl-a shift-z")))
55 .child(KeyBinding::new(binding("fn-s")))
56 .child(Story::label("Single Key with All Modifiers (Linux)"))
57 .child(
58 KeyBinding::new(binding("ctrl-alt-cmd-shift-z"))
59 .platform_style(PlatformStyle::Linux),
60 )
61 .child(Story::label("Chord (Linux)"))
62 .child(KeyBinding::new(binding("a z")).platform_style(PlatformStyle::Linux))
63 .child(Story::label("Chord with Modifier (Linux)"))
64 .child(KeyBinding::new(binding("ctrl-a shift-z")).platform_style(PlatformStyle::Linux))
65 .child(KeyBinding::new(binding("fn-s")).platform_style(PlatformStyle::Linux))
66 .child(Story::label("Single Key with All Modifiers (Windows)"))
67 .child(
68 KeyBinding::new(binding("ctrl-alt-cmd-shift-z"))
69 .platform_style(PlatformStyle::Windows),
70 )
71 .child(Story::label("Chord (Windows)"))
72 .child(KeyBinding::new(binding("a z")).platform_style(PlatformStyle::Windows))
73 .child(Story::label("Chord with Modifier (Windows)"))
74 .child(
75 KeyBinding::new(binding("ctrl-a shift-z")).platform_style(PlatformStyle::Windows),
76 )
77 .child(KeyBinding::new(binding("fn-s")).platform_style(PlatformStyle::Windows))
78 }
79}