X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=gtk%2Fsrc%2Fpresets.c;h=43babd138cc7804a806fcc1759d9cbdf7c9ca6a8;hb=44946a6f8be82a70e65ca534541183a26fdb804b;hp=74a101b79ec77a865fe1c18c77dd19d2431ec99a;hpb=edd8a2c303d9332e5bd7e509ef2b42b0ebecd165;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/gtk/src/presets.c b/gtk/src/presets.c index 74a101b7..43babd13 100644 --- a/gtk/src/presets.c +++ b/gtk/src/presets.c @@ -517,6 +517,37 @@ presets_clear_default(GValue *presets) } } +static void +presets_customize(GValue *presets) +{ + gint count, ii; + + count = ghb_array_len(presets); + for (ii = 0; ii < count; ii++) + { + GValue *dict; + gboolean folder; + gint ptype; + + dict = ghb_array_get_nth(presets, ii); + + ptype = ghb_value_int(preset_dict_get_value(dict, "Type")); + if (ptype != PRESETS_CUSTOM) + { + ghb_dict_insert(dict, g_strdup("Type"), + ghb_int64_value_new(PRESETS_CUSTOM)); + } + folder = ghb_value_boolean(preset_dict_get_value(dict, "Folder")); + if (folder) + { + GValue *nested; + + nested = ghb_dict_lookup(dict, "ChildrenArray"); + presets_customize(nested); + } + } +} + static gint* presets_find_default2(GValue *presets, gint *len) { @@ -1385,13 +1416,25 @@ ghb_prefs_load(signal_user_data_t *ud) { ghb_dict_insert(dict, g_strdup(key), ghb_value_dup(gval)); } - const gchar *dir = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS); + + const gchar *dir = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); + if (dir == NULL) + { + dir = "."; + } + ghb_dict_insert(dict, + g_strdup("ExportDirectory"), ghb_value_dup(ghb_string_value(dir))); + + dir = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS); if (dir == NULL) { dir = "."; } ghb_dict_insert(dict, g_strdup("destination_dir"), ghb_value_dup(ghb_string_value(dir))); + + ghb_dict_insert(dict, + g_strdup("SrtDir"), ghb_value_dup(ghb_string_value(dir))); #if defined(_WIN32) gchar *source; @@ -1522,6 +1565,7 @@ ghb_presets_list_init( 2, def ? 2 : 0, 3, color, 4, description, + 5, type == PRESETS_BUILTIN ? 0 : 1, -1); if (def && piter) { @@ -1565,7 +1609,8 @@ static void presets_list_update_item( signal_user_data_t *ud, gint *indices, - gint len) + gint len, + gboolean recurse) { GtkTreeView *treeview; GtkTreeStore *store; @@ -1599,8 +1644,9 @@ presets_list_update_item( 2, def ? 2 : 0, 3, color, 4, description, + 5, type == PRESETS_BUILTIN ? 0 : 1, -1); - if (folder) + if (recurse && folder) { ghb_presets_list_init(ud, indices, len); } @@ -1663,6 +1709,7 @@ presets_list_insert( 2, def ? 2 : 0, 3, color, 4, description, + 5, type == PRESETS_BUILTIN ? 0 : 1, -1); if (folder) { @@ -1763,7 +1810,7 @@ static value_map_t acodec_xlat[] = value_map_t container_xlat[] = { {"MP4 file", "mp4"}, - {"M4V file", "m4v"}, + {"M4V file", "mp4"}, {"MKV file", "mkv"}, {"AVI file", "mkv"}, {"OGM file", "mkv"}, @@ -1858,7 +1905,14 @@ export_lang_xlat2(GValue *lin_val) { if (strcmp(str, ghb_language_table[ii].iso639_2) == 0) { - gval = ghb_string_value_new(ghb_language_table[ii].eng_name); + const gchar *lang; + + if (ghb_language_table[ii].native_name[0] != 0) + lang = ghb_language_table[ii].native_name; + else + lang = ghb_language_table[ii].eng_name; + + gval = ghb_string_value_new(lang); g_free(str); return gval; } @@ -1904,7 +1958,8 @@ import_lang_xlat2(GValue *mac_val) str = ghb_value_string(mac_val); for (ii = 0; ghb_language_table[ii].eng_name; ii++) { - if (strcmp(str, ghb_language_table[ii].eng_name) == 0) + if ((strcmp(str, ghb_language_table[ii].eng_name) == 0) || + (strcmp(str, ghb_language_table[ii].native_name) == 0)) { gval = ghb_string_value_new(ghb_language_table[ii].iso639_2); g_free(str); @@ -2219,6 +2274,7 @@ import_value_xlat(GValue *dict) if (gval) ghb_dict_insert(dict, g_strdup(key), gval); + GValue *sdeflist; GValue *sdefaults; GValue *slist; @@ -2248,17 +2304,17 @@ import_value_xlat(GValue *dict) { key = "Subtitles"; mac_val = ghb_dict_lookup(dict, key); + slist = ghb_array_value_new(8); + ghb_dict_insert(dict, g_strdup("SubtitleList"), slist); if (mac_val) { gchar *lang; gval = import_subtitle_xlat2(mac_val); lang = ghb_value_string(gval); - if (lang && strcmp(lang, "none") != 0 && !slist) + if (lang && strcasecmp(lang, "none") != 0 && !slist) { - slist = ghb_array_value_new(8); sdict = ghb_dict_value_new(); - ghb_dict_insert(dict, g_strdup("SubtitleList"), slist); ghb_array_append(slist, sdict); ghb_dict_insert(sdict, g_strdup("SubtitleLanguage"), gval); gval = ghb_dict_lookup(dict, "SubtitlesForced"); @@ -2324,6 +2380,18 @@ import_value_xlat(GValue *dict) gval = import_value_xlat2(adefaults, mix_xlat, key, mac_val); if (gval) ghb_dict_insert(adict, g_strdup(key), gval); + + mac_val = ghb_dict_lookup(adict, "AudioTrackDRCSlider"); + if (mac_val != NULL) + { + gdouble drc; + drc = ghb_value_double(mac_val); + if (drc < 1.0 && drc > 0.0) + { + ghb_dict_insert(adict, g_strdup("AudioTrackDRCSlider"), + ghb_double_value_new(0.0)); + } + } } } } @@ -2333,7 +2401,7 @@ import_xlat_preset(GValue *dict) { gboolean uses_max; gint uses_pic; - gint par, par_width, par_height; + gint par; gint vqtype; g_debug("import_xlat_preset ()"); @@ -2343,12 +2411,6 @@ import_xlat_preset(GValue *dict) preset_dict_get_value(dict, "UsesPictureSettings")); par = ghb_value_int(preset_dict_get_value(dict, "PicturePAR")); vqtype = ghb_value_int(preset_dict_get_value(dict, "VideoQualityType")); - par_width = ghb_value_int(preset_dict_get_value(dict, "PicturePARWidth")); - par_height = ghb_value_int(preset_dict_get_value(dict, "PicturePARHeight")); - ghb_dict_insert(dict, g_strdup("par_width"), - ghb_int_value_new(par_width)); - ghb_dict_insert(dict, g_strdup("par_height"), - ghb_int_value_new(par_height)); if (uses_max || uses_pic == 2) { @@ -2492,7 +2554,6 @@ static void export_xlat_preset(GValue *dict) { gboolean autoscale, target, br, constant; - gint par_width, par_height; g_debug("export_xlat_prest ()"); autoscale = ghb_value_boolean(preset_dict_get_value(dict, "autoscale")); @@ -2502,10 +2563,6 @@ export_xlat_preset(GValue *dict) preset_dict_get_value(dict, "vquality_type_bitrate")); constant = ghb_value_boolean( preset_dict_get_value(dict, "vquality_type_constant")); - par_width = ghb_value_int( - preset_dict_get_value(dict, "par_width")); - par_height = ghb_value_int( - preset_dict_get_value(dict, "par_height")); if (autoscale) ghb_dict_insert(dict, g_strdup("UsesPictureSettings"), @@ -2530,17 +2587,31 @@ export_xlat_preset(GValue *dict) ghb_dict_insert(dict, g_strdup("VideoQualityType"), ghb_int_value_new(2)); } - ghb_dict_insert(dict, g_strdup("PicturePARWidth"), - ghb_int_value_new(par_width)); - ghb_dict_insert(dict, g_strdup("PicturePARHeight"), - ghb_int_value_new(par_height)); + + GValue *alist, *adict; + gint count, ii; + + alist = ghb_dict_lookup(dict, "AudioList"); + count = ghb_array_len(alist); + for (ii = 0; ii < count; ii++) + { + gdouble drc; + + adict = ghb_array_get_nth(alist, ii); + drc = ghb_value_double( + preset_dict_get_value(adict, "AudioTrackDRCSlider")); + if (drc < 1.0 && drc > 0.0) + { + ghb_dict_insert(adict, g_strdup("AudioTrackDRCSlider"), + ghb_double_value_new(0.0)); + } + } + ghb_dict_remove(dict, "UsesMaxPictureSettings"); ghb_dict_remove(dict, "autoscale"); ghb_dict_remove(dict, "vquality_type_target"); ghb_dict_remove(dict, "vquality_type_bitrate"); ghb_dict_remove(dict, "vquality_type_constant"); - ghb_dict_remove(dict, "par_width"); - ghb_dict_remove(dict, "par_height"); export_value_xlat(dict); } @@ -2895,7 +2966,7 @@ settings_save(signal_user_data_t *ud, const GValue *path) ghb_dict_insert(dict, g_strdup("Default"), ghb_boolean_value_new(FALSE)); } - presets_list_update_item(ud, indices, len); + presets_list_update_item(ud, indices, len, FALSE); } else { @@ -2941,7 +3012,9 @@ folder_save(signal_user_data_t *ud, const GValue *path) ghb_dict_insert(dict, g_strdup("PresetDescription"), ghb_value_dup(preset_dict_get_value( ud->settings, "PresetDescription"))); + presets_list_update_item(ud, indices, len, FALSE); g_free(indices); + store_presets(); return; } else @@ -3048,7 +3121,7 @@ update_subtitle_presets(signal_user_data_t *ud) g_debug("update_subtitle_presets"); const GValue *subtitle_list, *subtitle; GValue *slist, *dict; - gint count, ii; + gint count, ii, source; subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list"); slist = ghb_array_value_new(8); @@ -3056,51 +3129,232 @@ update_subtitle_presets(signal_user_data_t *ud) for (ii = 0; ii < count; ii++) { subtitle = ghb_array_get_nth(subtitle_list, ii); - dict = ghb_value_dup(subtitle); - ghb_array_append(slist, dict); + source = ghb_settings_get_int(subtitle, "SubtitleSource"); + if (source != SRTSUB) + { + dict = ghb_value_dup(subtitle); + ghb_array_append(slist, dict); + } } - ghb_settings_set_value(ud->settings, "SubtitleList", slist); + ghb_settings_take_value(ud->settings, "SubtitleList", slist); } -void -enforce_preset_type(signal_user_data_t *ud, const GValue *path) +G_MODULE_EXPORT void +presets_menu_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { - gint *indices, len; - GtkWidget *normal, *folder; - gboolean fold; + GtkMenu *menu; - normal = GHB_WIDGET(ud->builder, "preset_type_normal"); - folder = GHB_WIDGET(ud->builder, "preset_type_folder"); - indices = ghb_preset_indices_from_path(presetsPlist, path, &len); - if (indices) + menu = GTK_MENU(GHB_WIDGET(ud->builder, "presets_menu")); + gtk_menu_popup(menu, NULL, NULL, NULL, NULL, 1, + gtk_get_current_event_time()); +} + +G_MODULE_EXPORT void +preset_import_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) +{ + GtkWidget *dialog; + GtkResponseType response; + gchar *exportDir; + gchar *filename; + GtkFileFilter *filter; + + g_debug("preset_import_clicked_cb ()"); + + dialog = gtk_file_chooser_dialog_new("Import Preset", NULL, + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, "All (*)"); + gtk_file_filter_add_pattern(filter, "*"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); + + filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, "Presets (*.plist)"); + gtk_file_filter_add_pattern(filter, "*.plist"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); + + exportDir = ghb_settings_get_string(ud->settings, "ExportDirectory"); + if (exportDir == NULL || exportDir[0] == '\0') { - fold = ghb_presets_get_folder(presetsPlist, indices, len); - if (fold) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(folder), - TRUE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(normal), - TRUE); - gtk_widget_set_sensitive(folder, fold); - gtk_widget_set_sensitive(normal, !fold); - g_free(indices); + exportDir = g_strdup("."); } - else + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), exportDir); + g_free(exportDir); + + response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); + if (response == GTK_RESPONSE_ACCEPT) { - gtk_widget_set_sensitive(folder, TRUE); - gtk_widget_set_sensitive(normal, TRUE); + GValue *dict, *array; + gchar *dir; + gint count, ii; + + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + // import the preset + if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) + { + gtk_widget_destroy(dialog); + g_free(filename); + return; + } + array = ghb_plist_parse_file(filename); + g_free(filename); + + import_xlat_presets(array); + presets_clear_default(array); + presets_customize(array); + + count = ghb_array_len(array); + for (ii = 0; ii < count; ii++) + { + GValue *path, *name; + gint *indices, len; + gint index = 1; + + dict = ghb_array_get_nth(array, ii); + path = ghb_array_value_new(1); + name = ghb_value_dup(ghb_dict_lookup(dict, "PresetName")); + ghb_array_append(path, name); + indices = ghb_preset_indices_from_path(presetsPlist, path, &len); + // Modify the preset name till we make it unique + while (indices != NULL) + { + gchar *str = ghb_value_string(name); + + ghb_value_free(path); + g_free(indices); + + str = g_strdup_printf("%s %d", str, index); + path = ghb_array_value_new(1); + name = ghb_string_value_new(str); + ghb_array_append(path, name); + g_free(str); + + index++; + indices = ghb_preset_indices_from_path(presetsPlist, path, &len); + } + ghb_dict_insert(dict, g_strdup("PresetName"), ghb_value_dup(name)); + indices = presets_find_pos(path, PRESETS_CUSTOM, &len); + ghb_presets_insert(presetsPlist, ghb_value_dup(dict), indices, len); + presets_list_insert(ud, indices, len); + ghb_value_free(path); + } + ghb_value_free(array); + + exportDir = ghb_settings_get_string(ud->settings, "ExportDirectory"); + dir = g_path_get_dirname(filename); + if (strcmp(dir, exportDir) != 0) + { + ghb_settings_set_string(ud->settings, "ExportDirectory", dir); + ghb_pref_save(ud->settings, "ExportDirectory"); + } + g_free(exportDir); + g_free(dir); } + gtk_widget_destroy(dialog); } G_MODULE_EXPORT void -presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) +preset_export_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) +{ + GtkWidget *dialog; + GtkResponseType response; + GValue *preset; + const gchar *name = ""; + gint count, *indices, len; + gchar *exportDir; + gchar *filename; + + g_debug("preset_export_clicked_cb ()"); + preset = ghb_settings_get_value (ud->settings, "preset_selection"); + if (preset == NULL) + return; + + count = ghb_array_len(preset); + if (count <= 0) + return; + + name = g_value_get_string(ghb_array_get_nth(preset, count-1)); + + dialog = gtk_file_chooser_dialog_new("Export Preset", NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + + exportDir = ghb_settings_get_string(ud->settings, "ExportDirectory"); + if (exportDir == NULL || exportDir[0] == '\0') + { + exportDir = g_strdup("."); + } + filename = g_strdup_printf("%s.plist", name); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), exportDir); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); + g_free(filename); + g_free(exportDir); + + indices = ghb_preset_indices_from_path(presetsPlist, preset, &len); + if (indices == NULL) + return; + + response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); + if (response == GTK_RESPONSE_ACCEPT) + { + GValue *export, *dict, *array; + FILE *file; + gchar *dir; + + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + // export the preset + dict = presets_get_dict(presetsPlist, indices, len); + + export = ghb_value_dup(dict); + array = ghb_array_value_new(1); + ghb_array_append(array, export); + presets_clear_default(array); + presets_customize(array); + export_xlat_presets(array); + + file = g_fopen(filename, "w"); + if (file != NULL) + { + ghb_plist_write(file, array); + fclose(file); + } + ghb_value_free(array); + + exportDir = ghb_settings_get_string(ud->settings, "ExportDirectory"); + dir = g_path_get_dirname(filename); + if (strcmp(dir, exportDir) != 0) + { + ghb_settings_set_string(ud->settings, "ExportDirectory", dir); + ghb_pref_save(ud->settings, "ExportDirectory"); + } + g_free(exportDir); + g_free(dir); + g_free(filename); + } + gtk_widget_destroy(dialog); + g_free(indices); +} + +G_MODULE_EXPORT void +presets_new_folder_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkWidget *dialog; GtkEntry *entry; GtkTextView *desc; GtkResponseType response; - GValue *preset; + GValue *preset, *dict; const gchar *name = ""; + const gchar *description = ""; gint count, *indices, len; g_debug("presets_save_clicked_cb ()"); @@ -3111,12 +3365,20 @@ presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) name = g_value_get_string(ghb_array_get_nth(preset, count-1)); else count = 1; - // Clear the description + + indices = ghb_preset_indices_from_path(presetsPlist, preset, &len); + dict = presets_get_dict(presetsPlist, indices, len); + if (dict != NULL) + { + description = g_value_get_string( + ghb_dict_lookup(dict, "PresetDescription")); + ghb_ui_update(ud, "PresetDescription", ghb_string_value(description)); + } + desc = GTK_TEXT_VIEW(GHB_WIDGET(ud->builder, "PresetDescription")); dialog = GHB_WIDGET(ud->builder, "preset_save_dialog"); entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetName")); gtk_entry_set_text(entry, name); - enforce_preset_type(ud, preset); response = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_hide(dialog); if (response == GTK_RESPONSE_OK) @@ -3125,13 +3387,61 @@ presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) const gchar *name = gtk_entry_get_text(entry); GValue *dest; - if (ghb_settings_get_boolean(ud->settings, "preset_type_folder")) + if (count > MAX_NESTED_PRESET-1) + count = MAX_NESTED_PRESET-1; + + dest = ghb_array_value_new(MAX_NESTED_PRESET); + if (indices != NULL) { - if (count > MAX_NESTED_PRESET-1) + gint ptype; + + ptype = ghb_presets_get_type(presetsPlist, indices, len); + if (ptype == PRESETS_CUSTOM) { - count = MAX_NESTED_PRESET-1; + ghb_array_copy(dest, preset, count-1); } } + ghb_array_append(dest, ghb_string_value_new(name)); + ghb_widget_to_setting(ud->settings, GTK_WIDGET(desc)); + folder_save(ud, dest); + ghb_value_free(dest); + } + if (indices != NULL) + g_free(indices); +} + +G_MODULE_EXPORT void +presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) +{ + GtkWidget *dialog; + GtkEntry *entry; + GtkTextView *desc; + GtkResponseType response; + GValue *preset; + const gchar *name = ""; + gint count, *indices, len; + + g_debug("presets_save_clicked_cb ()"); + preset = ghb_settings_get_value (ud->settings, "preset_selection"); + + count = ghb_array_len(preset); + if (count > 0) + name = g_value_get_string(ghb_array_get_nth(preset, count-1)); + else + count = 1; + + desc = GTK_TEXT_VIEW(GHB_WIDGET(ud->builder, "PresetDescription")); + dialog = GHB_WIDGET(ud->builder, "preset_save_dialog"); + entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetName")); + gtk_entry_set_text(entry, name); + response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); + if (response == GTK_RESPONSE_OK) + { + // save the preset + const gchar *name = gtk_entry_get_text(entry); + GValue *dest; + dest = ghb_array_value_new(MAX_NESTED_PRESET); indices = ghb_preset_indices_from_path(presetsPlist, preset, &len); if (indices) @@ -3143,21 +3453,16 @@ presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { ghb_array_copy(dest, preset, count-1); } + g_free(indices); } ghb_array_append(dest, ghb_string_value_new(name)); ghb_widget_to_setting(ud->settings, GTK_WIDGET(desc)); - if (ghb_settings_get_boolean(ud->settings, "preset_type_folder")) - { - folder_save(ud, dest); - } - else - { - // Construct the audio settings presets from the current audio list - update_audio_presets(ud); - update_subtitle_presets(ud); - settings_save(ud, dest); - } + + // Construct the audio settings presets from the current audio list + update_audio_presets(ud); + update_subtitle_presets(ud); + settings_save(ud, dest); ghb_value_free(dest); } } @@ -3169,22 +3474,6 @@ preset_type_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } G_MODULE_EXPORT void -preset_name_changed_cb(GtkWidget *entry, signal_user_data_t *ud) -{ - gchar *name; - GValue *preset, *dest; - gint count; - - preset = ghb_settings_get_value (ud->settings, "preset_selection"); - name = ghb_widget_string(entry); - dest = ghb_value_dup(preset); - count = ghb_array_len(dest); - ghb_array_replace(dest, count-1, ghb_string_value_new(name)); - enforce_preset_type(ud, dest); - ghb_value_free(dest); -} - -G_MODULE_EXPORT void presets_restore_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GValue *preset; @@ -3503,7 +3792,7 @@ presets_drag_cb( dstpath = gtk_tree_model_get_path (dstmodel, &iter); dst_indices = gtk_tree_path_get_indices(dstpath); dst_len = gtk_tree_path_get_depth(dstpath); - presets_list_update_item(ud, dst_indices, dst_len); + presets_list_update_item(ud, dst_indices, dst_len, TRUE); gtk_tree_path_free(dstpath); store_presets(); @@ -3748,3 +4037,50 @@ presets_default_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) } } +G_MODULE_EXPORT void +preset_edited_cb( + GtkCellRendererText *cell, + gchar *path, + gchar *text, + signal_user_data_t *ud) +{ + GtkTreePath *treepath; + GtkTreeStore *store; + GtkTreeView *treeview; + GtkTreeIter iter; + gint *indices, len, count; + GValue *dict; + GValue *preset, *dest; + + g_debug("preset_edited_cb ()"); + g_debug("path (%s)", path); + g_debug("text (%s)", text); + + preset = ghb_settings_get_value (ud->settings, "preset_selection"); + dest = ghb_array_value_new(MAX_NESTED_PRESET); + count = ghb_array_len(preset); + ghb_array_copy(dest, preset, count-1); + ghb_array_append(dest, ghb_string_value_new(text)); + indices = ghb_preset_indices_from_path(presetsPlist, dest, &len); + ghb_value_free(dest); + if (indices != NULL) + { + // Already exists + g_free(indices); + return; + } + + treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "presets_list")); + store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); + treepath = gtk_tree_path_new_from_string (path); + indices = gtk_tree_path_get_indices(treepath); + len = gtk_tree_path_get_depth(treepath); + gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, treepath); + gtk_tree_store_set(store, &iter, 0, text, -1); + + dict = presets_get_dict(presetsPlist, indices, len); + ghb_dict_insert(dict, g_strdup("PresetName"), ghb_string_value_new(text)); + store_presets(); + gtk_tree_path_free (treepath); +} +