forked from p-e-w/finalterm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTextMenu.vala
94 lines (74 loc) · 2.78 KB
/
TextMenu.vala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
* Copyright © 2013–2014 Philipp Emanuel Weidmann <[email protected]>
*
* Nemo vir est qui mundum non reddat meliorem.
*
*
* This file is part of Final Term.
*
* Final Term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Final Term is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Final Term. If not, see <http://www.gnu.org/licenses/>.
*/
public class TextMenu : Object {
public MarkerType marker_type { get; set; }
public enum MarkerType {
CODE,
PATTERN
}
public int code { get; set; }
public Regex pattern { get; set; }
public string label { get; set; }
public int color { get; set; }
public Gtk.Menu menu { get; set; }
public string text { get; set; }
public TextMenu.load_from_file(string filename) {
var menu_file = new KeyFile();
try {
menu_file.load_from_file(filename, KeyFileFlags.NONE);
} catch (Error e) { error(_("Failed to load text menu definitions %s: %s"), filename, e.message); }
try {
if (menu_file.get_string("Parameters", "marker-type") == "code") {
marker_type = MarkerType.CODE;
code = menu_file.get_integer("Parameters", "code");
} else {
marker_type = MarkerType.PATTERN;
pattern = new Regex(menu_file.get_value("Parameters", "pattern"), RegexCompileFlags.OPTIMIZE);
}
label = menu_file.get_string("Parameters", "label");
color = menu_file.get_integer("Parameters", "color");
menu = new Gtk.Menu();
foreach (var label in menu_file.get_keys("Menu")) {
if (label == "$$$SEPARATOR$$$") {
menu.append(new Gtk.SeparatorMenuItem());
} else {
var menu_item = new Gtk.MenuItem.with_label("");
Gtk.Label menu_item_label = (Gtk.Label)menu_item.get_children().nth_data(0);
menu_item_label.set_markup(label);
var commands = new Gee.ArrayList<Command>();
foreach (var command_specification in menu_file.get_string_list("Menu", label)) {
commands.add(new Command.from_command_specification(command_specification));
}
menu_item.activate.connect(() => {
var placeholder_substitutes = new Gee.ArrayList<string>();
placeholder_substitutes.add(text);
foreach (var command in commands) {
command.execute(placeholder_substitutes);
}
});
menu.append(menu_item);
}
}
menu.show_all();
} catch (Error e) { warning(_("Error in text menu %s: %s"), filename, e.message); }
}
}