7
public class GtkInterface : GLib.Object {
9
public OggCv.Core core { get; construct; }
11
private const string UI_FILE = "oggconvert.ui";
12
private const string LOGO_FILE = "oggconvert.svg";
15
private Gtk.Window main_window;
16
private Gtk.FileChooserButton file_chooser_button;
17
private Gtk.Button go_button;
18
private Gtk.FileChooserButton save_folder_button;
19
private Gtk.Entry output_file_entry;
20
private Gtk.HScale video_quality_slider;
21
private Gtk.Label video_quality_label;
22
private Gtk.HScale audio_quality_slider;
23
private Gtk.Label audio_quality_label;
24
private Gtk.ComboBox format_combobox;
25
private Gtk.Label format_label;
26
private Gtk.ComboBox container_combobox;
27
private Gtk.Label container_label;
31
public GtkInterface(OggCv.Core core) {
36
private void build_ui() {
37
var builder = new Gtk.Builder();
39
builder.add_from_file (UI_FILE);
41
var msg = new MessageDialog (null, DialogFlags.MODAL,
42
MessageType.ERROR, ButtonsType.CANCEL,
43
"Failed to load UI\n%s", e.message);
49
main_window = builder.get_object("app_window") as Gtk.Window;
50
var about_button = builder.get_object("about_button") as Gtk.Button;
51
var quit_button = builder.get_object("quit_button") as Gtk.Button;
52
go_button = builder.get_object("go_button") as Gtk.Button;
53
file_chooser_button = builder.get_object("filechooserbutton")
54
as Gtk.FileChooserButton;
55
save_folder_button = builder.get_object("save_folder_button")
56
as Gtk.FileChooserButton;
57
output_file_entry = builder.get_object("outfile_entry") as Gtk.Entry;
58
video_quality_slider = builder.get_object("video_quality_slider") as Gtk.HScale;
59
video_quality_label = builder.get_object("video_quality_label") as Gtk.Label;
60
audio_quality_slider = builder.get_object("audio_quality_slider") as Gtk.HScale;
61
audio_quality_label = builder.get_object("audio_quality_label") as Gtk.Label;
62
format_combobox = builder.get_object("format_combobox") as Gtk.ComboBox;
63
format_label = builder.get_object("format_label") as Gtk.Label;
64
container_combobox= builder.get_object("containter_combobox") as Gtk.ComboBox;
65
container_label = builder.get_object("container_label") as Gtk.Label;
69
main_window.destroy += on_quit;
70
about_button.clicked += on_about_clicked;
71
quit_button.clicked += on_quit;
72
go_button.clicked += on_go_clicked;
73
file_chooser_button.selection_changed += on_file_chooser_selection_changed;
74
save_folder_button.selection_changed += on_save_folder_changed;
75
video_quality_slider.value_changed += on_video_quality_slider_changed;
76
audio_quality_slider.value_changed += on_audio_quality_slider_changed;
77
//format_combobox.changed += on_format_combobox_changed;
78
//container_combobox.changed += on_container_combobox_changed;
83
connect_core_signals();
86
set_up_file_chooser(file_chooser_button);
88
main_window.set_default_icon_from_file(LOGO_FILE);
90
warning("%s", e.message);
94
main_window.show_all();
98
private void connect_core_signals() {
99
// Does Vala offer a way to connect to "notify::propname" that I
101
core.notify += (s, p) => {
104
on_core_input_uri_changed();
108
on_core_output_uri_changed();
111
case "video-quality": {
112
on_core_video_quality_changed();
118
core.uri_rejected += on_core_uri_rejected;
121
private void set_sensitivities() {
130
private void on_about_clicked() {
131
stdout.printf("About clicked\n");
134
private void on_quit() {
135
stdout.printf("Bye, then!\n");
139
private void on_go_clicked() {
140
stdout.printf("Go go go!\n");
143
private void on_file_chooser_selection_changed(Gtk.FileChooserButton fcb) {
144
string? new_uri = fcb.get_uri();
148
stdout.printf("New file selected: %s\n", new_uri);
149
core.open_uri(fcb.get_uri());
152
private void on_save_folder_changed() {
153
stdout.printf("New folder selected\n");
154
var new_folder = save_folder_button.get_uri();
155
var new_filename = output_file_entry.get_text();
156
var new_uri = GLib.Path.build_filename(new_folder, new_filename);
157
core.output_uri = new_uri;
161
private void on_video_quality_slider_changed() {
162
core.video_quality = (int) video_quality_slider.get_value();
165
private void on_audio_quality_slider_changed() {
166
core.audio_quality = (int) audio_quality_slider.get_value();
169
private void on_format_combobox_changed() {
172
private void on_container_combobox_changed() {
179
private void on_core_input_uri_changed() {
180
var new_uri = core.input_uri;
181
if (file_chooser_button.get_uri() != new_uri)
182
file_chooser_button.set_uri(new_uri);
185
private void on_core_output_uri_changed() {
186
var new_uri = core.output_uri;
187
stdout.printf("Core output-uri changed to %s\n", new_uri);
188
var new_folder = GLib.Path.get_dirname(new_uri);
189
var new_filename = GLib.Path.get_basename(new_uri);
190
stdout.printf(" with output folder %s\nand filename %s\n", new_folder, new_filename);
191
if (new_folder!=save_folder_button.get_uri()) {
192
save_folder_button.set_uri(new_uri);
194
if (new_filename != output_file_entry.get_text()) {
195
output_file_entry.set_text(new_filename);
200
private void on_core_video_quality_changed() {
201
stdout.printf("VIDEO QUALITY CHANGED!\n");
204
private void on_core_audio_quality_changed() {
205
stdout.printf("INPUT URI CHANGED!\n");
208
private void on_core_video_codec_changed() {
209
stdout.printf("INPUT URI CHANGED!\n");
212
private void on_core_uri_rejected(RejectionReason reason, string detail) {
213
stdout.printf("URI rejected: %s", detail);
219
private void set_up_file_chooser(Gtk.FileChooser fc) {
221
var video = new Gtk.FileFilter();
222
video.set_name("Video Files");
223
video.add_mime_type("video/*");
224
video.add_mime_type("application/x-flash-video");
226
var audio = new Gtk.FileFilter();
227
audio.set_name("Audio Files");
228
audio.add_mime_type("audio/*");
231
var all_media = new Gtk.FileFilter();
232
all_media.set_name("All Media Files");
233
all_media.add_mime_type("video/*");
234
all_media.add_mime_type("application/x-flash-video");
235
all_media.add_mime_type("audio/*");
237
var all_files = new Gtk.FileFilter();
238
all_files.set_name("All Files");
239
all_files.add_pattern("*");
241
fc.add_filter(all_media);
242
fc.add_filter(video);
243
fc.add_filter(audio);
244
fc.add_filter(all_files);
246
fc.set_local_only(false);
248
string user_home_dir = GLib.Environment.get_home_dir();
249
fc.set_current_folder(user_home_dir);