OSDN Git Service

import jp-0.9.3
[handbrake-jp/handbrake-jp.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(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(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(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(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(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(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(GValue *settings, const gchar *key)
157 {
158         return ghb_lookup_combo_int(key, ghb_settings_get_value(settings, key));
159 }
160
161 const gchar*
162 ghb_settings_combo_option(GValue *settings, const gchar *key)
163 {
164         return ghb_lookup_combo_option(key, ghb_settings_get_value(settings, key));
165 }
166
167 // Map widget names to setting keys
168 // Widgets that map to settings have names
169 // of this format: s_<setting key>
170 static const gchar*
171 get_setting_key(GtkWidget *widget)
172 {
173         const gchar *name;
174         
175         g_debug("get_setting_key ()\n");
176         if (widget == NULL) return NULL;
177         if (GTK_IS_ACTION(widget))
178                 name = gtk_action_get_name(GTK_ACTION(widget));
179         else
180                 name = gtk_widget_get_name(widget);
181                 
182         if (name == NULL)
183         {
184                 // Bad widget pointer?  Should never happen.
185                 g_debug("Bad widget\n");
186                 return NULL;
187         }
188         return name;
189 }
190
191 GValue*
192 ghb_widget_value(GtkWidget *widget)
193 {
194         GValue *value = NULL;
195         const gchar *name;
196         GType type;
197         
198         if (widget == NULL)
199         {
200                 g_debug("NULL widget\n");
201                 return NULL;
202         }
203
204         type = GTK_WIDGET_TYPE(widget);
205         if (GTK_IS_ACTION(widget))
206                 name = gtk_action_get_name(GTK_ACTION(widget));
207         else
208                 name = gtk_widget_get_name(widget);
209         g_debug("ghb_widget_value widget (%s)\n", name);
210         if (type == GTK_TYPE_ENTRY)
211         {
212                 const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget));
213                 value = ghb_string_value_new(str);
214         }
215         else if (type == GTK_TYPE_RADIO_BUTTON)
216         {
217                 g_debug("\tradio_button");
218                 gboolean bval;
219                 bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
220                 value = ghb_boolean_value_new(bval);
221         }
222         else if (type == GTK_TYPE_CHECK_BUTTON)
223         {
224                 g_debug("\tcheck_button");
225                 gboolean bval;
226                 bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
227                 value = ghb_boolean_value_new(bval);
228         }
229         else if (type == GTK_TYPE_TOGGLE_ACTION)
230         {
231                 g_debug("\ttoggle action");
232                 gboolean bval;
233                 bval = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget));
234                 value = ghb_boolean_value_new(bval);
235         }
236         else if (type == GTK_TYPE_CHECK_MENU_ITEM)
237         {
238                 g_debug("\tcheck_menu_item");
239                 gboolean bval;
240                 bval = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
241                 value = ghb_boolean_value_new(bval);
242         }
243         else if (type == GTK_TYPE_COMBO_BOX)
244         {
245                 g_debug("\tcombo_box");
246                 GtkTreeModel *store;
247                 GtkTreeIter iter;
248                 gchar *shortOpt;
249
250                 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
251                 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
252                 {
253                         gtk_tree_model_get(store, &iter, 2, &shortOpt, -1);
254                         value = ghb_string_value_new(shortOpt);
255                         g_free(shortOpt);
256                 }
257                 else
258                 {
259                         value = ghb_string_value_new("");
260                 }
261         }
262         else if (type == GTK_TYPE_COMBO_BOX_ENTRY)
263         {
264                 GtkTreeModel *store;
265                 GtkTreeIter iter;
266                 gchar *shortOpt;
267
268                 g_debug("\tcombo_box_entry");
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                         const gchar *str;
279                         str = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget));
280                         if (str == NULL) str = "";
281                         value = ghb_string_value_new(str);
282                 }
283         }
284         else if (type == GTK_TYPE_SPIN_BUTTON)
285         {
286                 gint ival;
287                 ival = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
288                 value = ghb_int64_value_new(ival);
289         }
290         else if (type == GTK_TYPE_HSCALE)
291         {
292                 gdouble dval;
293                 gint digits;
294
295                 digits = gtk_scale_get_digits(GTK_SCALE(widget));
296                 dval = gtk_range_get_value(GTK_RANGE(widget));
297                 if (digits)
298                 {
299                         value = ghb_double_value_new(dval);
300                 }
301                 else
302                 {
303                         value = ghb_int_value_new(dval);
304                 }
305         }
306         else if (type == GTK_TYPE_TEXT_VIEW)
307         {
308                 GtkTextBuffer *buffer;
309                 GtkTextIter start, end;
310                 gchar *str;
311
312                 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
313                 gtk_text_buffer_get_bounds(buffer, &start, &end);
314                 str = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
315                 value = ghb_string_value_new(str);
316                 g_free(str);
317         }
318         else if (type == GTK_TYPE_LABEL)
319         {
320                 const gchar *str;
321                 str = gtk_label_get_text (GTK_LABEL(widget));
322                 value = ghb_string_value_new(str);
323         }
324         else
325         {
326                 g_debug("Attempt to set unknown widget type: %s\n", name);
327                 g_free(value);
328                 value = NULL;
329         }
330         return value;
331 }
332
333 gchar*
334 ghb_widget_string(GtkWidget *widget)
335 {
336         GValue *value;
337         gchar *sval;
338         
339         value = ghb_widget_value(widget);
340         sval = ghb_value_string(value);
341         ghb_value_free(value);
342         return sval;
343 }
344
345 gdouble
346 ghb_widget_double(GtkWidget *widget)
347 {
348         GValue *value;
349         gdouble dval;
350         
351         value = ghb_widget_value(widget);
352         dval = ghb_value_double(value);
353         ghb_value_free(value);
354         return dval;
355 }
356
357 gint64
358 ghb_widget_int64(GtkWidget *widget)
359 {
360         GValue *value;
361         gint64 ival;
362         
363         value = ghb_widget_value(widget);
364         ival = ghb_value_int64(value);
365         ghb_value_free(value);
366         return ival;
367 }
368
369 gint
370 ghb_widget_int(GtkWidget *widget)
371 {
372         GValue *value;
373         gint ival;
374         
375         value = ghb_widget_value(widget);
376         ival = (gint)ghb_value_int64(value);
377         ghb_value_free(value);
378         return ival;
379 }
380
381 gint
382 ghb_widget_boolean(GtkWidget *widget)
383 {
384         GValue *value;
385         gboolean bval;
386         
387         value = ghb_widget_value(widget);
388         bval = ghb_value_boolean(value);
389         ghb_value_free(value);
390         return bval;
391 }
392
393 void
394 ghb_widget_to_setting(GValue *settings, GtkWidget *widget)
395 {
396         const gchar *key = NULL;
397         GValue *value;
398         
399         if (widget == NULL) return;
400         g_debug("ghb_widget_to_setting");
401         // Find corresponding setting
402         key = get_setting_key(widget);
403         if (key == NULL) return;
404         value = ghb_widget_value(widget);
405         if (value != NULL)
406         {
407                 ghb_settings_take_value(settings, key, value);
408         }
409         else
410         {
411                 g_debug("No value found for %s\n", key);
412         }
413 }
414
415 static void
416 update_widget(GtkWidget *widget, const GValue *value)
417 {
418         GType type;
419         gchar *str;
420         gint ival;
421         gdouble dval;
422
423         g_debug("update_widget");
424         type = G_VALUE_TYPE(value);
425         if (type == ghb_array_get_type() || type == ghb_dict_get_type())
426                 return;
427         if (value == NULL) return;
428         str = ghb_value_string(value);
429         ival = ghb_value_int(value);
430         dval = ghb_value_double(value);
431         type = GTK_OBJECT_TYPE(widget);
432         if (type == GTK_TYPE_ENTRY)
433         {
434                 g_debug("entry");
435                 gtk_entry_set_text((GtkEntry*)widget, str);
436         }
437         else if (type == GTK_TYPE_RADIO_BUTTON)
438         {
439                 g_debug("radio button");
440                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
441         }
442         else if (type == GTK_TYPE_CHECK_BUTTON)
443         {
444                 g_debug("check button");
445                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
446         }
447         else if (type == GTK_TYPE_TOGGLE_ACTION)
448         {
449                 g_debug("toggle action");
450                 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(widget), ival);
451         }
452         else if (type == GTK_TYPE_CHECK_MENU_ITEM)
453         {
454                 g_debug("check menu item");
455                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), ival);
456         }
457         else if (type == GTK_TYPE_COMBO_BOX)
458         {
459                 GtkTreeModel *store;
460                 GtkTreeIter iter;
461                 gchar *shortOpt;
462                 gint ivalue;
463                 gboolean foundit = FALSE;
464
465                 g_debug("combo (%s)", str);
466                 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
467                 if (gtk_tree_model_get_iter_first (store, &iter))
468                 {
469                         do
470                         {
471                                 gtk_tree_model_get(store, &iter, 2, &shortOpt, -1);
472                                 if (strcmp(shortOpt, str) == 0)
473                                 {
474                                         gtk_combo_box_set_active_iter (
475                                                 GTK_COMBO_BOX(widget), &iter);
476                                         g_free(shortOpt);
477                                         foundit = TRUE;
478                                         break;
479                                 }
480                                 g_free(shortOpt);
481                         } while (gtk_tree_model_iter_next (store, &iter));
482                 }
483                 if (!foundit && gtk_tree_model_get_iter_first (store, &iter))
484                 {
485                         do
486                         {
487                                 gtk_tree_model_get(store, &iter, 3, &ivalue, -1);
488                                 if (ivalue == ival)
489                                 {
490                                         gtk_combo_box_set_active_iter (
491                                                 GTK_COMBO_BOX(widget), &iter);
492                                         foundit = TRUE;
493                                         break;
494                                 }
495                         } while (gtk_tree_model_iter_next (store, &iter));
496                 }
497                 if (!foundit)
498                 {
499                         gtk_combo_box_set_active (GTK_COMBO_BOX(widget), 0);
500                 }
501         }
502         else if (type == GTK_TYPE_COMBO_BOX_ENTRY)
503         {
504                 GtkTreeModel *store;
505                 GtkTreeIter iter;
506                 gchar *shortOpt;
507                 gint ivalue;
508                 gboolean foundit = FALSE;
509
510                 g_debug("GTK_COMBO_BOX_ENTRY");
511                 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
512                 if (gtk_tree_model_get_iter_first (store, &iter))
513                 {
514                         do
515                         {
516                                 gtk_tree_model_get(store, &iter, 2, &shortOpt, -1);
517                                 if (strcmp(shortOpt, str) == 0)
518                                 {
519                                         gtk_combo_box_set_active_iter (
520                                                 GTK_COMBO_BOX(widget), &iter);
521                                         g_free(shortOpt);
522                                         foundit = TRUE;
523                                         break;
524                                 }
525                                 g_free(shortOpt);
526                         } while (gtk_tree_model_iter_next (store, &iter));
527                 }
528                 if (!foundit && gtk_tree_model_get_iter_first (store, &iter))
529                 {
530                         do
531                         {
532                                 gtk_tree_model_get(store, &iter, 3, &ivalue, -1);
533                                 if (ivalue == ival)
534                                 {
535                                         gtk_combo_box_set_active_iter (
536                                                 GTK_COMBO_BOX(widget), &iter);
537                                         foundit = TRUE;
538                                         break;
539                                 }
540                         } while (gtk_tree_model_iter_next (store, &iter));
541                 }
542                 if (!foundit)
543                 {
544                         GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(widget)));
545                         if (entry)
546                         {
547                                 gtk_entry_set_text (entry, str);
548                         }
549                 }
550         }
551         else if (type == GTK_TYPE_SPIN_BUTTON)
552         {
553                 g_debug("spin (%s)", str);
554                 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), dval);
555         }
556         else if (type == GTK_TYPE_HSCALE)
557         {
558                 g_debug("hscale");
559                 gtk_range_set_value(GTK_RANGE(widget), dval);
560         }
561         else if (type == GTK_TYPE_TEXT_VIEW)
562         {
563                 g_debug("textview (%s)", str);
564                 GtkTextBuffer *buffer = gtk_text_view_get_buffer(
565                                                                                                 GTK_TEXT_VIEW(widget));
566                 gtk_text_buffer_set_text (buffer, str, -1);
567         }
568         else if (type == GTK_TYPE_LABEL)
569         {
570                 gtk_label_set_text (GTK_LABEL(widget), str);
571         }
572         else
573         {
574                 g_debug("Attempt to set unknown widget type");
575         }
576         g_free(str);
577 }
578
579 int
580 ghb_ui_update(signal_user_data_t *ud, const gchar *name, const GValue *value)
581 {
582         GObject *object;
583
584         g_debug("ghb_ui_update() %s", name);
585         if (name == NULL || value == NULL)
586                 return 0;
587         object = GHB_OBJECT(ud->builder, name);
588         if (object == NULL)
589         {
590                 g_debug("Failed to find widget for key: %s\n", name);
591                 return -1;
592         }
593         update_widget((GtkWidget*)object, value);
594         // Its possible the value hasn't changed. Since settings are only
595         // updated when the value changes, I'm initializing settings here as well.
596         ghb_widget_to_setting(ud->settings, (GtkWidget*)object);
597         return 0;
598 }
599