1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
6 * presets.c is free software.
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)
15 #include <glib-object.h>
16 #include <glib/gstdio.h>
20 #include "audiohandler.h"
21 #include "hb-backend.h"
23 #include "resources.h"
27 static GValue *presetsPlist = NULL;
28 static GValue *internalPlist = NULL;
29 static GValue *prefsPlist = NULL;
32 plist_get_dict(GValue *presets, const gchar *name)
34 if (presets == NULL || name == NULL) return NULL;
35 return ghb_dict_lookup(presets, name);
39 presets_get_dict(GValue *presets, const gchar *name)
44 if (presets == NULL || name == NULL) return NULL;
45 count = ghb_array_len(presets);
46 for (ii = 0; ii < count; ii++)
49 dict = ghb_array_get_nth(presets, ii);
50 gval = ghb_dict_lookup(dict, "preset_name");
51 str = g_value_get_string(gval);
52 if (strcmp(str, name) == 0)
59 presets_remove(GValue *presets, const gchar *name)
64 if (presets == NULL || name == NULL) return -1;
65 count = ghb_array_len(presets);
66 for (ii = 0; ii < count; ii++)
69 dict = ghb_array_get_nth(presets, ii);
70 gval = ghb_dict_lookup(dict, "preset_name");
71 str = g_value_get_string(gval);
72 if (strcmp(str, name) == 0)
74 ghb_array_remove(presets, ii);
82 ghb_set_preset_default(GValue *settings)
86 preset = ghb_settings_get_string (settings, "preset");
87 ghb_settings_set_string(settings, "default_preset", preset);
88 ghb_prefs_save(settings);
92 // Used for sorting dictionaries.
94 key_cmp(gconstpointer a, gconstpointer b)
96 gchar *stra = (gchar*)a;
97 gchar *strb = (gchar*)b;
99 return strcmp(stra, strb);
103 ghb_presets_get_description(const gchar *name)
106 pdict = presets_get_dict(presetsPlist, name);
107 if (pdict == NULL) return g_strdup("");
108 return ghb_value_string(ghb_dict_lookup(pdict, "preset_description"));
112 preset_dict_get_value(
116 const GValue *gval = NULL;
120 gval = ghb_dict_lookup(dict, key);
122 if (internalPlist == NULL) return NULL;
125 dict = plist_get_dict(internalPlist, "Presets");
126 if (dict == NULL) return NULL;
127 gval = ghb_dict_lookup(dict, key);
139 dict = presets_get_dict(presetsPlist, name);
140 return preset_dict_get_value(dict, key);
144 ghb_presets_get_names()
147 GList *standard = NULL;
148 GList *custom = NULL;
151 if (presetsPlist == NULL) return NULL;
152 count = ghb_array_len(presetsPlist);
153 for (ii = 0; ii < count; ii++)
160 dict = ghb_array_get_nth(presetsPlist, ii);
161 gval = ghb_dict_lookup(dict, "preset_name");
162 name = (gchar*)g_value_get_string(gval);
163 ptype = ghb_value_int(preset_dict_get_value(dict, "preset_type"));
166 custom = g_list_append(custom, name);
170 standard = g_list_append(standard, name);
173 custom = g_list_sort(custom, key_cmp);
174 standard = g_list_sort(standard, key_cmp);
175 names = g_list_concat(standard, custom);
180 ghb_preset_flags(const gchar *name)
187 dict = presets_get_dict(presetsPlist, name);
188 gval = preset_dict_get_value(dict, "preset_type");
191 ptype = ghb_value_int(gval);
192 ret = (ptype != 0 ? PRESET_CUSTOM : 0);
197 static void init_settings_from_dict(
198 GValue *dest, GValue *internal, GValue *dict);
201 init_settings_from_array(
209 count = ghb_array_len(array);
210 // The first element of the internal version is always the
211 // template for the allowed values
212 gval = ghb_array_get_nth(internal, 0);
213 for (ii = 0; ii < count; ii++)
216 val = ghb_array_get_nth(array, ii);
219 if (G_VALUE_TYPE(gval) == ghb_dict_get_type())
222 new_dict = ghb_dict_value_new();
223 ghb_array_append(dest, new_dict);
224 if (G_VALUE_TYPE(val) == ghb_dict_get_type())
225 init_settings_from_dict(new_dict, gval, val);
227 init_settings_from_dict(new_dict, gval, gval);
229 else if (G_VALUE_TYPE(gval) == ghb_array_get_type())
232 new_array = ghb_array_value_new(8);
233 ghb_array_append(dest, new_array);
234 if (G_VALUE_TYPE(val) == ghb_array_get_type())
235 init_settings_from_array(new_array, gval, val);
237 init_settings_from_array(new_array, gval, gval);
241 ghb_array_append(dest, val);
247 init_settings_from_dict(
256 ghb_dict_iter_init(&iter, internal);
257 // middle (void*) cast prevents gcc warning "defreferencing type-punned
258 // pointer will break strict-aliasing rules"
259 while (g_hash_table_iter_next(
260 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
264 val = ghb_dict_lookup(dict, key);
267 if (G_VALUE_TYPE(gval) == ghb_dict_get_type())
270 new_dict = ghb_dict_value_new();
271 ghb_settings_take_value(dest, key, new_dict);
272 if (G_VALUE_TYPE(val) == ghb_dict_get_type())
273 init_settings_from_dict(new_dict, gval, val);
275 init_settings_from_dict(new_dict, gval, gval);
277 else if (G_VALUE_TYPE(gval) == ghb_array_get_type())
280 new_array = ghb_array_value_new(8);
281 ghb_settings_take_value(dest, key, new_array);
282 if (G_VALUE_TYPE(val) == ghb_array_get_type())
283 init_settings_from_array(new_array, gval, val);
285 init_settings_from_array(new_array, gval, gval);
290 ghb_settings_set_value(dest, key, val);
297 signal_user_data_t *ud,
305 ghb_dict_iter_init(&iter, internal);
306 // middle (void*) cast prevents gcc warning "defreferencing type-punned
307 // pointer will break strict-aliasing rules"
308 while (g_hash_table_iter_next(
309 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
313 val = ghb_dict_lookup(dict, key);
316 ghb_ui_update(ud, key, val);
321 preset_to_ui(signal_user_data_t *ud, GValue *dict)
323 g_debug("preset_to_ui()\n");
324 // Initialize the ui from presets file.
327 // Get key list from internal default presets. This way we do not
328 // load any unknown keys.
329 if (internalPlist == NULL) return;
330 internal = plist_get_dict(internalPlist, "Presets");
331 // Setting a ui widget will cause the corresponding setting
332 // to be set, but it also triggers a callback that can
333 // have the side effect of using other settings values
334 // that have not yet been set. So set *all* settings first
335 // then update the ui.
336 init_settings_from_dict(ud->settings, internal, dict);
337 init_ui_from_dict(ud, internal, dict);
339 if (ghb_settings_get_boolean(ud->settings, "allow_tweaks"))
342 gval = preset_dict_get_value(dict, "deinterlace");
345 ghb_ui_update(ud, "tweak_deinterlace", gval);
347 gval = preset_dict_get_value(dict, "denoise");
350 ghb_ui_update(ud, "tweak_denoise", gval);
356 ghb_set_preset(signal_user_data_t *ud, const gchar *name)
360 g_debug("ghb_set_preset() %s\n", name);
364 // Try to get the first preset
365 presets = ghb_presets_get_names();
368 name = (const gchar*)presets->data;
369 g_list_free(presets);
372 dict = presets_get_dict(presetsPlist, name);
373 if (dict == NULL || name == NULL)
375 preset_to_ui(ud, NULL);
379 preset_to_ui(ud, dict);
380 ghb_settings_set_string(ud->settings, "preset", name);
385 ghb_update_from_preset(
386 signal_user_data_t *ud,
392 g_debug("ghb_update_from_preset() %s %s", name, key);
393 if (name == NULL) return;
394 gval = preset_get_value(name, key);
397 ghb_ui_update(ud, key, gval);
402 ghb_get_user_config_dir()
407 dir = g_get_user_config_dir();
408 if (!g_file_test(dir, G_FILE_TEST_IS_DIR))
410 dir = g_get_home_dir();
411 config = g_strdup_printf ("%s/.ghb", dir);
412 if (!g_file_test(config, G_FILE_TEST_IS_DIR))
413 g_mkdir (config, 0755);
417 config = g_strdup_printf ("%s/ghb", dir);
418 if (!g_file_test(config, G_FILE_TEST_IS_DIR))
419 g_mkdir (config, 0755);
425 store_plist(GValue *plist, const gchar *name)
427 gchar *config, *path;
430 config = ghb_get_user_config_dir();
431 path = g_strdup_printf ("%s/%s", config, name);
432 file = g_fopen(path, "w");
435 ghb_plist_write(file, plist);
440 load_plist(const gchar *name)
442 gchar *config, *path;
443 GValue *plist = NULL;
445 config = ghb_get_user_config_dir();
446 path = g_strdup_printf ("%s/%s", config, name);
447 if (g_file_test(path, G_FILE_TEST_IS_REGULAR))
449 plist = ghb_plist_parse_file(path);
457 remove_plist(const gchar *name)
459 gchar *config, *path;
461 config = ghb_get_user_config_dir();
462 path = g_strdup_printf ("%s/%s", config, name);
463 if (g_file_test(path, G_FILE_TEST_IS_REGULAR))
471 static gboolean prefs_initializing = FALSE;
474 ghb_prefs_to_ui(signal_user_data_t *ud)
479 GValue *internal, *dict;
483 prefs_initializing = TRUE;
485 // Setting a ui widget will cause the corresponding setting
486 // to be set, but it also triggers a callback that can
487 // have the side effect of using other settings values
488 // that have not yet been set. So set *all* settings first
489 // then update the ui.
490 internal = plist_get_dict(internalPlist, "Initialization");
491 ghb_dict_iter_init(&iter, internal);
492 // middle (void*) cast prevents gcc warning "defreferencing type-punned
493 // pointer will break strict-aliasing rules"
494 while (g_hash_table_iter_next(
495 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
497 ghb_ui_update(ud, key, gval);
500 dict = plist_get_dict(prefsPlist, "Preferences");
501 internal = plist_get_dict(internalPlist, "Preferences");
502 ghb_dict_iter_init(&iter, internal);
503 // middle (void*) cast prevents gcc warning "defreferencing type-punned
504 // pointer will break strict-aliasing rules"
505 while (g_hash_table_iter_next(
506 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
508 const GValue *value = NULL;
510 value = ghb_dict_lookup(dict, key);
513 ghb_settings_set_value(ud->settings, key, value);
515 internal = plist_get_dict(internalPlist, "Preferences");
516 ghb_dict_iter_init(&iter, internal);
517 // middle (void*) cast prevents gcc warning "defreferencing type-punned
518 // pointer will break strict-aliasing rules"
519 while (g_hash_table_iter_next(
520 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
522 const GValue *value = NULL;
524 value = ghb_dict_lookup(dict, key);
527 ghb_ui_update(ud, key, value);
530 val = ghb_settings_get_value(ud->settings, "show_presets");
531 ghb_ui_update(ud, "show_presets", val);
532 if (ghb_settings_get_boolean(ud->settings, "hbfd_feature"))
535 val = ghb_settings_get_value(ud->settings, "hbfd");
536 ghb_ui_update(ud, "hbfd", val);
537 action = GHB_ACTION (ud->builder, "hbfd");
538 gtk_action_set_visible(action, TRUE);
542 ghb_ui_update(ud, "hbfd", ghb_int64_value(0));
544 gval = ghb_settings_get_value(ud->settings, "default_source");
545 ghb_settings_set_value (ud->settings, "source", gval);
546 str = ghb_settings_get_string(ud->settings, "destination_dir");
548 gchar *path = g_strdup_printf ("%s/new_video.mp4", str);
549 ghb_ui_update(ud, "destination", ghb_string_value(path));
553 prefs_initializing = FALSE;
557 ghb_prefs_save(GValue *settings)
565 if (prefs_initializing) return;
566 dict = plist_get_dict(internalPlist, "Preferences");
567 if (dict == NULL) return;
568 pref_dict = plist_get_dict(prefsPlist, "Preferences");
569 if (pref_dict == NULL) return;
570 ghb_dict_iter_init(&iter, dict);
571 // middle (void*) cast prevents gcc warning "defreferencing type-punned
572 // pointer will break strict-aliasing rules"
573 while (g_hash_table_iter_next(
574 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&value))
576 value = ghb_settings_get_value(settings, key);
579 ghb_dict_insert(pref_dict, g_strdup(key), ghb_value_dup(value));
582 store_plist(prefsPlist, "preferences");
586 ghb_pref_save(GValue *settings, const gchar *key)
590 if (prefs_initializing) return;
591 value = ghb_settings_get_value(settings, key);
595 dict = plist_get_dict(prefsPlist, "Preferences");
596 if (dict == NULL) return;
597 ghb_dict_insert(dict, g_strdup(key), ghb_value_dup(value));
598 store_plist(prefsPlist, "preferences");
603 ghb_settings_init(signal_user_data_t *ud)
611 g_debug("ghb_settings_init");
612 prefs_initializing = TRUE;
614 internalPlist = ghb_resource_get("internal-defaults");
615 // Setting a ui widget will cause the corresponding setting
616 // to be set, but it also triggers a callback that can
617 // have the side effect of using other settings values
618 // that have not yet been set. So set *all* settings first
619 // then update the ui.
620 internal = plist_get_dict(internalPlist, "Initialization");
621 ghb_dict_iter_init(&iter, internal);
622 // middle (void*) cast prevents gcc warning "defreferencing type-punned
623 // pointer will break strict-aliasing rules"
624 while (g_hash_table_iter_next(
625 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
627 ghb_settings_set_value(ud->settings, key, gval);
630 internal = plist_get_dict(internalPlist, "Presets");
631 ghb_dict_iter_init(&iter, internal);
632 // middle (void*) cast prevents gcc warning "defreferencing type-punned
633 // pointer will break strict-aliasing rules"
634 while (g_hash_table_iter_next(
635 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
637 ghb_settings_set_value(ud->settings, key, gval);
640 internal = plist_get_dict(internalPlist, "Preferences");
641 ghb_dict_iter_init(&iter, internal);
642 // middle (void*) cast prevents gcc warning "defreferencing type-punned
643 // pointer will break strict-aliasing rules"
644 while (g_hash_table_iter_next(
645 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
647 ghb_settings_set_value(ud->settings, key, gval);
649 prefs_initializing = FALSE;
656 ghb_value_free(internalPlist);
658 ghb_value_free(presetsPlist);
660 ghb_value_free(prefsPlist);
664 ghb_prefs_load(signal_user_data_t *ud)
666 GValue *dict, *internal;
671 g_debug("ghb_prefs_load");
672 prefsPlist = load_plist("preferences");
673 if (prefsPlist == NULL)
674 prefsPlist = ghb_dict_value_new();
675 dict = plist_get_dict(prefsPlist, "Preferences");
676 internal = plist_get_dict(internalPlist, "Preferences");
677 if (dict == NULL && internal)
679 dict = ghb_dict_value_new();
680 ghb_dict_insert(prefsPlist, g_strdup("Preferences"), dict);
682 // Get defaults from internal defaults
683 ghb_dict_iter_init(&iter, internal);
684 // middle (void*) cast prevents gcc warning "defreferencing type-punned
685 // pointer will break strict-aliasing rules"
686 while (g_hash_table_iter_next(
687 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
689 ghb_dict_insert(dict, g_strdup(key), ghb_value_dup(gval));
691 const gchar *dir = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS);
696 ghb_dict_insert(dict,
697 g_strdup("destination_dir"), ghb_value_dup(ghb_string_value(dir)));
698 store_plist(prefsPlist, "preferences");
703 ghb_presets_reload(signal_user_data_t *ud)
708 g_debug("ghb_presets_reload()\n");
709 std_presets = ghb_resource_get("standard-presets");
710 if (std_presets == NULL) return;
712 // Merge the keyfile contents into our presets
713 count = ghb_array_len(std_presets);
714 for (ii = 0; ii < count; ii++)
724 std_dict = ghb_array_get_nth(std_presets, ii);
725 name = g_value_get_string(ghb_dict_lookup(std_dict, "preset_name"));
726 pos = presets_remove(presetsPlist, name);
728 copy_dict = ghb_dict_value_new();
730 ghb_array_insert(presetsPlist, pos, copy_dict);
732 ghb_array_append(presetsPlist, copy_dict);
733 ghb_dict_iter_init(&iter, std_dict);
734 // middle (void*) cast prevents gcc warning "defreferencing type-punned
735 // pointer will break strict-aliasing rules"
736 while (g_hash_table_iter_next(
737 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&value))
739 ghb_dict_insert(copy_dict, g_strdup(key), ghb_value_dup(value));
742 store_plist(presetsPlist, "presets");
748 g_debug("presets_store ()\n");
749 store_plist(presetsPlist, "presets");
753 ghb_save_queue(GValue *queue)
755 store_plist(queue, "queue");
761 return load_plist("queue");
765 ghb_remove_queue_file()
767 remove_plist("queue");
773 presetsPlist = load_plist("presets");
774 if (presetsPlist == NULL)
776 presetsPlist = ghb_value_dup(ghb_resource_get("standard-presets"));
779 if (G_VALUE_TYPE(presetsPlist) == ghb_dict_get_type())
780 { // Presets is older dictionary format. Convert to array
781 GHashTableIter old_iter;
786 presets = ghb_array_value_new(32);
787 ghb_dict_iter_init(&old_iter, presetsPlist);
788 // middle (void*) cast prevents gcc warning "defreferencing type-punned
789 // pointer will break strict-aliasing rules"
790 while (g_hash_table_iter_next(
791 &old_iter, (gpointer*)(void*)&name, (gpointer*)(void*)&orig_dict))
795 GValue *value, *dict;
797 dict = ghb_dict_value_new();
798 ghb_dict_insert(dict, g_strdup("preset_name"),
799 ghb_string_value_new(name));
800 ghb_array_append(presets, dict);
801 ghb_dict_iter_init(&iter, orig_dict);
802 // middle (void*) cast prevents gcc warning "defreferencing
803 // type-punned pointer will break strict-aliasing rules"
804 while (g_hash_table_iter_next(
805 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&value))
807 ghb_dict_insert(dict, g_strdup(key), ghb_value_dup(value));
810 ghb_value_free(presetsPlist);
811 presetsPlist = presets;
817 ghb_settings_save(signal_user_data_t *ud, const gchar *name)
819 GValue *dict, *internal;
825 if (internalPlist == NULL) return;
826 if (ghb_settings_get_boolean(ud->settings, "allow_tweaks"))
829 str = ghb_settings_get_string(ud->settings, "tweak_deinterlace");
832 ghb_settings_set_string(ud->settings, "deinterlace", str);
835 str = ghb_settings_get_string(ud->settings, "tweak_denoise");
838 ghb_settings_set_string(ud->settings, "denoise", str);
842 autoscale = ghb_settings_get_boolean(ud->settings, "autoscale");
843 ghb_settings_set_int64(ud->settings, "preset_type", 1);
845 dict = ghb_dict_value_new();
846 ghb_dict_insert(dict, g_strdup("preset_name"), ghb_string_value_new(name));
847 ghb_array_append(presetsPlist, dict);
848 internal = plist_get_dict(internalPlist, "Presets");
850 ghb_dict_iter_init(&iter, internal);
851 // middle (void*) cast prevents gcc warning "defreferencing type-punned
852 // pointer will break strict-aliasing rules"
853 while (g_hash_table_iter_next(
854 &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&value))
862 if (strcmp(key, "max_width") == 0)
864 key2 = "scale_width";
866 else if (strcmp(key, "max_height") == 0)
868 key2 = "scale_height";
871 gval = ghb_settings_get_value(ud->settings, key2);
874 g_debug("Setting (%s) is not in defaults\n", (gchar*)key);
877 if (ghb_value_cmp(gval, value) != 0)
879 // Differs from default value. Store it.
880 ghb_dict_insert(dict, g_strdup(key), ghb_value_dup(gval));
884 ud->dont_clear_presets = TRUE;
885 ghb_set_preset (ud, name);
886 ud->dont_clear_presets = FALSE;
890 ghb_presets_remove(const gchar *name)
892 if (presets_get_dict(presetsPlist, name))
894 presets_remove(presetsPlist, name);
900 ghb_presets_list_update(signal_user_data_t *ud)
902 GtkTreeView *treeview;
906 GList *presets, *plink;
907 gchar *preset, *def_preset;
909 gint flags, custom, def;
911 g_debug("ghb_presets_list_update ()");
912 def_preset = ghb_settings_get_string(ud->settings, "default_preset");
913 plink = presets = ghb_presets_get_names();
914 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "presets_list"));
915 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
916 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
922 // Update row with settings data
923 g_debug("Updating row");
924 preset = (gchar*)plink->data;
926 if (strcmp(preset, def_preset) == 0)
927 def = PRESET_DEFAULT;
929 description = ghb_presets_get_description(preset);
930 flags = ghb_preset_flags(preset);
931 custom = flags & PRESET_CUSTOM;
932 gtk_list_store_set(store, &iter,
936 3, custom ? "black" : "blue",
941 done = !gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
945 // No more settings data, remove row
946 g_debug("Removing row");
947 done = !gtk_list_store_remove(store, &iter);
953 // Additional settings, add row
954 g_debug("Adding rows");
955 preset = (gchar*)plink->data;
957 if (strcmp(preset, def_preset) == 0)
958 def = PRESET_DEFAULT;
960 description = ghb_presets_get_description(preset);
961 gtk_list_store_append(store, &iter);
962 flags = ghb_preset_flags(preset);
963 custom = flags & PRESET_CUSTOM;
964 gtk_list_store_set(store, &iter, 0, preset,
967 3, custom ? "black" : "blue",
974 g_list_free (presets);
978 ghb_select_preset(GtkBuilder *builder, const gchar *preset)
980 GtkTreeView *treeview;
981 GtkTreeSelection *selection;
986 gboolean foundit = FALSE;
988 g_debug("select_preset()");
989 if (preset == NULL) return;
990 treeview = GTK_TREE_VIEW(GHB_WIDGET(builder, "presets_list"));
991 selection = gtk_tree_view_get_selection (treeview);
992 store = gtk_tree_view_get_model (treeview);
993 if (gtk_tree_model_get_iter_first(store, &iter))
997 gtk_tree_model_get(store, &iter, 0, &tpreset, -1);
998 if (strcmp(preset, tpreset) == 0)
1000 gtk_tree_selection_select_iter (selection, &iter);
1006 done = !gtk_tree_model_iter_next(store, &iter);
1011 gtk_tree_model_get_iter_first(store, &iter);
1012 gtk_tree_selection_select_iter (selection, &iter);
1017 update_audio_presets(signal_user_data_t *ud)
1019 g_debug("update_audio_presets");
1020 const GValue *audio_list;
1022 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
1023 ghb_settings_set_value(ud->settings, "pref_audio_list", audio_list);
1027 presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
1032 GtkResponseType response;
1035 g_debug("presets_save_clicked_cb ()");
1036 preset = ghb_settings_get_string (ud->settings, "preset");
1037 // Clear the description
1038 desc = GTK_TEXT_VIEW(GHB_WIDGET(ud->builder, "preset_description"));
1039 dialog = GHB_WIDGET(ud->builder, "preset_save_dialog");
1040 entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "preset_name"));
1041 gtk_entry_set_text(entry, preset);
1043 response = gtk_dialog_run(GTK_DIALOG(dialog));
1044 gtk_widget_hide(dialog);
1045 if (response == GTK_RESPONSE_OK)
1048 const gchar *name = gtk_entry_get_text(entry);
1049 g_debug("description to settings");
1050 ghb_widget_to_setting(ud->settings, GTK_WIDGET(desc));
1051 // Construct the audio settings presets from the current audio list
1052 update_audio_presets(ud);
1053 ghb_settings_save(ud, name);
1054 ghb_presets_list_update(ud);
1055 // Make the new preset the selected item
1056 ghb_select_preset(ud->builder, name);
1061 presets_restore_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
1063 g_debug("presets_restore_clicked_cb ()");
1064 // Reload only the standard presets
1065 ghb_presets_reload(ud);
1066 ghb_presets_list_update(ud);
1067 // Updating the presets list shuffles things around
1068 // need to make sure the proper preset is selected
1069 gchar *preset = ghb_settings_get_string (ud->settings, "preset");
1070 ghb_select_preset(ud->builder, preset);
1075 presets_remove_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
1077 GtkTreeView *treeview;
1078 GtkTreeSelection *selection;
1079 GtkTreeModel *store;
1082 GtkResponseType response;
1084 g_debug("presets_remove_clicked_cb ()");
1085 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "presets_list"));
1086 selection = gtk_tree_view_get_selection (treeview);
1087 if (gtk_tree_selection_get_selected(selection, &store, &iter))
1091 gtk_tree_model_get(store, &iter, 0, &preset, -1);
1092 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
1093 GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
1094 "Confirm deletion of preset %s.", preset);
1095 response = gtk_dialog_run(GTK_DIALOG(dialog));
1096 gtk_widget_destroy (dialog);
1097 if (response == GTK_RESPONSE_YES)
1099 GtkTreeIter nextIter = iter;
1100 gchar *nextPreset = NULL;
1101 if (!gtk_tree_model_iter_next(store, &nextIter))
1103 if (gtk_tree_model_get_iter_first(store, &nextIter))
1105 gtk_tree_model_get(store, &nextIter, 0, &nextPreset, -1);
1110 gtk_tree_model_get(store, &nextIter, 0, &nextPreset, -1);
1112 // Remove the selected item
1113 // First unselect it so that selecting the new item works properly
1114 gtk_tree_selection_unselect_iter (selection, &iter);
1115 ghb_presets_remove(preset);
1116 ghb_presets_list_update(ud);
1117 ghb_select_preset(ud->builder, nextPreset);
1123 preset_update_title_deps(signal_user_data_t *ud, ghb_title_info_t *tinfo)
1127 ghb_ui_update(ud, "scale_width",
1128 ghb_int64_value(tinfo->width - tinfo->crop[2] - tinfo->crop[3]));
1129 // If anamorphic or keep_aspect, the hight will be automatically calculated
1130 gboolean keep_aspect, anamorphic;
1131 keep_aspect = ghb_settings_get_boolean(ud->settings, "keep_aspect");
1132 anamorphic = ghb_settings_get_boolean(ud->settings, "anamorphic");
1133 if (!(keep_aspect || anamorphic))
1135 ghb_ui_update(ud, "scale_height",
1136 ghb_int64_value(tinfo->height - tinfo->crop[0] - tinfo->crop[1]));
1139 // Set the limits of cropping. hb_set_anamorphic_size crashes if
1140 // you pass it a cropped width or height == 0.
1142 bound = tinfo->height / 2 - 2;
1143 widget = GHB_WIDGET (ud->builder, "crop_top");
1144 gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound);
1145 widget = GHB_WIDGET (ud->builder, "crop_bottom");
1146 gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound);
1147 bound = tinfo->width / 2 - 2;
1148 widget = GHB_WIDGET (ud->builder, "crop_left");
1149 gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound);
1150 widget = GHB_WIDGET (ud->builder, "crop_right");
1151 gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound);
1152 if (ghb_settings_get_boolean(ud->settings, "autocrop"))
1154 ghb_ui_update(ud, "crop_top", ghb_int64_value(tinfo->crop[0]));
1155 ghb_ui_update(ud, "crop_bottom", ghb_int64_value(tinfo->crop[1]));
1156 ghb_ui_update(ud, "crop_left", ghb_int64_value(tinfo->crop[2]));
1157 ghb_ui_update(ud, "crop_right", ghb_int64_value(tinfo->crop[3]));
1162 presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
1164 GtkTreeModel *store;
1167 ghb_title_info_t tinfo;
1170 g_debug("presets_list_selection_changed_cb ()");
1171 widget = GHB_WIDGET (ud->builder, "presets_remove");
1172 if (gtk_tree_selection_get_selected(selection, &store, &iter))
1174 gtk_tree_model_get(store, &iter, 0, &preset, -1);
1175 ud->dont_clear_presets = TRUE;
1176 // Temporarily set the video_quality range to (0,100)
1177 // This is needed so the video_quality value does not get
1178 // truncated when set. The range will be readjusted below
1179 GtkWidget *qp = GHB_WIDGET(ud->builder, "video_quality");
1180 gtk_range_set_range (GTK_RANGE(qp), 0, 100);
1181 // Clear the audio list prior to changing the preset. Existing audio
1182 // can cause the container extension to be automatically changed when
1184 ghb_clear_audio_list(ud);
1185 ghb_set_preset(ud, preset);
1187 titleindex = ghb_settings_combo_int(ud->settings, "title");
1188 ghb_set_pref_audio(titleindex, ud);
1189 ghb_settings_set_boolean(ud->settings, "preset_modified", FALSE);
1190 ud->dont_clear_presets = FALSE;
1191 if (ghb_get_title_info (&tinfo, titleindex))
1193 preset_update_title_deps(ud, &tinfo);
1195 ghb_set_scale (ud, GHB_SCALE_KEEP_NONE);
1198 ghb_vquality_range(ud, &vqmin, &vqmax);
1199 gtk_range_set_range (GTK_RANGE(qp), vqmin, vqmax);
1200 gtk_widget_set_sensitive(widget, TRUE);
1204 g_debug("No selection??? Perhaps unselected.");
1205 gtk_widget_set_sensitive(widget, FALSE);
1210 ghb_clear_presets_selection(signal_user_data_t *ud)
1212 GtkTreeView *treeview;
1213 GtkTreeSelection *selection;
1215 if (ud->dont_clear_presets) return;
1216 g_debug("ghb_clear_presets_selection()");
1217 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "presets_list"));
1218 selection = gtk_tree_view_get_selection (treeview);
1219 gtk_tree_selection_unselect_all (selection);
1220 ghb_settings_set_boolean(ud->settings, "preset_modified", TRUE);
1224 presets_frame_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, signal_user_data_t *ud)
1226 GtkTreeView *treeview;
1227 GtkTreeSelection *selection;
1228 GtkTreeModel *store;
1231 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "presets_list"));
1232 selection = gtk_tree_view_get_selection(treeview);
1233 if (gtk_tree_selection_get_selected(selection, &store, &iter))
1236 path = gtk_tree_model_get_path (store, &iter);
1237 // Make the parent visible in scroll window if it is not.
1238 gtk_tree_view_scroll_to_cell (treeview, path, NULL, FALSE, 0, 0);
1239 gtk_tree_path_free(path);
1244 presets_default_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
1246 ghb_set_preset_default(ud->settings);
1247 ghb_presets_list_update(ud);