/* * Copyright (C) 2012 Juan Pablo Ugarte. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Authors: * Juan Pablo Ugarte */ #include "glade-preferences.h" #include #include #define CONFIG_GROUP "Preferences" #define CONFIG_KEY_CATALOG_PATHS "catalog-paths" #define CONFIG_GROUP_LOAD_SAVE "Load and Save" #define CONFIG_KEY_BACKUP "backup" #define CONFIG_KEY_AUTOSAVE "autosave" #define CONFIG_KEY_AUTOSAVE_SECONDS "autosave-seconds" #define CONFIG_GROUP_SAVE_WARNINGS "Save Warnings" #define CONFIG_KEY_VERSIONING "versioning" #define CONFIG_KEY_DEPRECATIONS "deprecations" #define CONFIG_KEY_UNRECOGNIZED "unrecognized" /* Default preference values */ #define DEFAULT_BACKUP TRUE #define DEFAULT_AUTOSAVE TRUE #define DEFAULT_AUTOSAVE_SECONDS 5 #define DEFAULT_WARN_VERSIONS TRUE #define DEFAULT_WARN_DEPRECATIONS FALSE #define DEFAULT_WARN_UNRECOGNIZED TRUE enum { COLUMN_PATH = 0, COLUMN_CANONICAL_PATH }; struct _GladePreferencesPrivate { GtkTreeModel *catalog_path_store; GtkTreeSelection *selection; GtkWidget *remove_catalog_button; GtkWidget *create_backups_toggle; GtkWidget *autosave_toggle; GtkWidget *autosave_spin; GtkWidget *versioning_toggle; GtkWidget *deprecations_toggle; GtkWidget *unrecognized_toggle; }; G_DEFINE_TYPE_WITH_PRIVATE (GladePreferences, glade_preferences, GTK_TYPE_DIALOG); /******************************************************** * CALLBACKS * ********************************************************/ static void autosave_toggled (GtkToggleButton *button, GladePreferences *prefs) { gtk_widget_set_sensitive (prefs->priv->autosave_spin, gtk_toggle_button_get_active (button)); } static gboolean find_row (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { gchar **directory = data; gchar *string; gtk_tree_model_get (model, iter, COLUMN_CANONICAL_PATH, &string, -1); if (g_strcmp0 (string, *directory) == 0) { g_free (*directory); *directory = NULL; return TRUE; } return FALSE; } static void on_preferences_filechooserdialog_response (GtkDialog *dialog, gint response_id, GladePreferences *preferences) { GladePreferencesPrivate *priv = preferences->priv; gtk_widget_hide (GTK_WIDGET (dialog)); if (response_id == GTK_RESPONSE_ACCEPT) { gchar *directory = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gchar *canonical, *display; canonical = glade_util_canonical_path (directory); display = glade_utils_replace_home_dir_with_tilde (canonical); gtk_tree_model_foreach (priv->catalog_path_store, find_row, &canonical); if (canonical) { GtkTreeIter iter; glade_catalog_add_path (canonical); gtk_list_store_append (GTK_LIST_STORE (priv->catalog_path_store), &iter); gtk_list_store_set (GTK_LIST_STORE (priv->catalog_path_store), &iter, COLUMN_PATH, display, COLUMN_CANONICAL_PATH, canonical, -1); } g_free (directory); g_free (canonical); g_free (display); } } static void remove_catalog_clicked (GtkButton *button, GladePreferences *preferences) { GladePreferencesPrivate *priv = preferences->priv; GtkTreeIter iter; if (gtk_tree_selection_get_selected (priv->selection, NULL, &iter)) { gchar *path = NULL; gtk_tree_model_get (priv->catalog_path_store, &iter, COLUMN_CANONICAL_PATH, &path, -1); if (path) { glade_catalog_remove_path (path); g_free (path); } gtk_list_store_remove (GTK_LIST_STORE (priv->catalog_path_store), &iter); } } static void catalog_selection_changed (GtkTreeSelection *selection, GladePreferences *preferences) { gboolean selected = gtk_tree_selection_get_selected (selection, NULL, NULL); /* Make the button sensitive if anything is selected */ gtk_widget_set_sensitive (preferences->priv->remove_catalog_button, selected); } /******************************************************** * Class/Instance Init * ********************************************************/ static void glade_preferences_init (GladePreferences *preferences) { preferences->priv = glade_preferences_get_instance_private (preferences); gtk_widget_init_template (GTK_WIDGET (preferences)); } static void glade_preferences_class_init (GladePreferencesClass *klass) { GtkWidgetClass *widget_class; widget_class = GTK_WIDGET_CLASS (klass); /* Setup the template GtkBuilder xml for this class */ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/glade/glade-preferences.glade"); /* Define the relationship of the private entry and the entry defined in the xml */ gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, catalog_path_store); gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, remove_catalog_button); gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, selection); gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, create_backups_toggle); gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, autosave_toggle); gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, autosave_spin); gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, versioning_toggle); gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, deprecations_toggle); gtk_widget_class_bind_template_child_private (widget_class, GladePreferences, unrecognized_toggle); /* Declare the callback ports that this widget class exposes, to bind with * connections defined in the GtkBuilder xml */ gtk_widget_class_bind_template_callback (widget_class, autosave_toggled); gtk_widget_class_bind_template_callback (widget_class, on_preferences_filechooserdialog_response); gtk_widget_class_bind_template_callback (widget_class, catalog_selection_changed); gtk_widget_class_bind_template_callback (widget_class, remove_catalog_clicked); } /******************************************************** * API * ********************************************************/ GtkWidget * glade_preferences_new (void) { return g_object_new (GLADE_TYPE_PREFERENCES, NULL); } void glade_preferences_save (GladePreferences *prefs, GKeyFile *config) { GtkTreeModel *model = prefs->priv->catalog_path_store; GString *string = g_string_new (""); GtkTreeIter iter; gboolean valid; valid = gtk_tree_model_get_iter_first (model, &iter); while (valid) { gchar *path; gtk_tree_model_get (model, &iter, COLUMN_CANONICAL_PATH, &path, -1); valid = gtk_tree_model_iter_next (model, &iter); g_string_append (string, path); if (valid) g_string_append (string, ":"); g_free (path); } g_key_file_set_string (config, CONFIG_GROUP, CONFIG_KEY_CATALOG_PATHS, string->str); /* Load and save */ g_key_file_set_boolean (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_BACKUP, glade_preferences_backup (prefs)); g_key_file_set_boolean (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_AUTOSAVE, glade_preferences_autosave (prefs)); g_key_file_set_integer (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_AUTOSAVE_SECONDS, glade_preferences_autosave_seconds (prefs)); /* Warnings */ g_key_file_set_boolean (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_VERSIONING, glade_preferences_warn_versioning (prefs)); g_key_file_set_boolean (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_DEPRECATIONS, glade_preferences_warn_deprecations (prefs)); g_key_file_set_boolean (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_UNRECOGNIZED, glade_preferences_warn_unrecognized (prefs)); g_string_free (string, TRUE); } void glade_preferences_load (GladePreferences *prefs, GKeyFile *config) { gboolean backups = DEFAULT_BACKUP; gboolean autosave = DEFAULT_AUTOSAVE; gboolean warn_versioning = DEFAULT_WARN_VERSIONS; gboolean warn_deprecations = DEFAULT_WARN_DEPRECATIONS; gboolean warn_unrecognized = DEFAULT_WARN_UNRECOGNIZED; gint autosave_seconds = DEFAULT_AUTOSAVE_SECONDS; gchar *string; string = g_key_file_get_string (config, CONFIG_GROUP, CONFIG_KEY_CATALOG_PATHS, NULL); if (string && g_strcmp0 (string, "")) { gchar **paths, **path; gtk_list_store_clear (GTK_LIST_STORE (prefs->priv->catalog_path_store)); glade_catalog_remove_path (NULL); paths = g_strsplit (string, ":", -1); path = paths; do { GtkTreeIter iter; gchar *canonical, *display; canonical = glade_util_canonical_path (*path); display = glade_utils_replace_home_dir_with_tilde (canonical); glade_catalog_add_path (canonical); gtk_list_store_append (GTK_LIST_STORE (prefs->priv->catalog_path_store), &iter); gtk_list_store_set (GTK_LIST_STORE (prefs->priv->catalog_path_store), &iter, COLUMN_PATH, display, COLUMN_CANONICAL_PATH, canonical, -1); g_free (display); g_free (canonical); } while (*++path); g_strfreev (paths); } /* Load and save */ if (g_key_file_has_key (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_BACKUP, NULL)) backups = g_key_file_get_boolean (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_BACKUP, NULL); if (g_key_file_has_key (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_AUTOSAVE, NULL)) autosave = g_key_file_get_boolean (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_AUTOSAVE, NULL); if (g_key_file_has_key (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_AUTOSAVE_SECONDS, NULL)) autosave_seconds = g_key_file_get_integer (config, CONFIG_GROUP_LOAD_SAVE, CONFIG_KEY_AUTOSAVE_SECONDS, NULL); /* Warnings */ if (g_key_file_has_key (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_VERSIONING, NULL)) warn_versioning = g_key_file_get_boolean (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_VERSIONING, NULL); if (g_key_file_has_key (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_DEPRECATIONS, NULL)) warn_deprecations = g_key_file_get_boolean (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_DEPRECATIONS, NULL); if (g_key_file_has_key (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_UNRECOGNIZED, NULL)) warn_unrecognized = g_key_file_get_boolean (config, CONFIG_GROUP_SAVE_WARNINGS, CONFIG_KEY_UNRECOGNIZED, NULL); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->create_backups_toggle), backups); gtk_widget_set_sensitive (prefs->priv->autosave_spin, autosave); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->autosave_toggle), autosave); gtk_spin_button_set_value (GTK_SPIN_BUTTON (prefs->priv->autosave_spin), autosave_seconds); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->versioning_toggle), warn_versioning); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->deprecations_toggle), warn_deprecations); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->priv->unrecognized_toggle), warn_unrecognized); g_free (string); } gboolean glade_preferences_backup (GladePreferences *prefs) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->create_backups_toggle)); } gboolean glade_preferences_autosave (GladePreferences *prefs) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->autosave_toggle)); } gint glade_preferences_autosave_seconds (GladePreferences *prefs) { return (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (prefs->priv->autosave_spin)); } gboolean glade_preferences_warn_versioning (GladePreferences *prefs) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->versioning_toggle)); } gboolean glade_preferences_warn_deprecations (GladePreferences *prefs) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->deprecations_toggle)); } gboolean glade_preferences_warn_unrecognized (GladePreferences *prefs) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->unrecognized_toggle)); }