1use gpui::{actions, Div, Render};
2use itertools::Itertools;
3
4use crate::prelude::*;
5use crate::{KeyBinding, Story};
6
7pub struct KeybindingStory;
8
9actions!(NoAction);
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(cx)
22 .child(Story::title_for::<KeyBinding>(cx))
23 .child(Story::label(cx, "Single Key"))
24 .child(KeyBinding::new(binding("Z")))
25 .child(Story::label(cx, "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(cx, "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(cx, "Single Key with All Modifiers"))
53 .child(KeyBinding::new(binding("ctrl-alt-cmd-shift-z")))
54 .child(Story::label(cx, "Chord"))
55 .child(KeyBinding::new(binding("a z")))
56 .child(Story::label(cx, "Chord with Modifier"))
57 .child(KeyBinding::new(binding("ctrl-a shift-z")))
58 .child(KeyBinding::new(binding("fn-s")))
59 }
60}