.
1 /*
2 Copyright (C) 2014 2015 Johan Mattsson
3
4 This library is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 3 of the
7 License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13 */
14
15 using Cairo;
16 using B;
17
18 namespace BirdFont {
19
20 /** Interface for events from native window to the current tab. */
21 public class Menu : AbstractMenu {
22
23 public Menu () {
24 base ();
25
26 SubMenu menu = new SubMenu ();
27 SubMenu file_menu = new SubMenu ();
28 SubMenu edit_menu = new SubMenu ();
29 SubMenu layers_menu = new SubMenu ();
30 SubMenu export_menu = new SubMenu ();
31 SubMenu tab_menu = new SubMenu ();
32 SubMenu kerning_menu = new SubMenu ();
33 SubMenu ligature_menu = new SubMenu ();
34 SubMenu git_menu = new SubMenu ();
35
36 // file menu
37 MenuItem file = add_menu_item (t_("File"));
38 file.action.connect (() => {
39 set_menu (file_menu);
40 });
41 menu.items.add (file);
42
43 MenuItem new_file = add_menu_item (t_("New"), "new");
44 new_file.action.connect (() => {
45 MenuTab.new_file ();
46 show_menu = false;
47 });
48 file_menu.items.add (new_file);
49
50 MenuItem open = add_menu_item (t_("Open"), "open");
51 open.action.connect (() => {
52 show_menu = false;
53 MenuTab.load ();
54 });
55 file_menu.items.add (open);
56
57 MenuItem recent_files = add_menu_item (t_("Recent Files"), "recent files");
58 recent_files.action.connect (() => {
59 show_menu = false;
60 MainWindow.open_recent_files_tab ();
61 });
62 file_menu.items.add (recent_files);
63
64 MenuItem save = add_menu_item (t_("Save"), "save");
65 save.action.connect (() => {
66 MenuTab.save ();
67 show_menu = false;
68 });
69 file_menu.items.add (save);
70
71 MenuItem save_as = add_menu_item (t_("Save As"), "save as");
72 save_as.action.connect (() => {
73 MenuTab.save_as ();
74 show_menu = false;
75 });
76 file_menu.items.add (save_as);
77
78 MenuItem select_character_set = add_menu_item (t_("Select Character Set"), "select character set");
79 select_character_set.action.connect (() => {
80 MenuTab.select_language ();
81 show_menu = false;
82 });
83 file_menu.items.add (select_character_set);
84
85 MenuItem quit = add_menu_item (t_("Quit"), "quit");
86 quit.action.connect (() => {
87 MenuTab.quit ();
88 show_menu = false;
89 });
90 file_menu.items.add (quit);
91
92 // edit menu
93 MenuItem edit = add_menu_item (t_("Edit"));
94 edit.action.connect (() => {
95 set_menu (edit_menu);
96 });
97 menu.items.add (edit);
98
99 MenuItem undo = add_menu_item (t_("Undo"), "undo");
100 undo.action.connect (() => {
101 TabContent.undo ();
102 show_menu = false;
103 });
104 edit_menu.items.add (undo);
105
106 MenuItem redo = add_menu_item (t_("Redo"), "redo");
107 redo.action.connect (() => {
108 TabContent.redo ();
109 show_menu = false;
110 });
111 edit_menu.items.add (redo);
112
113 MenuItem copy = add_menu_item (t_("Copy"), "copy");
114 copy.action.connect (() => {
115 ClipTool.copy ();
116 show_menu = false;
117 });
118 edit_menu.items.add (copy);
119
120 MenuItem paste = add_menu_item (t_("Paste"), "paste");
121 paste.action.connect (() => {
122 ClipTool.paste ();
123 show_menu = false;
124 });
125 edit_menu.items.add (paste);
126
127 MenuItem paste_in_place = add_menu_item (t_("Paste In Place"), "paste in place", "Glyph");
128 paste_in_place.action.connect (() => {
129 ClipTool.paste_in_place ();
130 show_menu = false;
131 });
132 edit_menu.items.add (paste_in_place);
133
134 MenuItem select_all_paths = add_menu_item (t_("Select All Paths"), "select all paths", "Glyph");
135 select_all_paths.action.connect (() => {
136 MainWindow.select_all_paths ();
137 show_menu = false;
138 });
139 edit_menu.items.add (select_all_paths);
140
141 MenuItem select_all_glyphs = add_menu_item (t_("Select All Glyphs"), "select all glyphs", "Overview");
142 select_all_glyphs.action.connect (() => {
143 MainWindow.get_overview ().select_all_glyphs ();
144 show_menu = false;
145 });
146 edit_menu.items.add (select_all_glyphs);
147
148 MenuItem move_to_baseline = add_menu_item (t_("Move To Baseline"), "move to baseline", "Glyph");
149 move_to_baseline.action.connect (() => {
150 MenuTab.move_to_baseline ();
151 show_menu = false;
152 });
153 edit_menu.items.add (move_to_baseline);
154
155 MenuItem search = add_menu_item (t_("Search"), "search");
156 search.action.connect (() => {
157 OverView.search ();
158 show_menu = false;
159 });
160 edit_menu.items.add (search);
161
162 MenuItem simplify_path = add_menu_item (t_("Simplify Path"), "simplify path", "Glyph");
163 simplify_path.action.connect (() => {
164 MenuTab.simplify_path ();
165 show_menu = false;
166 });
167 edit_menu.items.add (simplify_path);
168
169 MenuItem merge_paths = add_menu_item (t_("Merge Paths"), "merge_paths", "Glyph");
170 merge_paths.action.connect (() => {
171 Task t = new Task (merge_selected_paths);
172 MainWindow.native_window.run_background_thread (t);
173
174 show_menu = false;
175 });
176 edit_menu.items.add (merge_paths);
177
178 MenuItem close_path = add_menu_item (t_("Close Path"), "close path", "Glyph");
179 close_path.action.connect (() => {
180 PenTool.close_all_paths ();
181 show_menu = false;
182 });
183 edit_menu.items.add (close_path);
184
185 MenuItem glyph_sequence = add_menu_item (t_("Glyph Sequence"), "glyph sequence");
186 glyph_sequence.action.connect (() => {
187 MainWindow.update_glyph_sequence ();
188 show_menu = false;
189 });
190 edit_menu.items.add (glyph_sequence);
191
192 MenuItem set_background_glyph = add_menu_item (t_("Set Background Glyph"), "set background glyph", "Glyph");
193 set_background_glyph.action.connect (() => {
194 MenuTab.use_current_glyph_as_background ();
195 show_menu = false;
196 });
197 edit_menu.items.add (set_background_glyph);
198
199 MenuItem remove_background_glyph = add_menu_item (t_("Remove Background Glyph"), "remove background glyph", "Glyph");
200 remove_background_glyph.action.connect (() => {
201 MenuTab.reset_glyph_background ();
202 show_menu = false;
203 });
204 edit_menu.items.add (remove_background_glyph);
205
206 MenuItem create_guide = add_menu_item (t_("Create Guide"), "create guide");
207 create_guide.action.connect (() => {
208 MainWindow.get_current_glyph ().add_custom_guide ();
209 show_menu = false;
210 });
211 edit_menu.items.add (create_guide);
212
213 MenuItem show_guide_guide = add_menu_item (t_("List Guides"), "show guide tab");
214 show_guide_guide.action.connect (() => {
215 MenuTab.show_guide_tab ();
216 show_menu = false;
217 });
218 edit_menu.items.add (show_guide_guide);
219
220 MenuItem select_point_above = add_menu_item (t_("Select Point Above"), "select point above", "Glyph");
221 select_point_above.action.connect (() => {
222 PenTool.select_point_up ();
223 show_menu = false;
224 });
225 edit_menu.items.add (select_point_above);
226
227 MenuItem select_next_point = add_menu_item (t_("Select Next Point"), "select next point", "Glyph");
228 select_next_point.action.connect (() => {
229 PenTool.select_point_right ();
230 show_menu = false;
231 });
232 edit_menu.items.add (select_next_point);
233
234 MenuItem select_previous_point = add_menu_item (t_("Select Previous Point"), "select previous point", "Glyph");
235 select_previous_point.action.connect (() => {
236 PenTool.select_point_left ();
237 show_menu = false;
238 });
239 edit_menu.items.add (select_previous_point);
240
241 MenuItem select_point_below = add_menu_item (t_("Select Point Below"), "select point below", "Glyph");
242 select_point_below.action.connect (() => {
243 PenTool.select_point_down ();
244 show_menu = false;
245 });
246 edit_menu.items.add (select_point_below);
247
248 // layers
249 MenuItem layers = add_menu_item (t_("Layers"));
250 layers.action.connect (() => {
251 set_menu (layers_menu);
252 });
253 menu.items.add (layers);
254
255 MenuItem layer_up = add_menu_item (t_("Move Layer Up"), "move layer up", "Glyph");
256 layer_up.action.connect (() => {
257 MainWindow.get_current_glyph ().move_layer_up ();
258 DrawingTools.update_layers ();
259 });
260 layers_menu.items.add (layer_up);
261
262 MenuItem layer_down = add_menu_item (t_("Move Layer Down"), "move layer down", "Glyph");
263 layer_down.action.connect (() => {
264 MainWindow.get_current_glyph ().move_layer_down ();
265 DrawingTools.update_layers ();
266 });
267 layers_menu.items.add (layer_down);
268
269 // import and export
270 MenuItem export = add_menu_item (t_("Import and Export"));
271 export.action.connect (() => {
272 set_menu (export_menu);
273 });
274 menu.items.add (export);
275
276 MenuItem export_fonts = add_menu_item (t_("Export Fonts"), "export");
277 export_fonts.action.connect (() => {
278 MenuTab.export_fonts_in_background ();
279 show_menu = false;
280 });
281 export_menu.items.add (export_fonts);
282
283 MenuItem export_glyph = add_menu_item (t_("Export Glyph as SVG"), "export glyph as svg", "Glyph");
284 export_glyph.action.connect (() => {
285 ExportTool.export_current_glyph ();
286 show_menu = false;
287 });
288 export_menu.items.add (export_glyph);
289
290 MenuItem import_svg = add_menu_item (t_("Import SVG file"), "import svg file", "Glyph");
291 import_svg.action.connect (() => {
292 SvgParser.import ();
293 show_menu = false;
294 });
295 export_menu.items.add (import_svg);
296
297 MenuItem import_svg_folder = add_menu_item (t_("Import SVG folder"), "import svg folder", "");
298 import_svg_folder.action.connect (() => {
299 SvgParser.import_folder ();
300 show_menu = false;
301 });
302 export_menu.items.add (import_svg_folder);
303
304 MenuItem import_background_image = add_menu_item (t_("Import Background Image"), "import background image");
305 import_background_image.action.connect (() => {
306 MenuTab.show_background_tab ();
307 show_menu = false;
308 });
309 export_menu.items.add (import_background_image);
310
311 MenuItem export_settings = add_menu_item (t_("Export Settings"), "export settings");
312 export_settings.action.connect (() => {
313 MenuTab.show_export_settings_tab ();
314 show_menu = false;
315 });
316 export_menu.items.add (export_settings);
317
318 MenuItem preview = add_menu_item (t_("Preview"), "preview");
319 preview.action.connect (() => {
320 MenuTab.preview ();
321 show_menu = false;
322 });
323 export_menu.items.add (preview);
324
325 // tab menu
326 MenuItem tab = add_menu_item (t_("Tab"));
327 tab.action.connect (() => {
328 set_menu (tab_menu);
329 });
330 menu.items.add (tab);
331
332 MenuItem next_tab = add_menu_item (t_("Next Tab"), "next tab");
333 next_tab.action.connect (() => {
334 MainWindow.next_tab ();
335 show_menu = false;
336 });
337 tab_menu.items.add (next_tab);
338
339 MenuItem previous_tab = add_menu_item (t_("Previous Tab"), "previous tab");
340 previous_tab.action.connect (() => {
341 MainWindow.previous_tab ();
342 show_menu = false;
343 });
344 tab_menu.items.add (previous_tab);
345
346 MenuItem close_tab = add_menu_item (t_("Close Tab"), "close tab");
347 close_tab.action.connect (() => {
348 MainWindow.close_tab ();
349 show_menu = false;
350 });
351 tab_menu.items.add (close_tab);
352
353 MenuItem close_all_tabs = add_menu_item (t_("Close All Tabs"), "close all tabs");
354 close_all_tabs.action.connect (() => {
355 MainWindow.close_all_tabs ();
356 show_menu = false;
357 });
358 tab_menu.items.add (close_all_tabs);
359
360 // tab menu
361 MenuItem kerning = add_menu_item (t_("Spacing and Kerning"));
362 kerning.action.connect (() => {
363 set_menu (kerning_menu);
364 });
365 menu.items.add (kerning);
366
367 MenuItem spacing_tab = add_menu_item (t_("Show Spacing Tab"), "show spacing tab");
368 spacing_tab.action.connect (() => {
369 MenuTab.show_spacing_tab ();
370 show_menu = false;
371 });
372 kerning_menu.items.add (spacing_tab);
373
374 MenuItem kerning_tab = add_menu_item (t_("Show Kerning Tab"), "show kerning tab");
375 kerning_tab.action.connect (() => {
376 MenuTab.show_kerning_context ();
377 show_menu = false;
378 });
379 kerning_menu.items.add (kerning_tab);
380
381 MenuItem list_kernings = add_menu_item (t_("List Kerning Pairs"), "list kerning pairs");
382 list_kernings.action.connect (() => {
383 MenuTab.list_all_kerning_pairs ();
384 show_menu = false;
385 });
386 kerning_menu.items.add (list_kernings);
387
388 MenuItem show_spacing = add_menu_item (t_("Spacing Classes"), "show spacing classes");
389 show_spacing.action.connect (() => {
390 MenuTab.show_spacing_class_tab ();
391 show_menu = false;
392 });
393 kerning_menu.items.add (show_spacing);
394
395 MenuItem next_kerning_pair = add_menu_item (t_("Select Next Kerning Pair"), "select next kerning pair");
396 next_kerning_pair.action.connect (() => {
397 KerningDisplay.next_pair ();
398 show_menu = false;
399 });
400 next_kerning_pair.add_display("Kerning");
401 next_kerning_pair.add_display("Spacing");
402 kerning_menu.items.add (next_kerning_pair);
403
404 MenuItem previous_kerning_pair = add_menu_item (t_("Select Previous Kerning Pair"), "select previous kerning pair");
405 previous_kerning_pair.action.connect (() => {
406 KerningDisplay.previous_pair ();
407 show_menu = false;
408 });
409 previous_kerning_pair.add_display("Kerning");
410 previous_kerning_pair.add_display("Spacing");
411 kerning_menu.items.add (previous_kerning_pair);
412
413 MenuItem load_kerning_strings = add_menu_item (t_("Load Kerning Strings"), "load kerning strings");
414 load_kerning_strings.action.connect (() => {
415 BirdFont.get_current_font ().kerning_strings.load_file ();
416 show_menu = false;
417 });
418 kerning_menu.items.add (load_kerning_strings);
419
420 MenuItem reload_kerning_strings = add_menu_item (t_("Reload Kerning Strings"), "reloadload kerning strings");
421 reload_kerning_strings.action.connect (() => {
422 Font f = BirdFont.get_current_font ();
423 f.kerning_strings.load (f);
424 show_menu = false;
425 });
426 kerning_menu.items.add (reload_kerning_strings);
427
428 // ligature menu
429 MenuItem ligature = add_menu_item (t_("Ligatures"));
430 ligature.action.connect (() => {
431 set_menu (ligature_menu);
432 });
433 menu.items.add (ligature);
434
435 MenuItem ligature_tab = add_menu_item (t_("Show Ligatures"), "show ligature tab");
436 ligature_tab.action.connect (() => {
437 MenuTab.show_ligature_tab ();
438 show_menu = false;
439 });
440 ligature_menu.items.add (ligature_tab);
441
442 MenuItem add_ligature = add_menu_item (t_("Add Ligature"), "add ligature");
443 add_ligature.action.connect (() => {
444 MenuTab.add_ligature ();
445 show_menu = false;
446 });
447 ligature_menu.items.add (add_ligature);
448
449 // git menu
450 if (BirdFont.has_argument ("--test")) {
451 MenuItem git = add_menu_item (t_("Git"));
452 git.action.connect (() => {
453 set_menu (git_menu);
454 });
455 menu.items.add (git);
456
457 MenuItem save_bfp = add_menu_item (t_("Save As .bfp"), "save as .bfp");
458 save_bfp.action.connect (() => {
459 MenuTab.save_as_bfp ();
460 show_menu = false;
461 });
462 git_menu.items.add (save_bfp);
463 }
464
465 // show overview
466 MenuItem overview = add_menu_item (t_("Overview"));
467 overview.action.connect (() => {
468 MenuTab.select_overview ();
469 show_menu = false;
470 });
471 menu.items.add (overview);
472
473 // settings
474 MenuItem settings = add_menu_item (t_("Settings"), "settings");
475 settings.action.connect (() => {
476 MenuTab.show_settings_tab ();
477 show_menu = false;
478 });
479 menu.items.add (settings);
480
481 MenuItem description = add_menu_item (t_("Name and Description"), "name and description");
482 description.action.connect (() => {
483 MenuTab.show_description ();
484 show_menu = false;
485 });
486 menu.items.add (description);
487
488 MenuItem version = add_menu_item (t_("Version"), "birdfont version");
489 version.action.connect (() => {
490 MainWindow.show_message (t_("Version") + ": " + get_version ());
491 show_menu = false;
492 });
493 menu.items.add (version);
494
495 set_current_menu (menu);
496 top_menu = menu;
497
498 add_tool_key_bindings ();
499 load_key_bindings ();
500 }
501
502 void merge_selected_paths () {
503 // FIXME: make task
504 StrokeTool s = new StrokeTool ();
505 s.merge_selected_paths ();
506 }
507 }
508
509 }
510