diff options
Diffstat (limited to '')
-rw-r--r-- | src/nautilus-preferences-window.c | 411 |
1 files changed, 411 insertions, 0 deletions
diff --git a/src/nautilus-preferences-window.c b/src/nautilus-preferences-window.c new file mode 100644 index 0000000..e8d6663 --- /dev/null +++ b/src/nautilus-preferences-window.c @@ -0,0 +1,411 @@ +/* nautilus-preferences-window.c - Functions to create and show the nautilus + * preference window. + * + * Copyright (C) 2002 Jan Arne Petersen + * Copyright (C) 2016 Carlos Soriano <csoriano@gnome.com> + * + * The Gnome Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * The Gnome Library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * see <http://www.gnu.org/licenses/>. + * + * Authors: Jan Arne Petersen <jpetersen@uni-bonn.de> + */ + +#include <config.h> + +#include "nautilus-preferences-window.h" + +#include <gtk/gtk.h> +#include <gio/gio.h> +#include <libadwaita-1/adwaita.h> + +#include <glib/gi18n.h> + +#include <nautilus-extension.h> + +#include "nautilus-column-utilities.h" +#include "nautilus-global-preferences.h" + +/* bool preferences */ +#define NAUTILUS_PREFERENCES_DIALOG_FOLDERS_FIRST_WIDGET \ + "sort_folders_first_switch" +#define NAUTILUS_PREFERENCES_DIALOG_DELETE_PERMANENTLY_WIDGET \ + "show_delete_permanently_switch" +#define NAUTILUS_PREFERENCES_DIALOG_CREATE_LINK_WIDGET \ + "show_create_link_switch" +#define NAUTILUS_PREFERENCES_DIALOG_LIST_VIEW_USE_TREE_WIDGET \ + "use_tree_view_switch" + +/* combo preferences */ +#define NAUTILUS_PREFERENCES_DIALOG_OPEN_ACTION_COMBO \ + "open_action_row" +#define NAUTILUS_PREFERENCES_DIALOG_SEARCH_RECURSIVE_ROW \ + "search_recursive_row" +#define NAUTILUS_PREFERENCES_DIALOG_THUMBNAILS_ROW \ + "thumbnails_row" +#define NAUTILUS_PREFERENCES_DIALOG_COUNT_ROW \ + "count_row" + +static const char * const speed_tradeoff_values[] = +{ + "local-only", "always", "never", + NULL +}; + +static const char * const click_behavior_values[] = {"single", "double", NULL}; + +static const char * const icon_captions_components[] = +{ + "captions_0_comborow", "captions_1_comborow", "captions_2_comborow", NULL +}; + +static GtkWidget *preferences_window = NULL; + +static void list_store_append_string (GListStore *list_store, + const gchar *string) +{ + g_autoptr (GtkStringObject) obj = gtk_string_object_new (string); + g_list_store_append (list_store, obj); +} + +static void free_column_names_array(GPtrArray *column_names) +{ + g_ptr_array_foreach (column_names, (GFunc) g_free, NULL); + g_ptr_array_free (column_names, TRUE); +} + +static void create_icon_caption_combo_row_items(AdwComboRow *combo_row, + GList *columns) +{ + GListStore *list_store = g_list_store_new (GTK_TYPE_STRING_OBJECT); + GList *l; + GPtrArray *column_names; + + column_names = g_ptr_array_new (); + + /* Translators: this is referred to captions under icons. */ + list_store_append_string (list_store, _("None")); + g_ptr_array_add (column_names, g_strdup ("none")); + + for (l = columns; l != NULL; l = l->next) + { + NautilusColumn *column; + char *name; + char *label; + + column = NAUTILUS_COLUMN (l->data); + + g_object_get (G_OBJECT (column), "name", &name, "label", &label, NULL); + + /* Don't show name here, it doesn't make sense */ + if (!strcmp (name, "name")) + { + g_free (name); + g_free (label); + continue; + } + + list_store_append_string (list_store, label); + g_ptr_array_add (column_names, name); + + g_free (label); + } + adw_combo_row_set_model (combo_row, G_LIST_MODEL (list_store)); + g_object_set_data_full (G_OBJECT (combo_row), "column_names", column_names, + (GDestroyNotify) free_column_names_array); +} + +static void icon_captions_changed_callback(AdwComboRow *widget, + GParamSpec *pspec, + gpointer user_data) +{ + GPtrArray *captions; + GtkBuilder *builder; + int i; + + builder = GTK_BUILDER (user_data); + + captions = g_ptr_array_new (); + + for (i = 0; icon_captions_components[i] != NULL; i++) + { + GtkWidget *combo_row; + int selected_index; + GPtrArray *column_names; + char *name; + + combo_row = GTK_WIDGET ( + gtk_builder_get_object (builder, icon_captions_components[i])); + selected_index = adw_combo_row_get_selected (ADW_COMBO_ROW (combo_row)); + + column_names = g_object_get_data (G_OBJECT (combo_row), "column_names"); + + name = g_ptr_array_index (column_names, selected_index); + g_ptr_array_add (captions, name); + } + g_ptr_array_add (captions, NULL); + + g_settings_set_strv (nautilus_icon_view_preferences, + NAUTILUS_PREFERENCES_ICON_VIEW_CAPTIONS, + (const char **) captions->pdata); + g_ptr_array_free (captions, TRUE); +} + +static void update_caption_combo_row(GtkBuilder *builder, + const char *combo_row_name, + const char *name) +{ + GtkWidget *combo_row; + int i; + GPtrArray *column_names; + + combo_row = GTK_WIDGET (gtk_builder_get_object (builder, combo_row_name)); + + g_signal_handlers_block_by_func ( + combo_row, G_CALLBACK (icon_captions_changed_callback), builder); + + column_names = g_object_get_data (G_OBJECT (combo_row), "column_names"); + + for (i = 0; i < column_names->len; ++i) + { + if (!strcmp (name, g_ptr_array_index (column_names, i))) + { + adw_combo_row_set_selected (ADW_COMBO_ROW (combo_row), i); + break; + } + } + + g_signal_handlers_unblock_by_func ( + combo_row, G_CALLBACK (icon_captions_changed_callback), builder); +} + +static void update_icon_captions_from_settings(GtkBuilder *builder) +{ + char **captions; + int i, j; + + captions = g_settings_get_strv (nautilus_icon_view_preferences, + NAUTILUS_PREFERENCES_ICON_VIEW_CAPTIONS); + if (captions == NULL) + { + return; + } + + for (i = 0, j = 0; icon_captions_components[i] != NULL; i++) + { + char *data; + + if (captions[j]) + { + data = captions[j]; + ++j; + } + else + { + data = "none"; + } + + update_caption_combo_row (builder, icon_captions_components[i], data); + } + + g_strfreev (captions); +} + +static void +nautilus_preferences_window_setup_icon_caption_page (GtkBuilder *builder) +{ + GList *columns; + int i; + gboolean writable; + + writable = g_settings_is_writable (nautilus_icon_view_preferences, + NAUTILUS_PREFERENCES_ICON_VIEW_CAPTIONS); + + columns = nautilus_get_common_columns (); + + for (i = 0; icon_captions_components[i] != NULL; i++) + { + GtkWidget *combo_row; + + combo_row = GTK_WIDGET ( + gtk_builder_get_object (builder, icon_captions_components[i])); + + create_icon_caption_combo_row_items (ADW_COMBO_ROW (combo_row), columns); + gtk_widget_set_sensitive (combo_row, writable); + + g_signal_connect_data ( + combo_row, "notify::selected", G_CALLBACK (icon_captions_changed_callback), + g_object_ref (builder), (GClosureNotify) g_object_unref, 0); + } + + nautilus_column_list_free (columns); + + update_icon_captions_from_settings (builder); +} + +static void bind_builder_bool(GtkBuilder *builder, + GSettings *settings, + const char *widget_name, + const char *prefs) +{ + g_settings_bind (settings, prefs, gtk_builder_get_object (builder, widget_name), + "active", G_SETTINGS_BIND_DEFAULT); +} + +static GVariant *combo_row_mapping_set(const GValue *gvalue, + const GVariantType *expected_type, + gpointer user_data) +{ + const gchar **values = user_data; + + return g_variant_new_string (values[g_value_get_uint (gvalue)]); +} + +static gboolean combo_row_mapping_get(GValue *gvalue, + GVariant *variant, + gpointer user_data) +{ + const gchar **values = user_data; + const gchar *value; + + value = g_variant_get_string (variant, NULL); + + for (int i = 0; values[i]; i++) + { + if (g_strcmp0 (value, values[i]) == 0) + { + g_value_set_uint (gvalue, i); + + return TRUE; + } + } + + return FALSE; +} + +static void bind_builder_combo_row(GtkBuilder *builder, + GSettings *settings, + const char *widget_name, + const char *prefs, + const char **values) +{ + g_settings_bind_with_mapping (settings, prefs, gtk_builder_get_object (builder, widget_name), + "selected", G_SETTINGS_BIND_DEFAULT, + combo_row_mapping_get, combo_row_mapping_set, + (gpointer) values, NULL); +} + +static void setup_combo (GtkBuilder *builder, + const char *widget_name, + const char **strings) +{ + AdwComboRow *combo_row; + GListStore *list_store; + + combo_row = (AdwComboRow *) gtk_builder_get_object (builder, widget_name); + g_assert (ADW_IS_COMBO_ROW (combo_row)); + + list_store = g_list_store_new (GTK_TYPE_STRING_OBJECT); + + for (gsize i = 0; strings[i]; i++) + { + list_store_append_string (list_store, strings[i]); + } + + adw_combo_row_set_model (combo_row, G_LIST_MODEL (list_store)); +} + +static void nautilus_preferences_window_setup(GtkBuilder *builder, + GtkWindow *parent_window) +{ + GtkWidget *window; + + setup_combo (builder, NAUTILUS_PREFERENCES_DIALOG_OPEN_ACTION_COMBO, + (const char *[]) { _("Single click"), _("Double click"), NULL }); + setup_combo (builder, NAUTILUS_PREFERENCES_DIALOG_SEARCH_RECURSIVE_ROW, + (const char *[]) { _("On this computer only"), _("All locations"), _("Never"), NULL }); + setup_combo (builder, NAUTILUS_PREFERENCES_DIALOG_THUMBNAILS_ROW, + (const char *[]) { _("On this computer only"), _("All files"), _("Never"), NULL }); + setup_combo (builder, NAUTILUS_PREFERENCES_DIALOG_COUNT_ROW, + (const char *[]) { _("On this computer only"), _("All folders"), _("Never"), NULL }); + + /* setup preferences */ + bind_builder_bool (builder, gtk_filechooser_preferences, + NAUTILUS_PREFERENCES_DIALOG_FOLDERS_FIRST_WIDGET, + NAUTILUS_PREFERENCES_SORT_DIRECTORIES_FIRST); + bind_builder_bool (builder, nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_DIALOG_LIST_VIEW_USE_TREE_WIDGET, + NAUTILUS_PREFERENCES_LIST_VIEW_USE_TREE); + bind_builder_bool (builder, nautilus_preferences, + NAUTILUS_PREFERENCES_DIALOG_CREATE_LINK_WIDGET, + NAUTILUS_PREFERENCES_SHOW_CREATE_LINK); + bind_builder_bool (builder, nautilus_preferences, + NAUTILUS_PREFERENCES_DIALOG_DELETE_PERMANENTLY_WIDGET, + NAUTILUS_PREFERENCES_SHOW_DELETE_PERMANENTLY); + + bind_builder_combo_row (builder, nautilus_preferences, + NAUTILUS_PREFERENCES_DIALOG_OPEN_ACTION_COMBO, + NAUTILUS_PREFERENCES_CLICK_POLICY, + (const char **) click_behavior_values); + bind_builder_combo_row (builder, nautilus_preferences, + NAUTILUS_PREFERENCES_DIALOG_SEARCH_RECURSIVE_ROW, + NAUTILUS_PREFERENCES_RECURSIVE_SEARCH, + (const char **) speed_tradeoff_values); + bind_builder_combo_row (builder, nautilus_preferences, + NAUTILUS_PREFERENCES_DIALOG_THUMBNAILS_ROW, + NAUTILUS_PREFERENCES_SHOW_FILE_THUMBNAILS, + (const char **) speed_tradeoff_values); + bind_builder_combo_row (builder, nautilus_preferences, + NAUTILUS_PREFERENCES_DIALOG_COUNT_ROW, + NAUTILUS_PREFERENCES_SHOW_DIRECTORY_ITEM_COUNTS, + (const char **) speed_tradeoff_values); + + nautilus_preferences_window_setup_icon_caption_page (builder); + + /* UI callbacks */ + window = GTK_WIDGET (gtk_builder_get_object (builder, "preferences_window")); + preferences_window = window; + + gtk_window_set_icon_name (GTK_WINDOW (preferences_window), APPLICATION_ID); + + g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &preferences_window); + + gtk_window_set_transient_for (GTK_WINDOW (preferences_window), parent_window); + + gtk_widget_show (preferences_window); +} + +void nautilus_preferences_window_show(GtkWindow *window) +{ + GtkBuilder *builder; + g_autoptr (GError) error = NULL; + + if (preferences_window != NULL) + { + gtk_window_present (GTK_WINDOW (preferences_window)); + return; + } + + builder = gtk_builder_new (); + + gtk_builder_add_from_resource ( + builder, "/org/gnome/nautilus/ui/nautilus-preferences-window.ui", &error); + if (error != NULL) + { + g_error ("Failed to add nautilus-preferences-window.ui: %s", error->message); + } + + nautilus_preferences_window_setup (builder, window); + + g_object_unref (builder); +} |