1use gpui::NoAction;
2use gpui::Render;
3use itertools::Itertools;
4use story::{Story, StoryContainer};
5
6use crate::{prelude::*, KeyBinding, KeyBindingDisplay};
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(KeyBinding::new(binding("ctrl-alt-cmd-shift-z")).display(KeyBindingDisplay::Linux))
63 .child(Story::label("Chord (Linux)"))
64 .child(KeyBinding::new(binding("a z")).display(KeyBindingDisplay::Linux))
65 .child(Story::label("Chord with Modifier (Linux)"))
66 .child(KeyBinding::new(binding("ctrl-a shift-z")).display(KeyBindingDisplay::Linux))
67 .child(KeyBinding::new(binding("fn-s")).display(KeyBindingDisplay::Linux))
68 .child(Story::label("Single Key with All Modifiers (Windows)"))
69 .child(KeyBinding::new(binding("ctrl-alt-cmd-shift-z")).display(KeyBindingDisplay::Windows))
70 .child(Story::label("Chord (Windows)"))
71 .child(KeyBinding::new(binding("a z")).display(KeyBindingDisplay::Windows))
72 .child(Story::label("Chord with Modifier (Windows)"))
73 .child(KeyBinding::new(binding("ctrl-a shift-z")).display(KeyBindingDisplay::Windows))
74 .child(KeyBinding::new(binding("fn-s")).display(KeyBindingDisplay::Windows))
75 }
76}