Blame src/glade-preferences.c

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