}
}
+void
+presets_restore_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+{
+ g_debug("presets_restore_clicked_cb ()\n");
+ // Reload only the standard presets
+ ghb_presets_reload(ud);
+ ghb_presets_list_update(ud);
+}
+
void
prefs_dialog_cb(GtkWidget *xwidget, signal_user_data_t *ud)
{
GtkWidget *dialog;
gtk_tree_model_get(store, &iter, 0, &preset, -1);
- if (!ghb_presets_is_standard(preset))
- {
- dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
- "Confirm deletion of preset %s.", preset);
- response = gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy (dialog);
- if (response == GTK_RESPONSE_YES)
+ dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
+ "Confirm deletion of preset %s.", preset);
+ response = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy (dialog);
+ if (response == GTK_RESPONSE_YES)
+ {
+ GtkTreeIter nextIter = iter;
+ gchar *nextPreset = NULL;
+ if (!gtk_tree_model_iter_next(store, &nextIter))
{
- GtkTreeIter nextIter = iter;
- gchar *nextPreset = NULL;
- if (!gtk_tree_model_iter_next(store, &nextIter))
- {
- if (gtk_tree_model_get_iter_first(store, &nextIter))
- {
- gtk_tree_model_get(store, &nextIter, 0, &nextPreset, -1);
- }
- }
- else
+ if (gtk_tree_model_get_iter_first(store, &nextIter))
{
gtk_tree_model_get(store, &nextIter, 0, &nextPreset, -1);
}
- // Remove the selected item
- // First unselect it so that selecting the new item works properly
- gtk_tree_selection_unselect_iter (selection, &iter);
- ghb_presets_remove(ud->settings, preset);
- ghb_presets_list_update(ud);
- ghb_select_preset(ud->builder, nextPreset);
}
- }
- else
- {
- dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
- "Can not delete standard preset %s.", preset);
- response = gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy (dialog);
+ else
+ {
+ gtk_tree_model_get(store, &nextIter, 0, &nextPreset, -1);
+ }
+ // Remove the selected item
+ // First unselect it so that selecting the new item works properly
+ gtk_tree_selection_unselect_iter (selection, &iter);
+ ghb_presets_remove(ud->settings, preset);
+ ghb_presets_list_update(ud);
+ ghb_select_preset(ud->builder, nextPreset);
}
}
}
GtkTreeModel *store;
GtkTreeIter iter;
gchar *preset;
- GtkWidget *widget;
- gboolean sensitive = FALSE;
ghb_title_info_t tinfo;
+ GtkWidget *widget;
g_debug("presets_list_selection_changed_cb ()\n");
+ widget = GHB_WIDGET (ud->builder, "presets_remove");
if (gtk_tree_selection_get_selected(selection, &store, &iter))
{
gtk_tree_model_get(store, &iter, 0, &preset, -1);
- if (!ghb_presets_is_standard(preset))
- {
- sensitive = TRUE;
- }
ud->dont_clear_presets = TRUE;
// Temporarily set the video_quality range to (0,100)
// This is needed so the video_quality value does not get
gint vqmin, vqmax;
ghb_vquality_range(ud, &vqmin, &vqmax);
gtk_range_set_range (GTK_RANGE(qp), vqmin, vqmax);
+ gtk_widget_set_sensitive(widget, TRUE);
}
else
{
g_debug("No selection??? Perhaps unselected.\n");
+ gtk_widget_set_sensitive(widget, FALSE);
}
- widget = GHB_WIDGET (ud->builder, "presets_remove");
- gtk_widget_set_sensitive(widget, sensitive);
}
void
GKeyFile *keyFile;
} presets_data_t;
-static GKeyFile *standardKeyFile;
-static GKeyFile *customKeyFile;
+static GKeyFile *presetsKeyFile;
static GKeyFile *internalKeyFile;
static GKeyFile *prefsKeyFile;
static GList *presetsList;
-static gint
-search_group(const gchar *name, gchar **groups)
-{
- gint ii;
-
- //g_debug("search_group\n");
- if (groups == NULL) return -1;
- for (ii = 0; groups[ii] != NULL; ii++)
- {
- //g_debug("%s cmp %s\n", name, groups[ii]);
- if (strcmp(name, groups[ii]) == 0)
- {
- return ii;
- }
- }
- return -1;
-}
-
presets_data_t *
presets_list_search(GList *list, const gchar *name)
{
{
GList *link = presetsList;
presets_data_t *data;
- gchar **custom, **standard;
- gsize clength, slength;
- gint ii, jj;
+ gchar **presets;
+ gsize length;
+ gint ii;
g_debug("build_presets_list ()\n");
// First clear out the old presets list
presetsList = NULL;
// Now build up the new list
+ // Make standard presets appear before custom in the list
const gchar *def_name = ghb_settings_get_string(settings, "default_preset");
- custom = g_key_file_get_groups(customKeyFile, &clength);
- standard = g_key_file_get_groups(standardKeyFile, &slength);
- if ((slength + clength) <= 0) return;
- jj = 0;
- for (ii = 0; ii < slength; ii++)
- {
- if (search_group(standard[ii], custom) < 0)
- {
+ presets = g_key_file_get_groups(presetsKeyFile, &length);
+ if (length <= 0) return;
+ for (ii = 0; ii < length; ii++)
+ {
+ gint type;
+ GError *err = NULL;
+ type = g_key_file_get_integer(presetsKeyFile, presets[ii], "preset_type", &err);
+ if (!err && type == 0)
+ { // Its a standard preset
gchar *desc;
data = g_malloc(sizeof(presets_data_t));
- data->name = g_strdup(standard[ii]);
- data->keyFile = standardKeyFile;
+ data->name = g_strdup(presets[ii]);
+ data->keyFile = presetsKeyFile;
data->custom = FALSE;
data->defalt = FALSE;
if ((def_name != NULL) && (strcmp(def_name, data->name) == 0))
{
data->defalt = TRUE;
}
- desc = g_key_file_get_string(standardKeyFile, standard[ii], "preset_description", NULL);
+ desc = g_key_file_get_string(presetsKeyFile, presets[ii], "preset_description", NULL);
data->description = desc;
presetsList = g_list_append(presetsList, data);
}
}
- for (ii = 0; ii < clength; ii++)
+ for (ii = 0; ii < length; ii++)
{
- gchar *desc;
- data = g_malloc(sizeof(presets_data_t));
- data->name = g_strdup(custom[ii]);
- data->keyFile = customKeyFile;
- data->custom = TRUE;
- data->defalt = FALSE;
- if ((def_name != NULL) && (strcmp(def_name, data->name) == 0))
- {
- data->defalt = TRUE;
+ gint type;
+ GError *err = NULL;
+ type = g_key_file_get_integer(presetsKeyFile, presets[ii], "preset_type", &err);
+ if (err || type != 0)
+ { // Its a custom preset
+ gchar *desc;
+ data = g_malloc(sizeof(presets_data_t));
+ data->name = g_strdup(presets[ii]);
+ data->keyFile = presetsKeyFile;
+ data->custom = TRUE;
+ data->defalt = FALSE;
+ if ((def_name != NULL) && (strcmp(def_name, data->name) == 0))
+ {
+ data->defalt = TRUE;
+ }
+ desc = g_key_file_get_string(presetsKeyFile, presets[ii], "preset_description", NULL);
+ data->description = desc;
+ presetsList = g_list_append(presetsList, data);
}
- desc = g_key_file_get_string(customKeyFile, custom[ii], "preset_description", NULL);
- data->description = desc;
- presetsList = g_list_append(presetsList, data);
}
- g_strfreev(custom);
- g_strfreev(standard);
+ g_strfreev(presets);
}
static void
}
void
-ghb_presets_load(signal_user_data_t *ud)
+ghb_presets_reload(signal_user_data_t *ud)
{
- const gchar *dir;
gchar *config;
- GHashTable *settings = ud->settings;
+ GKeyFile *keyFile;
- g_debug("ghb_presets_load()\n");
- customKeyFile = g_key_file_new();
- standardKeyFile = g_key_file_new();
- dir = g_get_user_config_dir();
- config = g_strdup_printf ("%s/ghb/custom_presets", dir);
- if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
+ g_debug("ghb_presets_reload()\n");
+ keyFile = g_key_file_new();
+
+ config = g_strdup_printf ("./standard_presets");
+ if (!g_file_test(config, G_FILE_TEST_IS_REGULAR))
{
- g_key_file_load_from_file( customKeyFile, config,
- G_KEY_FILE_KEEP_COMMENTS, NULL);
+ g_free(config);
+
+ const gchar* const *dirs;
+ gint ii;
+ dirs = g_get_system_data_dirs();
+ if (dirs != NULL)
+ {
+ for (ii = 0; dirs[ii] != NULL; ii++)
+ {
+ config = g_strdup_printf("%s/ghb/standard_presets", dirs[ii]);
+ if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
+ {
+ break;
+ }
+ g_free(config);
+ config = NULL;
+ }
+ }
}
- g_free(config);
- // Try current dir first. Makes testing prior to installation easier
- if (g_file_test("./standard_presets", G_FILE_TEST_IS_REGULAR))
+ if (config != NULL)
{
- g_key_file_load_from_file( standardKeyFile, "./standard_presets",
+ gchar **groups, **keys;
+ gchar *value;
+ gint ii, jj;
+
+ g_key_file_load_from_file( keyFile, config,
G_KEY_FILE_KEEP_COMMENTS, NULL);
+ // Merge the keyfile contents into our presets
+ groups = g_key_file_get_groups(keyFile, NULL);
+ // First remove any existing groups with the same names
+ for (ii = 0; groups[ii] != NULL; ii++)
+ {
+ g_key_file_remove_group(presetsKeyFile, groups[ii], NULL);
+ }
+ for (ii = 0; groups[ii] != NULL; ii++)
+ {
+ keys = g_key_file_get_keys(keyFile, groups[ii], NULL, NULL);
+ for (jj = 0; keys[jj] != NULL; jj++)
+ {
+ GError *err = NULL;
+ value = g_key_file_get_string(
+ keyFile, groups[ii], keys[jj], &err);
+ if (value && !err)
+ {
+ g_key_file_set_string(
+ presetsKeyFile, groups[ii], keys[jj], value);
+ }
+ if (value) g_free(value);
+ }
+ g_strfreev(keys);
+ }
+ g_strfreev(groups);
}
- else
+ g_key_file_free(keyFile);
+ build_presets_list(ud->settings);
+}
+
+void
+ghb_presets_load(signal_user_data_t *ud)
+{
+ const gchar *dir;
+ gchar *config;
+
+ g_debug("ghb_presets_load()\n");
+ presetsKeyFile = g_key_file_new();
+ dir = g_get_user_config_dir();
+ config = g_strdup_printf ("%s/ghb/presets", dir);
+
+ if (!g_file_test(config, G_FILE_TEST_IS_REGULAR))
{
- // Try users config dir
- config = g_strdup_printf ("%s/ghb/standard_presets", dir);
- if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
+ g_free(config);
+ config = g_strdup_printf ("./standard_presets");
+ if (!g_file_test(config, G_FILE_TEST_IS_REGULAR))
{
- g_key_file_load_from_file( standardKeyFile, config,
- G_KEY_FILE_KEEP_COMMENTS, NULL);
g_free(config);
- }
- else
- {
+
const gchar* const *dirs;
gint ii;
- g_free(config);
dirs = g_get_system_data_dirs();
if (dirs != NULL)
{
config = g_strdup_printf("%s/ghb/standard_presets", dirs[ii]);
if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
{
- g_key_file_load_from_file( standardKeyFile, config,
- G_KEY_FILE_KEEP_COMMENTS, NULL);
break;
}
g_free(config);
+ config = NULL;
}
}
}
}
- build_presets_list(settings);
+ if (config != NULL)
+ {
+ g_key_file_load_from_file( presetsKeyFile, config,
+ G_KEY_FILE_KEEP_COMMENTS, NULL);
+ }
+ build_presets_list(ud->settings);
}
static void
presets_store()
{
g_debug("presets_store ()\n");
- store_key_file(customKeyFile, "custom_presets");
+ store_key_file(presetsKeyFile, "presets");
}
typedef struct
g_debug("ghb_settings_save ()\n");
ski.name = name;
- ski.keyFile = customKeyFile;
+ ski.keyFile = presetsKeyFile;
if (ghb_settings_get_bool(ud->settings, "allow_tweaks"))
{
const gchar *str;
ghb_settings_set_string(ud->settings, "denoise", str);
}
ski.autoscale = ghb_settings_get_bool (ud->settings, "autoscale");
+ g_key_file_remove_group(presetsKeyFile, name, NULL);
+ ghb_settings_set_string(ud->settings, "preset_type", "1");
g_hash_table_foreach(ud->settings, store_to_key_file, &ski);
presets_store();
build_presets_list(ud->settings);
ud->dont_clear_presets = FALSE;
}
-// Checks to see if the preset is in standard presets
-// I allow standard to be overridden by adding a preset with the
-// same name to the custom list. So to determine if the named
-// preset is standard, I must first check to see if is in the
-// custom list.
-gboolean
-ghb_presets_is_standard(const gchar *name)
-{
- g_debug("ghb_presets_is_standard()\n");
- if (g_key_file_has_group(customKeyFile, name))
- {
- // The preset is in the custom list, so it
- // can not be a standard.
- return FALSE;
- }
- return g_key_file_has_group(standardKeyFile, name);
-}
-
-// This function will not remove presets from the standard preset list.
// Return false if attempt is made.
gboolean
ghb_presets_remove(GHashTable *settings, const gchar *name)
{
g_debug("ghb_presets_remove()\n");
- if (g_key_file_has_group(customKeyFile, name))
+ if (g_key_file_has_group(presetsKeyFile, name))
{
g_debug("\t removing %s\n", name);
- g_key_file_remove_group(customKeyFile, name, NULL);
+ g_key_file_remove_group(presetsKeyFile, name, NULL);
presets_store();
build_presets_list(settings);
return TRUE;