Skip to content

Commit 6cd0f15

Browse files
committed
codegen menu.ts
1 parent 49e3d04 commit 6cd0f15

2 files changed

Lines changed: 115 additions & 0 deletions

File tree

python/generate_menus.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,58 @@ def generate_rust(menus):
112112
'''.replace('{menu_code}', menu_code)
113113

114114

115+
116+
def typescript_for_item(item):
117+
typ = item['type']
118+
if typ == 'native':
119+
nativeItem = item['nativeMenuItem']
120+
return f'<NativeMenuItem item="{nativeItem}" />'
121+
elif typ == 'separator':
122+
return '<MenuSeparator />'
123+
elif typ == 'custom':
124+
item_id = item['id']
125+
title = item['title']
126+
code = f'<MenuItem id="{item_id}" title="{title}" '
127+
accel = item.get('accelerator')
128+
if accel:
129+
code += f'accelerator="{accel}" '
130+
code += ' />'
131+
return code
132+
assert ValueError(typ)
133+
134+
135+
def generate_typescript(menus):
136+
lines = [
137+
'<MenuBar>'
138+
]
139+
for i, menu in enumerate(menus):
140+
title = menu['title']
141+
lines += [
142+
f'<Menu title="{title}">',
143+
*[
144+
typescript_for_item(item)
145+
for item in menu['items']
146+
],
147+
'</Menu>',
148+
]
149+
150+
lines.append('</MenuBar>')
151+
menu_code = '\n'.join(lines)
152+
153+
return '''// THIS FILE IS GENERATED. Edit menu.json instead.
154+
import React from 'react';
155+
156+
declare const MenuBar: React.ComponentType<any>;
157+
declare const Menu: React.ComponentType<any>;
158+
declare const NativeMenuItem: React.ComponentType<any>;
159+
declare const MenuSeparator: React.ComponentType<any>;
160+
declare const MenuItem: React.ComponentType<any>;
161+
162+
export function AppMenu() {
163+
{menu_code}
164+
}
165+
'''.replace('{menu_code}', menu_code)
166+
115167
if __name__ == '__main__':
116168
menu_json = json.load(open('menu.json'))
117169
menus = menu_json['menus']
@@ -120,3 +172,9 @@ def generate_rust(menus):
120172
with open('src-tauri/src/core/menu.rs', 'w') as out:
121173
out.write(menu_rs)
122174
subprocess.check_output(['rustfmt', 'src-tauri/src/core/menu.rs'])
175+
176+
menu_ts = generate_typescript(menus)
177+
with open('src/components/menu.tsx', 'w') as out:
178+
out.write(menu_ts)
179+
subprocess.check_output(['yarn', 'prettier', '--config', 'package.json', '--write', 'src/components/menu.tsx'])
180+
subprocess.check_output(['yarn', 'eslint', '--fix', '--ext', '.js,.ts,.tsx', 'src/components/menu.tsx'])

src/components/menu.tsx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// THIS FILE IS GENERATED. Edit menu.json instead.
2+
import React from 'react';
3+
4+
declare const MenuBar: React.ComponentType<any>;
5+
declare const Menu: React.ComponentType<any>;
6+
declare const NativeMenuItem: React.ComponentType<any>;
7+
declare const MenuSeparator: React.ComponentType<any>;
8+
declare const MenuItem: React.ComponentType<any>;
9+
10+
export function AppMenu() {
11+
<MenuBar>
12+
<Menu title="">
13+
<NativeMenuItem item="About" />
14+
<MenuSeparator />
15+
<MenuItem accelerator="cmdOrControl+," id="refstudio://menu/settings" title="Settings" />
16+
<MenuSeparator />
17+
<NativeMenuItem item="Services" />
18+
<NativeMenuItem item="Hide" />
19+
<NativeMenuItem item="HideOthers" />
20+
<MenuSeparator />
21+
<NativeMenuItem item="Quit" />
22+
</Menu>
23+
<Menu title="File">
24+
<MenuItem accelerator="cmdOrControl+N" id="refstudio://menu/file/new" title="New File" />
25+
<MenuItem accelerator="cmdOrControl+S" id="refstudio://menu/file/save" title="Save" />
26+
<MenuItem id="refstudio://menu/file/markdown" title="Save File as Markdown..." />
27+
<MenuSeparator />
28+
<MenuItem id="refstudio://menu/file/project/new" title="New Project" />
29+
<MenuItem id="refstudio://menu/file/project/open" title="Open Project" />
30+
<MenuItem id="refstudio://menu/file/project/close" title="Close Project" />
31+
<MenuSeparator />
32+
<MenuItem accelerator="cmdOrControl+W" id="refstudio://menu/file/close" title="Close Editor" />
33+
<MenuItem id="refstudio://menu/file/close/all" title="Close All Editors" />
34+
</Menu>
35+
<Menu title="Edit">
36+
<NativeMenuItem item="Undo" />
37+
<NativeMenuItem item="Redo" />
38+
<MenuSeparator />
39+
<NativeMenuItem item="Cut" />
40+
<NativeMenuItem item="Copy" />
41+
<NativeMenuItem item="Paste" />
42+
<NativeMenuItem item="SelectAll" />
43+
</Menu>
44+
<Menu title="References">
45+
<MenuItem accelerator="cmdOrControl+R" id="refstudio://menu/references/open" title="Open" />
46+
<MenuItem id="refstudio://menu/references/upload" title="Upload..." />
47+
</Menu>
48+
<Menu title="View">
49+
<NativeMenuItem item="EnterFullScreen" />
50+
<MenuItem accelerator="F11" id="refstudio://menu/view/notifications" title="Notifications" />
51+
</Menu>
52+
<Menu title="Window">
53+
<NativeMenuItem item="Minimize" />
54+
<NativeMenuItem item="Zoom" />
55+
</Menu>
56+
</MenuBar>;
57+
}

0 commit comments

Comments
 (0)