1use gpui::NoAction;
2use gpui::{Div, 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 type Element = Div;
17
18 fn render(&mut self, _cx: &mut ViewContext<Self>) -> Self::Element {
19 let all_modifier_permutations = ["ctrl", "alt", "cmd", "shift"].into_iter().permutations(2);
20
21 Story::container()
22 .child(Story::title_for::<KeyBinding>())
23 .child(Story::label("Single Key"))
24 .child(KeyBinding::new(binding("Z")))
25 .child(Story::label("Single Key with Modifier"))
26 .child(
27 div()
28 .flex()
29 .gap_3()
30 .child(KeyBinding::new(binding("ctrl-c")))
31 .child(KeyBinding::new(binding("alt-c")))
32 .child(KeyBinding::new(binding("cmd-c")))
33 .child(KeyBinding::new(binding("shift-c"))),
34 )
35 .child(Story::label("Single Key with Modifier (Permuted)"))
36 .child(
37 div().flex().flex_col().children(
38 all_modifier_permutations
39 .chunks(4)
40 .into_iter()
41 .map(|chunk| {
42 div()
43 .flex()
44 .gap_4()
45 .py_3()
46 .children(chunk.map(|permutation| {
47 KeyBinding::new(binding(&*(permutation.join("-") + "-x")))
48 }))
49 }),
50 ),
51 )
52 .child(Story::label("Single Key with All Modifiers"))
53 .child(KeyBinding::new(binding("ctrl-alt-cmd-shift-z")))
54 .child(Story::label("Chord"))
55 .child(KeyBinding::new(binding("a z")))
56 .child(Story::label("Chord with Modifier"))
57 .child(KeyBinding::new(binding("ctrl-a shift-z")))
58 .child(KeyBinding::new(binding("fn-s")))
59 }
60}