/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2019 The 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 #include "gth-search-source-selector.h" enum { ADD_SOURCE, REMOVE_SOURCE, LAST_SIGNAL }; struct _GthSearchSourceSelectorPrivate { GtkWidget *location_chooser; GtkWidget *recursive_checkbutton; GtkWidget *add_button; GtkWidget *remove_button; }; static guint gth_search_source_selector_signals[LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE_WITH_CODE (GthSearchSourceSelector, gth_search_source_selector, GTK_TYPE_BOX, G_ADD_PRIVATE (GthSearchSourceSelector)) static void gth_search_source_selector_class_init (GthSearchSourceSelectorClass *klass) { /* signals */ gth_search_source_selector_signals[ADD_SOURCE] = g_signal_new ("add-source", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GthSearchSourceSelectorClass, add_source), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gth_search_source_selector_signals[REMOVE_SOURCE] = g_signal_new ("remove-source", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GthSearchSourceSelectorClass, remove_source), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void gth_search_source_selector_init (GthSearchSourceSelector *self) { self->priv = gth_search_source_selector_get_instance_private (self); self->priv->location_chooser = NULL; self->priv->recursive_checkbutton = NULL; self->priv->add_button = NULL; self->priv->remove_button = NULL; gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_HORIZONTAL); } static void add_button_clicked_cb (GtkButton *button, GthSearchSourceSelector *self) { g_signal_emit (self, gth_search_source_selector_signals[ADD_SOURCE], 0); } static void remove_button_clicked_cb (GtkButton *button, GthSearchSourceSelector *self) { g_signal_emit (self, gth_search_source_selector_signals[REMOVE_SOURCE], 0); } static void gth_search_source_selector_construct (GthSearchSourceSelector *self) { GtkWidget *vbox; GtkWidget *hbox; gtk_box_set_spacing (GTK_BOX (self), 6); gtk_container_set_border_width (GTK_CONTAINER (self), 0); self->priv->location_chooser = g_object_new (GTH_TYPE_LOCATION_CHOOSER, "show-entry-points", TRUE, "show-other", TRUE, "relief", GTK_RELIEF_NORMAL, NULL); gtk_widget_show (self->priv->location_chooser); self->priv->recursive_checkbutton = gtk_check_button_new_with_mnemonic(_("_Include sub-folders")); gtk_widget_show (self->priv->recursive_checkbutton); /* add/remove buttons */ self->priv->add_button = gtk_button_new_from_icon_name ("list-add-symbolic", GTK_ICON_SIZE_BUTTON); gtk_button_set_relief (GTK_BUTTON (self->priv->add_button), GTK_RELIEF_NONE); gtk_widget_set_tooltip_text (self->priv->add_button, _("Add another location")); gtk_widget_show_all (self->priv->add_button); g_signal_connect (G_OBJECT (self->priv->add_button), "clicked", G_CALLBACK (add_button_clicked_cb), self); self->priv->remove_button = gtk_button_new_from_icon_name ("list-remove-symbolic", GTK_ICON_SIZE_BUTTON); gtk_button_set_relief (GTK_BUTTON (self->priv->remove_button), GTK_RELIEF_NONE); gtk_widget_set_tooltip_text (self->priv->remove_button, _("Remove")); gtk_widget_show_all (self->priv->remove_button); g_signal_connect (G_OBJECT (self->priv->remove_button), "clicked", G_CALLBACK (remove_button_clicked_cb), self); /**/ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_widget_show (vbox); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (hbox), self->priv->location_chooser, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), self->priv->recursive_checkbutton, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (self), vbox, FALSE, FALSE, 0); gtk_box_pack_end (GTK_BOX (self), self->priv->add_button, FALSE, FALSE, 0); gtk_box_pack_end (GTK_BOX (self), self->priv->remove_button, FALSE, FALSE, 0); } GtkWidget * gth_search_source_selector_new (void) { GthSearchSourceSelector *self; self = g_object_new (GTH_TYPE_SEARCH_SOURCE_SELECTOR, NULL); gth_search_source_selector_construct (self); gth_search_source_selector_set_source (self, NULL); return (GtkWidget *) self; } GtkWidget * gth_search_source_selector_new_with_source (GthSearchSource *source) { GthSearchSourceSelector *self; self = g_object_new (GTH_TYPE_SEARCH_SOURCE_SELECTOR, NULL); gth_search_source_selector_construct (self); gth_search_source_selector_set_source (self, source); return (GtkWidget *) self; } void gth_search_source_selector_set_source (GthSearchSourceSelector *self, GthSearchSource *source) { GFile *folder; gboolean recursive; if (source != NULL) { folder = _g_object_ref (gth_search_source_get_folder (source)); recursive = gth_search_source_is_recursive (source); } else { folder = NULL; recursive = TRUE; } if (folder == NULL) folder = g_file_new_for_uri (_g_uri_get_home ()); gth_location_chooser_set_current (GTH_LOCATION_CHOOSER (self->priv->location_chooser), folder); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->priv->recursive_checkbutton), recursive); } GthSearchSource * gth_search_source_selector_get_source (GthSearchSourceSelector *self) { GthSearchSource *source; source = gth_search_source_new (); gth_search_source_set_folder (source, gth_location_chooser_get_current (GTH_LOCATION_CHOOSER (self->priv->location_chooser))); gth_search_source_set_recursive (source, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->priv->recursive_checkbutton))); return source; } void gth_search_source_selector_can_remove (GthSearchSourceSelector *self, gboolean value) { gtk_widget_set_sensitive (self->priv->remove_button, value); } void gth_search_source_selector_focus (GthSearchSourceSelector *self) { gtk_widget_grab_focus (self->priv->location_chooser); }