keybinding.rs

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