/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2005-2009 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 #include "dlg-find-duplicates.h" #include "gth-find-duplicates.h" #define GET_WIDGET(name) _gtk_builder_get_widget (data->builder, (name)) typedef struct { GthBrowser *browser; GtkBuilder *builder; GtkWidget *dialog; GtkWidget *location_chooser; GList *general_tests; } DialogData; static void destroy_cb (GtkWidget *widget, DialogData *data) { gth_browser_set_dialog (data->browser, "find_duplicates", NULL); _g_string_list_free (data->general_tests); g_object_unref (data->builder); g_free (data); } static void ok_clicked_cb (GtkWidget *widget, DialogData *data) { GFile *folder; folder = gth_location_chooser_get_current (GTH_LOCATION_CHOOSER (data->location_chooser)); if (folder == NULL) return; gth_find_duplicates_exec (data->browser, folder, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("include_subfolder_checkbutton"))), g_list_nth_data (data->general_tests, gtk_combo_box_get_active (GTK_COMBO_BOX (GET_WIDGET ("file_type_combobox"))))); gtk_widget_destroy (data->dialog); } void dlg_find_duplicates (GthBrowser *browser) { DialogData *data; GSettings *settings; GList *tests; char *general_filter; int active_filter; int i; int i_general; GList *scan; if (gth_browser_get_dialog (browser, "find_duplicates") != NULL) { gtk_window_present (GTK_WINDOW (gth_browser_get_dialog (browser, "find_duplicates"))); return; } data = g_new0 (DialogData, 1); data->browser = browser; data->builder = _gtk_builder_new_from_file ("find-duplicates.ui", "find_duplicates"); settings = g_settings_new (PIX_BROWSER_SCHEMA); /* Get the widgets. */ data->dialog = g_object_new (GTK_TYPE_DIALOG, "title", _("Find Duplicates"), "use-header-bar", _gtk_settings_get_dialogs_use_header (), "resizable", FALSE, NULL); gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))), _gtk_builder_get_widget (data->builder, "dialog_content")); gtk_dialog_add_buttons (GTK_DIALOG (data->dialog), _("_Find"), GTK_RESPONSE_OK, _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL, NULL); _gtk_dialog_add_class_to_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK, GTK_STYLE_CLASS_SUGGESTED_ACTION); gth_browser_set_dialog (browser, "find_duplicates", data->dialog); g_object_set_data (G_OBJECT (data->dialog), "dialog_data", data); data->location_chooser = g_object_new (GTH_TYPE_LOCATION_CHOOSER, "show-entry-points", TRUE, "show-other", TRUE, "relief", GTK_RELIEF_NORMAL, NULL); gtk_widget_show (data->location_chooser); gtk_container_add (GTK_CONTAINER (GET_WIDGET ("location_chooser_container")), data->location_chooser); /* Set widgets data. */ gth_location_chooser_set_current (GTH_LOCATION_CHOOSER (data->location_chooser), gth_browser_get_location (browser)); tests = gth_main_get_registered_objects_id (GTH_TYPE_TEST); general_filter = g_settings_get_string (settings, PREF_BROWSER_GENERAL_FILTER); active_filter = 0; for (i = 0, i_general = -1, scan = tests; scan; scan = scan->next, i++) { const char *registered_test_id = scan->data; GthTest *test; GtkTreeIter iter; if (strncmp (registered_test_id, "file::type::", 12) != 0) continue; i_general += 1; if (strcmp (registered_test_id, general_filter) == 0) active_filter = i_general; test = gth_main_get_registered_object (GTH_TYPE_TEST, registered_test_id); data->general_tests = g_list_prepend (data->general_tests, g_strdup (gth_test_get_id (test))); gtk_list_store_append (GTK_LIST_STORE (GET_WIDGET ("file_type_liststore")), &iter); gtk_list_store_set (GTK_LIST_STORE (GET_WIDGET ("file_type_liststore")), &iter, 0, gth_test_get_display_name (test), -1); g_object_unref (test); } data->general_tests = g_list_reverse (data->general_tests); gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("file_type_combobox")), active_filter); g_free (general_filter); _g_string_list_free (tests); g_object_unref (settings); /* Set the signals handlers. */ g_signal_connect (G_OBJECT (data->dialog), "destroy", G_CALLBACK (destroy_cb), data); g_signal_connect (gtk_dialog_get_widget_for_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK), "clicked", G_CALLBACK (ok_clicked_cb), data); g_signal_connect_swapped (gtk_dialog_get_widget_for_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_CANCEL), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (data->dialog)); /* Run dialog. */ gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (browser)); gtk_window_set_modal (GTK_WINDOW (data->dialog), FALSE); gtk_widget_show (data->dialog); }