xref: /aosp_15_r20/external/perfetto/ui/src/widgets/hotkey_glyphs.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport m from 'mithril';
16*6dbdd20aSAndroid Build Coastguard Workerimport {getPlatform, Hotkey, Key, parseHotkey, Platform} from '../base/hotkeys';
17*6dbdd20aSAndroid Build Coastguard Workerimport {Icon} from './icon';
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Workerexport interface HotkeyGlyphsAttrs {
20*6dbdd20aSAndroid Build Coastguard Worker  hotkey: Hotkey;
21*6dbdd20aSAndroid Build Coastguard Worker  spoof?: Platform;
22*6dbdd20aSAndroid Build Coastguard Worker}
23*6dbdd20aSAndroid Build Coastguard Worker
24*6dbdd20aSAndroid Build Coastguard Worker// Renders a hotkey as a series of little keycaps.
25*6dbdd20aSAndroid Build Coastguard Workerexport class HotkeyGlyphs implements m.ClassComponent<HotkeyGlyphsAttrs> {
26*6dbdd20aSAndroid Build Coastguard Worker  view({attrs}: m.Vnode<HotkeyGlyphsAttrs>) {
27*6dbdd20aSAndroid Build Coastguard Worker    const {hotkey, spoof} = attrs;
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard Worker    const platform = spoof || getPlatform();
30*6dbdd20aSAndroid Build Coastguard Worker    const result = parseHotkey(hotkey);
31*6dbdd20aSAndroid Build Coastguard Worker    if (result) {
32*6dbdd20aSAndroid Build Coastguard Worker      const {key, modifier} = result;
33*6dbdd20aSAndroid Build Coastguard Worker      const hasMod = modifier.includes('Mod');
34*6dbdd20aSAndroid Build Coastguard Worker      const hasCtrl = modifier.includes('Ctrl');
35*6dbdd20aSAndroid Build Coastguard Worker      const hasAlt = modifier.includes('Alt');
36*6dbdd20aSAndroid Build Coastguard Worker      const hasShift = modifier.includes('Shift');
37*6dbdd20aSAndroid Build Coastguard Worker
38*6dbdd20aSAndroid Build Coastguard Worker      return m(
39*6dbdd20aSAndroid Build Coastguard Worker        'span.pf-hotkey',
40*6dbdd20aSAndroid Build Coastguard Worker        hasMod && m('span.pf-keycap', glyphForMod(platform)),
41*6dbdd20aSAndroid Build Coastguard Worker        hasCtrl && m('span.pf-keycap', glyphForCtrl(platform)),
42*6dbdd20aSAndroid Build Coastguard Worker        hasAlt && m('span.pf-keycap', glyphForAlt(platform)),
43*6dbdd20aSAndroid Build Coastguard Worker        hasShift && m('span.pf-keycap', glyphForShift()),
44*6dbdd20aSAndroid Build Coastguard Worker        m('span.pf-keycap', glyphForKey(key, platform)),
45*6dbdd20aSAndroid Build Coastguard Worker      );
46*6dbdd20aSAndroid Build Coastguard Worker    } else {
47*6dbdd20aSAndroid Build Coastguard Worker      return m('span.pf-keycap', '???');
48*6dbdd20aSAndroid Build Coastguard Worker    }
49*6dbdd20aSAndroid Build Coastguard Worker  }
50*6dbdd20aSAndroid Build Coastguard Worker}
51*6dbdd20aSAndroid Build Coastguard Worker
52*6dbdd20aSAndroid Build Coastguard Workerexport interface KeycapGlyphsAttrs {
53*6dbdd20aSAndroid Build Coastguard Worker  keyValue: Key;
54*6dbdd20aSAndroid Build Coastguard Worker  spoof?: Platform;
55*6dbdd20aSAndroid Build Coastguard Worker}
56*6dbdd20aSAndroid Build Coastguard Worker
57*6dbdd20aSAndroid Build Coastguard Worker// Renders a single keycap.
58*6dbdd20aSAndroid Build Coastguard Workerexport class KeycapGlyph implements m.ClassComponent<KeycapGlyphsAttrs> {
59*6dbdd20aSAndroid Build Coastguard Worker  view({attrs}: m.Vnode<KeycapGlyphsAttrs>) {
60*6dbdd20aSAndroid Build Coastguard Worker    const {keyValue, spoof} = attrs;
61*6dbdd20aSAndroid Build Coastguard Worker    const platform = spoof || getPlatform();
62*6dbdd20aSAndroid Build Coastguard Worker    return m('span.pf-keycap', glyphForKey(keyValue, platform));
63*6dbdd20aSAndroid Build Coastguard Worker  }
64*6dbdd20aSAndroid Build Coastguard Worker}
65*6dbdd20aSAndroid Build Coastguard Worker
66*6dbdd20aSAndroid Build Coastguard Workerfunction glyphForKey(key: Key, platform: Platform): m.Children {
67*6dbdd20aSAndroid Build Coastguard Worker  if (key === 'Enter') {
68*6dbdd20aSAndroid Build Coastguard Worker    return m(Icon, {icon: 'keyboard_return'});
69*6dbdd20aSAndroid Build Coastguard Worker  } else if (key === 'ArrowUp') {
70*6dbdd20aSAndroid Build Coastguard Worker    return m(Icon, {icon: 'arrow_upward'});
71*6dbdd20aSAndroid Build Coastguard Worker  } else if (key === 'ArrowDown') {
72*6dbdd20aSAndroid Build Coastguard Worker    return m(Icon, {icon: 'arrow_downward'});
73*6dbdd20aSAndroid Build Coastguard Worker  } else if (key === 'Space') {
74*6dbdd20aSAndroid Build Coastguard Worker    return m(Icon, {icon: 'space_bar'});
75*6dbdd20aSAndroid Build Coastguard Worker  } else if (key === 'Escape') {
76*6dbdd20aSAndroid Build Coastguard Worker    if (platform === 'Mac') {
77*6dbdd20aSAndroid Build Coastguard Worker      return 'esc';
78*6dbdd20aSAndroid Build Coastguard Worker    } else {
79*6dbdd20aSAndroid Build Coastguard Worker      return 'Esc';
80*6dbdd20aSAndroid Build Coastguard Worker    }
81*6dbdd20aSAndroid Build Coastguard Worker  } else {
82*6dbdd20aSAndroid Build Coastguard Worker    return key;
83*6dbdd20aSAndroid Build Coastguard Worker  }
84*6dbdd20aSAndroid Build Coastguard Worker}
85*6dbdd20aSAndroid Build Coastguard Worker
86*6dbdd20aSAndroid Build Coastguard Workerfunction glyphForMod(platform: Platform): m.Children {
87*6dbdd20aSAndroid Build Coastguard Worker  if (platform === 'Mac') {
88*6dbdd20aSAndroid Build Coastguard Worker    return m(Icon, {icon: 'keyboard_command_key'});
89*6dbdd20aSAndroid Build Coastguard Worker  } else {
90*6dbdd20aSAndroid Build Coastguard Worker    return 'Ctrl';
91*6dbdd20aSAndroid Build Coastguard Worker  }
92*6dbdd20aSAndroid Build Coastguard Worker}
93*6dbdd20aSAndroid Build Coastguard Worker
94*6dbdd20aSAndroid Build Coastguard Workerfunction glyphForShift(): m.Children {
95*6dbdd20aSAndroid Build Coastguard Worker  return m(Icon, {icon: 'shift'});
96*6dbdd20aSAndroid Build Coastguard Worker}
97*6dbdd20aSAndroid Build Coastguard Worker
98*6dbdd20aSAndroid Build Coastguard Workerfunction glyphForCtrl(platform: Platform): m.Children {
99*6dbdd20aSAndroid Build Coastguard Worker  if (platform === 'Mac') {
100*6dbdd20aSAndroid Build Coastguard Worker    return m(Icon, {icon: 'keyboard_control_key'});
101*6dbdd20aSAndroid Build Coastguard Worker  } else {
102*6dbdd20aSAndroid Build Coastguard Worker    return 'Ctrl';
103*6dbdd20aSAndroid Build Coastguard Worker  }
104*6dbdd20aSAndroid Build Coastguard Worker}
105*6dbdd20aSAndroid Build Coastguard Worker
106*6dbdd20aSAndroid Build Coastguard Workerfunction glyphForAlt(platform: Platform): m.Children {
107*6dbdd20aSAndroid Build Coastguard Worker  if (platform === 'Mac') {
108*6dbdd20aSAndroid Build Coastguard Worker    return m(Icon, {icon: 'keyboard_option_key'});
109*6dbdd20aSAndroid Build Coastguard Worker  } else {
110*6dbdd20aSAndroid Build Coastguard Worker    return 'Alt';
111*6dbdd20aSAndroid Build Coastguard Worker  }
112*6dbdd20aSAndroid Build Coastguard Worker}
113