OSDN Git Service

LinGui: expunge the remaining bits of xvid from the gtk gui
[handbrake-jp/handbrake-jp-git.git] / gtk / src / settings.c
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3  * settings.c
4  * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
5  * 
6  * settings.c is free software.
7  * 
8  * You may redistribute it and/or modify it under the terms of the
9  * GNU General Public License, as published by the Free Software
10  * Foundation; either version 2 of the License, or (at your option)
11  * any later version.
12  * 
13  */
14 #include <fcntl.h>
15 #include <unistd.h>
16 #include <glib.h>
17 #include <glib/gstdio.h>
18 #include <string.h>
19 #include <gtk/gtk.h>
20 #include "settings.h"
21 #include "hb-backend.h"
22 #include "values.h"
23
24 void dump_settings(GValue *settings);
25 void ghb_pref_audio_init(signal_user_data_t *ud);
26
27 GObject*
28 debug_get_object(GtkBuilder* b, const gchar *n)
29 {
30         g_message("name %s\n", n);
31         return gtk_builder_get_object(b, n);
32 }
33
34 GValue*
35 ghb_settings_new()
36 {
37         return ghb_dict_value_new();
38 }
39
40 void
41 ghb_settings_set_value(
42         GValue *settings, 
43         const gchar *key, 
44         const GValue *value)
45 {
46         if (key == NULL || value == NULL)
47                 return;
48         ghb_dict_insert(settings, g_strdup(key), ghb_value_dup(value));
49 }
50
51 void
52 ghb_settings_take_value(GValue *settings, const gchar *key, GValue *value)
53 {
54         ghb_dict_insert(settings, g_strdup(key), value);
55 }
56
57 void
58 ghb_settings_set_string(
59         GValue *settings, 
60         const gchar *key, 
61         const gchar *sval)
62 {
63         GValue *value;
64         value = ghb_string_value_new(sval);
65         ghb_dict_insert(settings, g_strdup(key), value);
66 }
67
68 void
69 ghb_settings_set_double(GValue *settings, const gchar *key, gdouble dval)
70 {
71         GValue *value;
72         value = ghb_double_value_new(dval);
73         ghb_dict_insert(settings, g_strdup(key), value);
74 }
75
76 void
77 ghb_settings_set_int64(GValue *settings, const gchar *key, gint64 ival)
78 {
79         GValue *value;
80         value = ghb_int64_value_new(ival);
81         ghb_dict_insert(settings, g_strdup(key), value);
82 }
83
84 void
85 ghb_settings_set_int(GValue *settings, const gchar *key, gint ival)
86 {
87         GValue *value;
88         value = ghb_int64_value_new((gint64)ival);
89         ghb_dict_insert(settings, g_strdup(key), value);
90 }
91
92 void
93 ghb_settings_set_boolean(GValue *settings, const gchar *key, gboolean bval)
94 {
95         GValue *value;
96         value = ghb_boolean_value_new(bval);
97         ghb_dict_insert(settings, g_strdup(key), value);
98 }
99
100 GValue*
101 ghb_settings_get_value(const GValue *settings, const gchar *key)
102 {
103         GValue *value;
104         value = ghb_dict_lookup(settings, key);
105         if (value == NULL)
106                 g_warning("returning null (%s)", key);
107         return value;
108 }
109
110 gboolean
111 ghb_settings_get_boolean(const GValue *settings, const gchar *key)
112 {
113         const GValue* value;
114         value = ghb_settings_get_value(settings, key);
115         if (value == NULL) return FALSE;
116         return ghb_value_boolean(value);
117 }
118
119 gint64
120 ghb_settings_get_int64(const GValue *settings, const gchar *key)
121 {
122         const GValue* value;
123         value = ghb_settings_get_value(settings, key);
124         if (value == NULL) return 0;
125         return ghb_value_int64(value);
126 }
127
128 gint
129 ghb_settings_get_int(const GValue *settings, const gchar *key)
130 {
131         const GValue* value;
132         value = ghb_settings_get_value(settings, key);
133         if (value == NULL) return 0;
134         return ghb_value_int(value);
135 }
136
137 gdouble
138 ghb_settings_get_double(const GValue *settings, const gchar *key)
139 {
140         const GValue* value;
141         value = ghb_settings_get_value(settings, key);
142         if (value == NULL) return 0;
143         return ghb_value_double(value);
144 }
145
146 gchar*
147 ghb_settings_get_string(const GValue *settings, const gchar *key)
148 {
149         const GValue* value;
150         value = ghb_settings_get_value(settings, key);
151         if (value == NULL) return g_strdup("");
152         return ghb_value_string(value);
153 }
154
155 gint
156 ghb_settings_combo_int(const GValue *settings, const gchar *key)
157 {
158         return ghb_lookup_combo_int(key, ghb_settings_get_value(settings, key));
159 }
160
161 gdouble
162 ghb_settings_combo_double(const GValue *settings, const gchar *key)
163 {
164         return ghb_lookup_combo_double(key, ghb_settings_get_value(settings, key));
165 }
166
167 const gchar*
168 ghb_settings_combo_option(const GValue *settings, const gchar *key)
169 {
170         return ghb_lookup_combo_option(key, ghb_settings_get_value(settings, key));
171 }
172
173 const gchar*
174 ghb_settings_combo_string(const GValue *settings, const gchar *key)
175 {
176         return ghb_lookup_combo_string(key, ghb_settings_get_value(settings, key));
177 }
178
179 // Map widget names to setting keys
180 // Widgets that map to settings have names
181 // of this format: s_<setting key>
182 static const gchar*
183 get_setting_key(GtkWidget *widget)
184 {
185         const gchar *name;
186         
187         g_debug("get_setting_key ()\n");
188         if (widget == NULL) return NULL;
189         if (GTK_IS_ACTION(widget))
190                 name = gtk_action_get_name(GTK_ACTION(widget));
191         else
192                 name = gtk_widget_get_name(widget);
193                 
194         if (name == NULL)
195         {
196                 // Bad widget pointer?  Should never happen.
197                 g_debug("Bad widget\n");
198                 return NULL;
199         }
200         return name;
201 }
202
203 GValue*
204 ghb_widget_value(GtkWidget *widget)
205 {
206         GValue *value = NULL;
207         const gchar *name;
208         GType type;
209         
210         if (widget == NULL)
211         {
212                 g_debug("NULL widget\n");
213                 return NULL;
214         }
215
216         type = GTK_WIDGET_TYPE(widget);
217         if (GTK_IS_ACTION(widget))
218                 name = gtk_action_get_name(GTK_ACTION(widget));
219         else
220                 name = gtk_widget_get_name(widget);
221         g_debug("ghb_widget_value widget (%s)\n", name);
222         if (type == GTK_TYPE_ENTRY)
223         {
224                 const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget));
225                 value = ghb_string_value_new(str);
226         }
227         else if (type == GTK_TYPE_RADIO_BUTTON)
228         {
229                 g_debug("\tradio_button");
230                 gboolean bval;
231                 bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
232                 value = ghb_boolean_value_new(bval);
233         }
234         else if (type == GTK_TYPE_CHECK_BUTTON)
235         {
236                 g_debug("\tcheck_button");
237                 gboolean bval;
238                 bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
239                 value = ghb_boolean_value_new(bval);
240         }
241         else if (type == GTK_TYPE_TOGGLE_BUTTON)
242         {
243                 g_debug("\ttoggle_button");
244                 gboolean bval;
245                 bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
246                 value = ghb_boolean_value_new(bval);
247         }
248         else if (type == GTK_TYPE_TOGGLE_ACTION)
249         {
250                 g_debug("\ttoggle action");
251                 gboolean bval;
252                 bval = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget));
253                 value = ghb_boolean_value_new(bval);
254         }
255         else if (type == GTK_TYPE_CHECK_MENU_ITEM)
256         {
257                 g_debug("\tcheck_menu_item");
258                 gboolean bval;
259                 bval = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
260                 value = ghb_boolean_value_new(bval);
261         }
262         else if (type == GTK_TYPE_COMBO_BOX)
263         {
264                 g_debug("\tcombo_box");
265                 GtkTreeModel *store;
266                 GtkTreeIter iter;
267                 gchar *shortOpt;
268
269                 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
270                 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
271                 {
272                         gtk_tree_model_get(store, &iter, 2, &shortOpt, -1);
273                         value = ghb_string_value_new(shortOpt);
274                         g_free(shortOpt);
275                 }
276                 else
277                 {
278                         value = ghb_string_value_new("");
279                 }
280         }
281         else if (type == GTK_TYPE_COMBO_BOX_ENTRY)
282         {
283                 GtkTreeModel *store;
284                 GtkTreeIter iter;
285                 gchar *shortOpt;
286
287                 g_debug("\tcombo_box_entry");
288                 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
289                 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
290                 {
291                         gtk_tree_model_get(store, &iter, 2, &shortOpt, -1);
292                         value = ghb_string_value_new(shortOpt);
293                         g_free(shortOpt);
294                 }
295                 else
296                 {
297                         const gchar *str;
298                         str = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget));
299                         if (str == NULL) str = "";
300                         value = ghb_string_value_new(str);
301                 }
302         }
303         else if (type == GTK_TYPE_SPIN_BUTTON)
304         {
305                 gint ival;
306                 ival = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
307                 value = ghb_int64_value_new(ival);
308         }
309         else if (type == GTK_TYPE_HSCALE)
310         {
311                 gdouble dval;
312                 gint digits;
313
314                 digits = gtk_scale_get_digits(GTK_SCALE(widget));
315                 dval = gtk_range_get_value(GTK_RANGE(widget));
316                 if (digits)
317                 {
318                         value = ghb_double_value_new(dval);
319                 }
320                 else
321                 {
322                         value = ghb_int_value_new(dval);
323                 }
324         }
325         else if (type == GTK_TYPE_TEXT_VIEW)
326         {
327                 GtkTextBuffer *buffer;
328                 GtkTextIter start, end;
329                 gchar *str;
330
331                 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
332                 gtk_text_buffer_get_bounds(buffer, &start, &end);
333                 str = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
334                 value = ghb_string_value_new(str);
335                 g_free(str);
336         }
337         else if (type == GTK_TYPE_LABEL)
338         {
339                 const gchar *str;
340                 str = gtk_label_get_text (GTK_LABEL(widget));
341                 value = ghb_string_value_new(str);
342         }
343         else if (type == GTK_TYPE_FILE_CHOOSER_BUTTON)
344         {
345                 const gchar *str;
346                 str = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(widget));
347                 value = ghb_string_value_new(str);
348         }
349         else
350         {
351                 g_debug("Attempt to set unknown widget type: %s\n", name);
352                 g_free(value);
353                 value = NULL;
354         }
355         return value;
356 }
357
358 gchar*
359 ghb_widget_string(GtkWidget *widget)
360 {
361         GValue *value;
362         gchar *sval;
363         
364         value = ghb_widget_value(widget);
365         sval = ghb_value_string(value);
366         ghb_value_free(value);
367         return sval;
368 }
369
370 gdouble
371 ghb_widget_double(GtkWidget *widget)
372 {
373         GValue *value;
374         gdouble dval;
375         
376         value = ghb_widget_value(widget);
377         dval = ghb_value_double(value);
378         ghb_value_free(value);
379         return dval;
380 }
381
382 gint64
383 ghb_widget_int64(GtkWidget *widget)
384 {
385         GValue *value;
386         gint64 ival;
387         
388         value = ghb_widget_value(widget);
389         ival = ghb_value_int64(value);
390         ghb_value_free(value);
391         return ival;
392 }
393
394 gint
395 ghb_widget_int(GtkWidget *widget)
396 {
397         GValue *value;
398         gint ival;
399         
400         value = ghb_widget_value(widget);
401         ival = (gint)ghb_value_int64(value);
402         ghb_value_free(value);
403         return ival;
404 }
405
406 gint
407 ghb_widget_boolean(GtkWidget *widget)
408 {
409         GValue *value;
410         gboolean bval;
411         
412         value = ghb_widget_value(widget);
413         bval = ghb_value_boolean(value);
414         ghb_value_free(value);
415         return bval;
416 }
417
418 void
419 ghb_widget_to_setting(GValue *settings, GtkWidget *widget)
420 {
421         const gchar *key = NULL;
422         GValue *value;
423         
424         if (widget == NULL) return;
425         g_debug("ghb_widget_to_setting");
426         // Find corresponding setting
427         key = get_setting_key(widget);
428         if (key == NULL) return;
429         value = ghb_widget_value(widget);
430         if (value != NULL)
431         {
432                 ghb_settings_take_value(settings, key, value);
433         }
434         else
435         {
436                 g_debug("No value found for %s\n", key);
437         }
438 }
439
440 static void
441 update_widget(GtkWidget *widget, const GValue *value)
442 {
443         GType type;
444         gchar *str;
445         gint ival;
446         gdouble dval;
447
448         g_debug("update_widget");
449         type = G_VALUE_TYPE(value);
450         if (type == ghb_array_get_type() || type == ghb_dict_get_type())
451                 return;
452         if (value == NULL) return;
453         str = ghb_value_string(value);
454         ival = ghb_value_int(value);
455         dval = ghb_value_double(value);
456         type = GTK_OBJECT_TYPE(widget);
457         if (type == GTK_TYPE_ENTRY)
458         {
459                 g_debug("entry");
460                 gtk_entry_set_text((GtkEntry*)widget, str);
461         }
462         else if (type == GTK_TYPE_RADIO_BUTTON)
463         {
464                 g_debug("radio button");
465                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
466         }
467         else if (type == GTK_TYPE_CHECK_BUTTON)
468         {
469                 g_debug("check button");
470                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
471         }
472         else if (type == GTK_TYPE_TOGGLE_BUTTON)
473         {
474                 g_debug("toggle button");
475                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
476         }
477         else if (type == GTK_TYPE_TOGGLE_ACTION)
478         {
479                 g_debug("toggle action");
480                 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(widget), ival);
481         }
482         else if (type == GTK_TYPE_CHECK_MENU_ITEM)
483         {
484                 g_debug("check menu item");
485                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), ival);
486         }
487         else if (type == GTK_TYPE_COMBO_BOX)
488         {
489                 GtkTreeModel *store;
490                 GtkTreeIter iter;
491                 gchar *shortOpt;
492                 gdouble ivalue;
493                 gboolean foundit = FALSE;
494
495                 g_debug("combo (%s)", str);
496                 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
497                 if (gtk_tree_model_get_iter_first (store, &iter))
498                 {
499                         do
500                         {
501                                 gtk_tree_model_get(store, &iter, 2, &shortOpt, -1);
502                                 if (strcmp(shortOpt, str) == 0)
503                                 {
504                                         gtk_combo_box_set_active_iter (
505                                                 GTK_COMBO_BOX(widget), &iter);
506                                         g_free(shortOpt);
507                                         foundit = TRUE;
508                                         break;
509                                 }
510                                 g_free(shortOpt);
511                         } while (gtk_tree_model_iter_next (store, &iter));
512                 }
513                 if (!foundit && gtk_tree_model_get_iter_first (store, &iter))
514                 {
515                         do
516                         {
517                                 gtk_tree_model_get(store, &iter, 3, &ivalue, -1);
518                                 if ((gint)ivalue == ival || ivalue == dval)
519                                 {
520                                         gtk_combo_box_set_active_iter (
521                                                 GTK_COMBO_BOX(widget), &iter);
522                                         foundit = TRUE;
523                                         break;
524                                 }
525                         } while (gtk_tree_model_iter_next (store, &iter));
526                 }
527                 if (!foundit)
528                 {
529                         gtk_combo_box_set_active (GTK_COMBO_BOX(widget), 0);
530                 }
531         }
532         else if (type == GTK_TYPE_COMBO_BOX_ENTRY)
533         {
534                 GtkTreeModel *store;
535                 GtkTreeIter iter;
536                 gchar *shortOpt;
537                 gdouble ivalue;
538                 gboolean foundit = FALSE;
539
540                 g_debug("GTK_COMBO_BOX_ENTRY");
541                 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
542                 if (gtk_tree_model_get_iter_first (store, &iter))
543                 {
544                         do
545                         {
546                                 gtk_tree_model_get(store, &iter, 2, &shortOpt, -1);
547                                 if (strcmp(shortOpt, str) == 0)
548                                 {
549                                         gtk_combo_box_set_active_iter (
550                                                 GTK_COMBO_BOX(widget), &iter);
551                                         g_free(shortOpt);
552                                         foundit = TRUE;
553                                         break;
554                                 }
555                                 g_free(shortOpt);
556                         } while (gtk_tree_model_iter_next (store, &iter));
557                 }
558                 if (!foundit && gtk_tree_model_get_iter_first (store, &iter))
559                 {
560                         do
561                         {
562                                 gtk_tree_model_get(store, &iter, 3, &ivalue, -1);
563                                 if ((gint)ivalue == ival || ivalue == dval)
564                                 {
565                                         gtk_combo_box_set_active_iter (
566                                                 GTK_COMBO_BOX(widget), &iter);
567                                         foundit = TRUE;
568                                         break;
569                                 }
570                         } while (gtk_tree_model_iter_next (store, &iter));
571                 }
572                 if (!foundit)
573                 {
574                         GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(widget)));
575                         if (entry)
576                         {
577                                 gtk_entry_set_text (entry, str);
578                         }
579                 }
580         }
581         else if (type == GTK_TYPE_SPIN_BUTTON)
582         {
583                 g_debug("spin (%s)", str);
584                 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), dval);
585         }
586         else if (type == GTK_TYPE_HSCALE)
587         {
588                 g_debug("hscale");
589                 gtk_range_set_value(GTK_RANGE(widget), dval);
590         }
591         else if (type == GTK_TYPE_TEXT_VIEW)
592         {
593                 g_debug("textview (%s)", str);
594                 GtkTextBuffer *buffer = gtk_text_view_get_buffer(
595                                                                                                 GTK_TEXT_VIEW(widget));
596                 gtk_text_buffer_set_text (buffer, str, -1);
597         }
598         else if (type == GTK_TYPE_LABEL)
599         {
600                 gtk_label_set_text (GTK_LABEL(widget), str);
601         }
602         else if (type == GTK_TYPE_FILE_CHOOSER_BUTTON)
603         {
604                 GtkFileChooserAction act;
605                 act = gtk_file_chooser_get_action(GTK_FILE_CHOOSER(widget));
606                 if (act == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
607                         act == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
608                 {
609                         gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widget), str);
610                 }
611                 else
612                 {
613                         gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(widget), str);
614                 }
615         }
616         else
617         {
618                 g_debug("Attempt to set unknown widget type");
619         }
620         g_free(str);
621 }
622
623 int
624 ghb_ui_update(signal_user_data_t *ud, const gchar *name, const GValue *value)
625 {
626         GObject *object;
627
628         g_debug("ghb_ui_update() %s", name);
629         if (name == NULL || value == NULL)
630                 return 0;
631         object = GHB_OBJECT(ud->builder, name);
632         if (object == NULL)
633         {
634                 g_debug("Failed to find widget for key: %s\n", name);
635                 return -1;
636         }
637         update_widget((GtkWidget*)object, value);
638         // Its possible the value hasn't changed. Since settings are only
639         // updated when the value changes, I'm initializing settings here as well.
640         ghb_widget_to_setting(ud->settings, (GtkWidget*)object);
641         return 0;
642 }
643