bzr branch
http://gegoxaren.bato24.eu/bzr/loggerouter/trunk
1
by Gustav Hartvigsson
* Inital release |
1 |
/*
|
2 |
This file is part of LoggerOuter.
|
|
3 |
||
4 |
LoggerOuter is free software: you can redistribute it and/or modify it under the
|
|
5 |
terms of the GNU Lesser General Public License as published by the Free Software
|
|
6 |
Foundation, either version 3 of the License, or (at your option) any later
|
|
7 |
version.
|
|
8 |
||
9 |
LoggerOuter is distributed in the hope that it will be useful, but WITHOUT
|
|
10 |
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
11 |
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
12 |
License for more details.
|
|
13 |
||
14 |
You should have received a copy of the GNU Lessel General Public License
|
|
15 |
along with LoggerOuter. If not, see <https://www.gnu.org/licenses/>.
|
|
16 |
*/
|
|
17 |
||
18 |
public class LO.ActionButton : Gtk.Button { |
|
19 |
// This whole class is cursed. :-)
|
|
20 |
Gtk.Image icon; |
|
21 |
Gtk.Box box; |
|
22 |
Gtk.Label widget_label; |
|
23 |
||
24 |
string? exec_action; |
|
25 |
||
26 |
string _button_text; |
|
27 |
||
28 |
void run_action () { |
|
29 |
||
30 |
string[]? argv = null; |
|
31 |
string[] envp = Environ.get (); |
|
32 |
Pid pid; |
|
33 |
try { |
|
34 |
GLib.Shell.parse_argv (exec_action, out argv); |
|
35 |
||
36 |
GLib.Process.spawn_async (null, argv, envp, |
|
37 |
GLib.SpawnFlags.DO_NOT_REAP_CHILD | GLib.SpawnFlags.SEARCH_PATH_FROM_ENVP , |
|
38 |
null, out pid); |
|
39 |
|
|
40 |
} catch (GLib.SpawnError e) { |
|
5
by Gustav Hartvigsson
[timer.vala] Fixed the timeout being triggered even is user has pressed concle. |
41 |
LO.present_dialog ("ERROR: %s\n", e.message); |
1
by Gustav Hartvigsson
* Inital release |
42 |
} catch (GLib.ShellError e) { |
5
by Gustav Hartvigsson
[timer.vala] Fixed the timeout being triggered even is user has pressed concle. |
43 |
LO.present_dialog ("ERROR: %s\n", e.message); |
1
by Gustav Hartvigsson
* Inital release |
44 |
} |
45 |
app.try_quit (); |
|
46 |
} |
|
47 |
||
48 |
||
49 |
public ActionButton (ActionEntry action) { |
|
50 |
this.box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0) { |
|
51 |
homogeneous = false, |
|
52 |
}; |
|
53 |
|
|
54 |
if (action.icon != null) { |
|
55 |
this.icon = new Gtk.Image () { |
|
56 |
vexpand = false, |
|
57 |
hexpand = false, |
|
58 |
pixel_size = 28, |
|
59 |
width_request = 28, |
|
60 |
height_request = 28, |
|
61 |
}; |
|
62 |
string _icon_name; |
|
63 |
if (!action.icon_is_path) { |
|
64 |
icon.icon_name = action.icon; |
|
65 |
} else { |
|
66 |
_icon_name = strip_prelude_of_path (action.icon); |
|
67 |
this.icon.set_from_file (_icon_name); |
|
68 |
} |
|
69 |
box.append (icon); |
|
70 |
} |
|
71 |
||
72 |
if (action.text != null) { |
|
73 |
_button_text = action.text; |
|
74 |
} else { |
|
75 |
_button_text = action.group; |
|
76 |
} |
|
77 |
||
78 |
this.exec_action = action.exec; |
|
79 |
||
80 |
this.widget_label = new Gtk.Label (_button_text) { |
|
81 |
hexpand = true, |
|
82 |
vexpand = true, |
|
83 |
halign = Gtk.Align.CENTER, |
|
84 |
valign = Gtk.Align.CENTER, |
|
85 |
margin_end = 28, |
|
86 |
}; |
|
87 |
box.append (widget_label); |
|
88 |
this.set_child (this.box); |
|
89 |
||
90 |
this.clicked.connect (() => { |
|
91 |
var timer = new LO.Timer (this._button_text, 15, (e) => { |
|
92 |
if (e == LO.Timer.ExitCode.OK) { |
|
93 |
this.run_action (); |
|
94 |
} |
|
95 |
}); |
|
96 |
timer.set_transient_for (app.get_active_window ()); |
|
97 |
timer.show (); |
|
98 |
}); |
|
99 |
||
100 |
} |
|
101 |
||
102 |
construct { |
|
103 |
this.focusable = true; |
|
104 |
} |
|
105 |
||
106 |
}
|