mxl_player_components/
actions.rs

1use const_format;
2
3pub enum Accelerators {
4    Quit,
5    FileChooser,
6    TogglePlaylistVisibility,
7    TogglePlayPause,
8    NextFrame,
9    Previous,
10    Next,
11    IncreaseVolume,
12    DecreaseVolume,
13    IncreaseSpeed,
14    DecreaseSpeed,
15    ResetSpeed,
16    FullScreen,
17    DumpPipeline,
18    OpenProcDir,
19    Preferences,
20    VideoOffsets,
21}
22
23#[macro_export]
24#[cfg(target_os = "macos")]
25macro_rules! action_accelerator_with_os_modifier {
26    ($accelerator:expr) => {
27        const_format::formatcp!("<Meta>{}", $accelerator)
28    };
29}
30
31#[macro_export]
32#[cfg(not(target_os = "macos"))]
33macro_rules! action_accelerator_with_os_modifier {
34    ($accelerator:expr) => {
35        const_format::formatcp!("<Primary>{}", $accelerator)
36    };
37}
38
39// The syntax of the accelerators and the modifiers is described here:
40// https://gtk-rs.org/gtk4-rs/stable/latest/docs/gtk4/fn.accelerator_parse.html
41//
42// To browse all non modifier accelerator names see:
43// https://gtk-rs.org/gtk4-rs/stable/latest/docs/src/gdk4/keys.rs.html#164
44//
45// To use a key name remove the 'GDK_KEY_' at the start.
46// NOTE: Always pay attention to lower and upper names, for example 'space' vs 'Left'.
47pub fn accelerators(accel: Accelerators) -> Vec<&'static str> {
48    match accel {
49        Accelerators::Quit => vec![action_accelerator_with_os_modifier!("Q")],
50        Accelerators::FileChooser => vec![action_accelerator_with_os_modifier!("O")],
51        Accelerators::TogglePlaylistVisibility => vec![action_accelerator_with_os_modifier!("B")],
52        Accelerators::TogglePlayPause => vec!["space", "AudioPlay", action_accelerator_with_os_modifier!("space")],
53        Accelerators::NextFrame => vec![action_accelerator_with_os_modifier!("<Alt>Right")],
54        Accelerators::Previous => vec![action_accelerator_with_os_modifier!("Left"), "AudioPrev"],
55        Accelerators::Next => vec![action_accelerator_with_os_modifier!("Right"), "AudioNext"],
56        Accelerators::IncreaseVolume => vec![action_accelerator_with_os_modifier!("Up")],
57        Accelerators::DecreaseVolume => vec![action_accelerator_with_os_modifier!("Down")],
58        Accelerators::IncreaseSpeed => vec![
59            action_accelerator_with_os_modifier!("plus"),
60            action_accelerator_with_os_modifier!("KP_Add"),
61        ],
62        Accelerators::DecreaseSpeed => vec![
63            action_accelerator_with_os_modifier!("minus"),
64            action_accelerator_with_os_modifier!("KP_Subtract"),
65        ],
66        Accelerators::ResetSpeed => vec![
67            action_accelerator_with_os_modifier!("0"),
68            action_accelerator_with_os_modifier!("KP_0"),
69        ],
70        Accelerators::FullScreen => vec![action_accelerator_with_os_modifier!("F")],
71        Accelerators::DumpPipeline => vec![action_accelerator_with_os_modifier!("<Alt>D")],
72        Accelerators::OpenProcDir => vec![action_accelerator_with_os_modifier!("D")],
73        Accelerators::Preferences => vec![action_accelerator_with_os_modifier!("comma")],
74        Accelerators::VideoOffsets => vec![action_accelerator_with_os_modifier!("T")],
75    }
76}