/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2011 Free Software Foundation, Inc. * * 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, see . */ #include #include #include "gth-folder-chooser-dialog.h" #define GET_WIDGET(x) (_gtk_builder_get_widget (self->priv->builder, (x))) enum { FOLDER_FILE_COLUMN, FOLDER_NAME_COLUMN, FOLDER_SELECTED_COLUMN }; struct _GthFolderChooserDialogPrivate { GtkBuilder *builder; }; G_DEFINE_TYPE_WITH_CODE (GthFolderChooserDialog, gth_folder_chooser_dialog, GTK_TYPE_DIALOG, G_ADD_PRIVATE (GthFolderChooserDialog)) static void gth_folder_chooser_dialog_finalize (GObject *object) { GthFolderChooserDialog *self; self = GTH_FOLDER_CHOOSER_DIALOG (object); _g_object_unref (self->priv->builder); G_OBJECT_CLASS (gth_folder_chooser_dialog_parent_class)->finalize (object); } static void gth_folder_chooser_dialog_class_init (GthFolderChooserDialogClass *klass) { GObjectClass *object_class; object_class = (GObjectClass*) klass; object_class->finalize = gth_folder_chooser_dialog_finalize; } static void folder_cellrenderertoggle_toggled_cb (GtkCellRendererToggle *cell_renderer, char *path, gpointer user_data) { GthFolderChooserDialog *self = user_data; GtkTreeModel *model; GtkTreePath *tree_path; GtkTreeIter iter; gboolean selected; model = GTK_TREE_MODEL (GET_WIDGET ("folders_liststore")); tree_path = gtk_tree_path_new_from_string (path); if (! gtk_tree_model_get_iter (model, &iter, tree_path)) { gtk_tree_path_free (tree_path); return; } gtk_tree_model_get (model, &iter, FOLDER_SELECTED_COLUMN, &selected, -1); gtk_list_store_set (GTK_LIST_STORE (model), &iter, FOLDER_SELECTED_COLUMN, ! selected, -1); gtk_tree_path_free (tree_path); } static void gth_folder_chooser_dialog_init (GthFolderChooserDialog *self) { GtkWidget *content; self->priv = gth_folder_chooser_dialog_get_instance_private (self); self->priv->builder = _gtk_builder_new_from_file ("find-duplicates-choose-folders.ui", "find_duplicates"); gtk_window_set_resizable (GTK_WINDOW (self), TRUE); content = _gtk_builder_get_widget (self->priv->builder, "folder_chooser"); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), content, TRUE, TRUE, 0); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GET_WIDGET ("folders_liststore")), FOLDER_NAME_COLUMN, GTK_SORT_ASCENDING); g_signal_connect (GET_WIDGET ("folder_cellrenderertoggle"), "toggled", G_CALLBACK (folder_cellrenderertoggle_toggled_cb), self); gtk_dialog_add_button (GTK_DIALOG (self), _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button (GTK_DIALOG (self), _GTK_LABEL_OK, GTK_RESPONSE_OK); gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_OK); _gtk_dialog_add_class_to_response (GTK_DIALOG (self), GTK_RESPONSE_OK, GTK_STYLE_CLASS_SUGGESTED_ACTION); } static void gth_folder_chooser_dialog_construct (GthFolderChooserDialog *self, GList *folders) { GtkTreeIter iter; GList *scan; int idx; gtk_list_store_clear (GTK_LIST_STORE (GET_WIDGET ("folders_liststore"))); for (scan = folders, idx = 0; scan; scan = scan->next, idx++) { GFile *folder = scan->data; char *display_name; display_name = g_file_get_parse_name (folder); gtk_list_store_append (GTK_LIST_STORE (GET_WIDGET ("folders_liststore")), &iter); gtk_list_store_set (GTK_LIST_STORE (GET_WIDGET ("folders_liststore")), &iter, FOLDER_FILE_COLUMN, folder, FOLDER_NAME_COLUMN, display_name, FOLDER_SELECTED_COLUMN, FALSE, -1); g_free (display_name); } } GtkWidget * gth_folder_chooser_dialog_new (GList *folders) { GthFolderChooserDialog *self; self = g_object_new (GTH_TYPE_FOLDER_CHOOSER_DIALOG, /*"title", _("Folders"),*/ "use-header-bar", _gtk_settings_get_dialogs_use_header (), NULL); gth_folder_chooser_dialog_construct (self, folders); return (GtkWidget *) self; } GHashTable * gth_folder_chooser_dialog_get_selected (GthFolderChooserDialog *self) { GHashTable *folders; GtkTreeModel *model; GtkTreeIter iter; folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, NULL); model = GTK_TREE_MODEL (GET_WIDGET ("folders_liststore")); if (gtk_tree_model_get_iter_first (model, &iter)) { do { GFile *folder; gboolean selected; gtk_tree_model_get (model, &iter, FOLDER_FILE_COLUMN, &folder, FOLDER_SELECTED_COLUMN, &selected, -1); if (selected) g_hash_table_insert (folders, g_object_ref (folder), GINT_TO_POINTER (1)); g_object_unref (folder); } while (gtk_tree_model_iter_next (model, &iter)); } return folders; }