1use gpui::NoAction;
2use gpui::Render;
3use itertools::Itertools;
4use story::{Story, StoryContainer};
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 StoryContainer::new(
19 "KeyBinding",
20 "crates/ui/src/components/stories/keybinding.rs",
21 )
22 .child(Story::label("Single Key"))
23 .child(KeyBinding::new(binding("Z")))
24 .child(Story::label("Single Key with Modifier"))
25 .child(
26 div()
27 .flex()
28 .gap_3()
29 .child(KeyBinding::new(binding("ctrl-c")))
30 .child(KeyBinding::new(binding("alt-c")))
31 .child(KeyBinding::new(binding("cmd-c")))
32 .child(KeyBinding::new(binding("shift-c"))),
33 )
34 .child(Story::label("Single Key with Modifier (Permuted)"))
35 .child(
36 div()
37 .flex()
38 .flex_col()
39 .children(
40 all_modifier_permutations
41 .chunks(4)
42 .into_iter()
43 .map(|chunk| {
44 div()
45 .flex()
46 .gap_4()
47 .py_3()
48 .children(chunk.map(|permutation| {
49 KeyBinding::new(binding(&(permutation.join("-") + "-x")))
50 }))
51 }),
52 ),
53 )
54 .child(Story::label("Single Key with All Modifiers"))
55 .child(KeyBinding::new(binding("ctrl-alt-cmd-shift-z")))
56 .child(Story::label("Chord"))
57 .child(KeyBinding::new(binding("a z")))
58 .child(Story::label("Chord with Modifier"))
59 .child(KeyBinding::new(binding("ctrl-a shift-z")))
60 .child(KeyBinding::new(binding("fn-s")))
61 .child(Story::label("Single Key with All Modifiers (Linux)"))
62 .child(
63 KeyBinding::new(binding("ctrl-alt-cmd-shift-z")).platform_style(PlatformStyle::Linux),
64 )
65 .child(Story::label("Chord (Linux)"))
66 .child(KeyBinding::new(binding("a z")).platform_style(PlatformStyle::Linux))
67 .child(Story::label("Chord with Modifier (Linux)"))
68 .child(KeyBinding::new(binding("ctrl-a shift-z")).platform_style(PlatformStyle::Linux))
69 .child(KeyBinding::new(binding("fn-s")).platform_style(PlatformStyle::Linux))
70 .child(Story::label("Single Key with All Modifiers (Windows)"))
71 .child(
72 KeyBinding::new(binding("ctrl-alt-cmd-shift-z")).platform_style(PlatformStyle::Windows),
73 )
74 .child(Story::label("Chord (Windows)"))
75 .child(KeyBinding::new(binding("a z")).platform_style(PlatformStyle::Windows))
76 .child(Story::label("Chord with Modifier (Windows)"))
77 .child(KeyBinding::new(binding("ctrl-a shift-z")).platform_style(PlatformStyle::Windows))
78 .child(KeyBinding::new(binding("fn-s")).platform_style(PlatformStyle::Windows))
79 }
80}