[gthumb] show the number of files found during the search



commit b55fa1be1377b4477f9abfbdce9a048a64cd2220
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Wed Jul 21 19:49:30 2010 +0200

    show the number of files found during the search

 extensions/search/gth-search-task.c |   69 +++++++++++++-------
 gthumb/gedit-message-area.c         |  119 ++++++++++++++++++-----------------
 gthumb/gedit-message-area.h         |    2 +-
 gthumb/gth-browser.c                |   21 ++++---
 gthumb/gth-embedded-dialog.c        |   21 +++----
 gthumb/gth-embedded-dialog.h        |   10 ++--
 6 files changed, 133 insertions(+), 109 deletions(-)
---
diff --git a/extensions/search/gth-search-task.c b/extensions/search/gth-search-task.c
index 16f3544..6432c56 100644
--- a/extensions/search/gth-search-task.c
+++ b/extensions/search/gth-search-task.c
@@ -39,6 +39,7 @@ struct _GthSearchTaskPrivate
 	gulong         location_ready_id;
 	GtkWidget     *dialog;
 	GthFileSource *file_source;
+	gsize          n_files;
 };
 
 
@@ -78,21 +79,14 @@ gth_task_finalize (GObject *object)
 typedef struct {
 	GthBrowser    *browser;
 	GthSearchTask *task;
+	gulong         response_id;
 } EmbeddedDialogData;
 
 
 static void
-embedded_dialog_destroy_cb (GeditMessageArea *message_area,
-			    gpointer          user_data)
-{
-	g_free ((EmbeddedDialogData *) user_data);
-}
-
-
-static void
-embedded_dialog_response_cb (GeditMessageArea *message_area,
-			     int               response_id,
-			     gpointer          user_data)
+embedded_dialog_response_cb (GthEmbeddedDialog *dialog,
+			     int                response_id,
+			     gpointer           user_data)
 {
 	EmbeddedDialogData *data = user_data;
 
@@ -100,9 +94,13 @@ embedded_dialog_response_cb (GeditMessageArea *message_area,
 	case GTK_RESPONSE_CANCEL:
 		gth_task_cancel (GTH_TASK (data->task));
 		break;
+
 	default:
 		break;
 	}
+
+	g_signal_handler_disconnect (dialog, data->response_id);
+	g_free (data);
 }
 
 
@@ -136,6 +134,8 @@ done_func (GObject  *object,
 	gsize          size;
 	GFile         *search_result_real_file;
 
+	gth_embedded_dialog_set_secondary_text (GTH_EMBEDDED_DIALOG (task->priv->dialog), NULL);
+
 	task->priv->error = NULL;
 	if (error != NULL) {
 		if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
@@ -172,6 +172,18 @@ done_func (GObject  *object,
 
 
 static void
+update_secondary_text (GthSearchTask *task)
+{
+	char *msg;
+
+	msg = g_strdup_printf (_("Files found untill now: %" G_GSIZE_FORMAT), task->priv->n_files);
+	gth_embedded_dialog_set_secondary_text (GTH_EMBEDDED_DIALOG (task->priv->dialog), msg);
+
+	g_free (msg);
+}
+
+
+static void
 for_each_file_func (GFile     *file,
 		    GFileInfo *info,
 		    gpointer   user_data)
@@ -184,8 +196,11 @@ for_each_file_func (GFile     *file,
 
 	file_data = gth_file_data_new (file, info);
 
-	if (gth_test_match (GTH_TEST (task->priv->test), file_data))
+	if (gth_test_match (GTH_TEST (task->priv->test), file_data)) {
 		gth_catalog_insert_file (GTH_CATALOG (task->priv->search), file_data->file, -1);
+		task->priv->n_files++;
+		update_secondary_text (task);
+	}
 
 	g_object_unref (file_data);
 }
@@ -218,6 +233,7 @@ browser_location_ready_cb (GthBrowser    *browser,
 			   gboolean       error,
 			   GthSearchTask *task)
 {
+	GtkWidget          *button;
 	EmbeddedDialogData *dialog_data;
 	GString            *attributes;
 	const char         *test_attributes;
@@ -229,26 +245,29 @@ browser_location_ready_cb (GthBrowser    *browser,
 		return;
 	}
 
+	task->priv->n_files = 0;
+
 	task->priv->dialog = gth_browser_get_list_extra_widget (browser);
-	gth_embedded_dialog_set_icon (GTH_EMBEDDED_DIALOG (task->priv->dialog), GTK_STOCK_FIND);
+	gth_embedded_dialog_set_icon (GTH_EMBEDDED_DIALOG (task->priv->dialog), GTK_STOCK_FIND, GTK_ICON_SIZE_DIALOG);
 	gth_embedded_dialog_set_primary_text (GTH_EMBEDDED_DIALOG (task->priv->dialog), _("Searching..."));
+	update_secondary_text (task);
 	gedit_message_area_clear_action_area (GEDIT_MESSAGE_AREA (task->priv->dialog));
-	gedit_message_area_add_stock_button_with_text (GEDIT_MESSAGE_AREA (task->priv->dialog),
-						       NULL,
-						       GTK_STOCK_CANCEL,
-						       GTK_RESPONSE_CANCEL);
+	button = gtk_button_new ();
+	gtk_container_add (GTK_CONTAINER (button), gtk_image_new_from_stock (GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON));
+	gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+	gtk_widget_set_tooltip_text (button, _("Cancel the operation"));
+	gtk_widget_show_all (button);
+	gedit_message_area_add_action_widget (GEDIT_MESSAGE_AREA (task->priv->dialog),
+					      button,
+					      GTK_RESPONSE_CANCEL);
 
 	dialog_data = g_new0 (EmbeddedDialogData, 1);
 	dialog_data->browser = task->priv->browser;
 	dialog_data->task = task;
-	g_signal_connect (task->priv->dialog,
-			  "destroy",
-			  G_CALLBACK (embedded_dialog_destroy_cb),
-			  dialog_data);
-	g_signal_connect (task->priv->dialog,
-			  "response",
-			  G_CALLBACK (embedded_dialog_response_cb),
-			  dialog_data);
+	dialog_data->response_id = g_signal_connect (task->priv->dialog,
+						     "response",
+						     G_CALLBACK (embedded_dialog_response_cb),
+						     dialog_data);
 
 	/**/
 
diff --git a/gthumb/gedit-message-area.c b/gthumb/gedit-message-area.c
index 76ea5ce..f43e4d8 100644
--- a/gthumb/gedit-message-area.c
+++ b/gthumb/gedit-message-area.c
@@ -141,49 +141,75 @@ gedit_message_area_close (GeditMessageArea *message_area)
 				     GTK_RESPONSE_CANCEL);
 }
 
+
 /*
+static void
+gedit_message_area_style_set (GtkWidget *widget,
+			      GtkStyle  *prev_style)
+{
+	GeditMessageArea *message_area = GEDIT_MESSAGE_AREA (widget);
+	GtkWidget        *window;
+	GtkStyle         *style;
+
+	if (message_area->priv->changing_style)
+		return;
+
+	// This is a hack needed to use the tooltip background color
+	window = gtk_window_new (GTK_WINDOW_POPUP);
+	gtk_widget_set_name (window, "gtk-tooltip");
+	gtk_widget_ensure_style (window);
+	style = gtk_widget_get_style (window);
+
+	message_area->priv->changing_style = TRUE;
+	gtk_widget_set_style (GTK_WIDGET (message_area), style);
+	message_area->priv->changing_style = FALSE;
+
+	gtk_widget_destroy (window);
+
+	gtk_widget_queue_draw (GTK_WIDGET (message_area));
+}
+*/
+
+
 static gboolean
-paint_message_area (GtkWidget      *widget,
-		    GdkEventExpose *event,
-		    gpointer        user_data)
+gedit_message_area_expose (GtkWidget      *widget,
+			   GdkEventExpose *event)
 {
-	guint        border;
-	GdkRectangle area;
-	GdkRectangle paint_area;
-
-	border = gtk_container_get_border_width (GTK_CONTAINER (widget));
-
-	area.x = widget->allocation.x + border;
-	area.y = widget->allocation.y + border;
-	area.width = widget->allocation.width - (border * 2);
-	area.height = widget->allocation.height - (border * 2);
-
-	if (gdk_rectangle_intersect (&event->area, &area, &paint_area))
-		gtk_paint_flat_box (widget->style,
-				    widget->window,
-				    GTK_STATE_NORMAL,
-				    GTK_SHADOW_NONE,
-				    &paint_area,
-				    widget,
-				    "tooltip",
-				    area.x,
-				    area.y,
-				    area.width,
-				    area.height);
+	/*
+	gtk_paint_box (widget->style,
+		       widget->window,
+		       GTK_STATE_NORMAL,
+		       GTK_SHADOW_OUT,
+		       NULL,
+		       widget,
+		       "infobar",
+		       widget->allocation.x,
+		       widget->allocation.y,
+		       widget->allocation.width,
+		       widget->allocation.height);
+	 */
+
+	if (GTK_WIDGET_CLASS (gedit_message_area_parent_class)->expose_event)
+		GTK_WIDGET_CLASS (gedit_message_area_parent_class)->expose_event (widget, event);
 
 	return FALSE;
 }
-*/
+
 
 static void
 gedit_message_area_class_init (GeditMessageAreaClass *klass)
 {
-	GObjectClass *object_class;
-	GtkBindingSet *binding_set;
+	GObjectClass   *object_class;
+	GtkWidgetClass *widget_class;
+	GtkBindingSet  *binding_set;
 
 	object_class = G_OBJECT_CLASS (klass);
 	object_class->finalize = gedit_message_area_finalize;
 
+	widget_class = GTK_WIDGET_CLASS (klass);
+	/*widget_class->style_set = gedit_message_area_style_set;*/
+	widget_class->expose_event = gedit_message_area_expose;
+
 	klass->close = gedit_message_area_close;
 
 	g_type_class_add_private (object_class, sizeof(GeditMessageAreaPrivate));
@@ -210,39 +236,14 @@ gedit_message_area_class_init (GeditMessageAreaClass *klass)
 	gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, "close", 0);
 }
 
-/*
-static void
-style_set (GtkWidget        *widget,
-	   GtkStyle         *prev_style,
-	   GeditMessageArea *message_area)
-{
-	GtkWidget *window;
-	GtkStyle *style;
-
-	if (message_area->priv->changing_style)
-		return;
-
-	// This is a hack needed to use the tooltip background color
-	window = gtk_window_new (GTK_WINDOW_POPUP);
-	gtk_widget_set_name (window, "gtk-tooltip");
-	gtk_widget_ensure_style (window);
-	style = gtk_widget_get_style (window);
-
-	message_area->priv->changing_style = TRUE;
-	gtk_widget_set_style (GTK_WIDGET (message_area), style);
-	message_area->priv->changing_style = FALSE;
-
-	gtk_widget_destroy (window);
-
-	gtk_widget_queue_draw (GTK_WIDGET (message_area));
-}
-*/
 
 static void
 gedit_message_area_init (GeditMessageArea *message_area)
 {
 	GtkWidget *vbox;
 
+	gtk_widget_push_composite_child ();
+
 	message_area->priv = GEDIT_MESSAGE_AREA_GET_PRIVATE (message_area);
 
 	message_area->priv->main_hbox = gtk_hbox_new (FALSE, 3); /* FIXME: use style properties */
@@ -271,8 +272,10 @@ gedit_message_area_init (GeditMessageArea *message_area)
 			    TRUE,
 			    0);
 
-	/*
 	gtk_widget_set_app_paintable (GTK_WIDGET (message_area), TRUE);
+	gtk_widget_set_redraw_on_allocate (GTK_WIDGET (message_area), TRUE);
+
+	/*
 
 	g_signal_connect (message_area,
 			  "expose-event",
@@ -289,6 +292,8 @@ gedit_message_area_init (GeditMessageArea *message_area)
 			  "style-set",
 			  G_CALLBACK (style_set),
 			  message_area);*/
+
+	gtk_widget_pop_composite_child ();
 }
 
 static gint
diff --git a/gthumb/gedit-message-area.h b/gthumb/gedit-message-area.h
index ce912c1..71c38e5 100644
--- a/gthumb/gedit-message-area.h
+++ b/gthumb/gedit-message-area.h
@@ -57,7 +57,7 @@ struct _GeditMessageArea
 {
 	GtkHBox parent;
 
-	/*< private > */
+	/*< private >*/
 	GeditMessageAreaPrivate *priv;
 };
 
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 8a719d9..916c932 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -564,7 +564,7 @@ gth_browser_update_extra_widget (GthBrowser *browser)
 {
 	gedit_message_area_clear_action_area (GEDIT_MESSAGE_AREA (browser->priv->list_extra_widget));
 	if (g_file_info_get_icon (browser->priv->location->info) != NULL)
-		gth_embedded_dialog_set_gicon (GTH_EMBEDDED_DIALOG (browser->priv->list_extra_widget), g_file_info_get_icon (browser->priv->location->info));
+		gth_embedded_dialog_set_gicon (GTH_EMBEDDED_DIALOG (browser->priv->list_extra_widget), g_file_info_get_icon (browser->priv->location->info), GTK_ICON_SIZE_BUTTON);
 	if (g_file_info_get_display_name (browser->priv->location->info) != NULL)
 		gth_embedded_dialog_set_primary_text (GTH_EMBEDDED_DIALOG (browser->priv->list_extra_widget), g_file_info_get_display_name (browser->priv->location->info));
 	gth_hook_invoke ("gth-browser-update-extra-widget", browser);
@@ -1072,18 +1072,14 @@ load_data_done (LoadData *load_data,
 		g_free (uri);
 	}
 
-	browser->priv->activity_ref--;
-	g_signal_emit (G_OBJECT (browser),
-		       gth_browser_signals[LOCATION_READY],
-		       0,
-		       load_data->requested_folder->file,
-		       (error != NULL));
-
 	if (error == NULL) {
 		_g_object_unref (browser->priv->location_source);
 		browser->priv->location_source = g_object_ref (load_data->file_source);
 	}
 
+	/* moving the "gth-browser-load-location-after" after the
+	 * LOCATION_READY signal emition can brake the extensions */
+
 	if ((load_data->action == GTH_ACTION_GO_TO)
 	    || (load_data->action == GTH_ACTION_GO_INTO)
 	    || (load_data->action == GTH_ACTION_GO_BACK)
@@ -1095,6 +1091,13 @@ load_data_done (LoadData *load_data,
 		gth_hook_invoke ("gth-browser-load-location-after", browser, browser->priv->location, error);
 	}
 
+	browser->priv->activity_ref--;
+	g_signal_emit (G_OBJECT (browser),
+		       gth_browser_signals[LOCATION_READY],
+		       0,
+		       load_data->requested_folder->file,
+		       (error != NULL));
+
 	if (error == NULL)
 		return;
 
@@ -4051,7 +4054,7 @@ _gth_browser_construct (GthBrowser *browser)
 	gtk_widget_show (browser->priv->list_extra_widget_container);
 	gtk_box_pack_start (GTK_BOX (vbox), browser->priv->list_extra_widget_container, FALSE, FALSE, 0);
 
-	browser->priv->list_extra_widget = gth_embedded_dialog_new (NULL, NULL, NULL);
+	browser->priv->list_extra_widget = gth_embedded_dialog_new ();
 	gtk_widget_show (browser->priv->list_extra_widget);
 	gtk_container_add (GTK_CONTAINER (browser->priv->list_extra_widget_container), browser->priv->list_extra_widget);
 
diff --git a/gthumb/gth-embedded-dialog.c b/gthumb/gth-embedded-dialog.c
index 4f32118..184e9bc 100644
--- a/gthumb/gth-embedded-dialog.c
+++ b/gthumb/gth-embedded-dialog.c
@@ -86,7 +86,7 @@ gth_embedded_dialog_get_type (void)
 		};
 
 		type = g_type_register_static (GEDIT_TYPE_MESSAGE_AREA,
-					       "GthEmbeddedEditorDialog",
+					       "GthEmbeddedDialog",
 					       &type_info,
 					       0);
 	}
@@ -111,7 +111,7 @@ gth_embedded_dialog_construct (GthEmbeddedDialog *self)
 	gtk_box_pack_start (GTK_BOX (hbox_content), image, FALSE, FALSE, 0);
 	gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.5);
 
-	vbox = gtk_vbox_new (FALSE, 6);
+	vbox = gtk_vbox_new (FALSE, 0);
 	gtk_widget_show (vbox);
 	gtk_box_pack_start (GTK_BOX (hbox_content), vbox, TRUE, TRUE, 0);
 
@@ -139,17 +139,12 @@ gth_embedded_dialog_construct (GthEmbeddedDialog *self)
 
 
 GtkWidget *
-gth_embedded_dialog_new (const char *icon_stock_id,
-			 const char *primary_text,
-			 const char *secondary_text)
+gth_embedded_dialog_new (void)
 {
 	GthEmbeddedDialog *self;
 
 	self = g_object_new (GTH_TYPE_EMBEDDED_DIALOG, NULL);
 	gth_embedded_dialog_construct (self);
-	gth_embedded_dialog_set_icon (self, icon_stock_id);
-	gth_embedded_dialog_set_primary_text (self, primary_text);
-	gth_embedded_dialog_set_secondary_text (self, secondary_text);
 	
 	return (GtkWidget *) self;
 }
@@ -157,28 +152,30 @@ gth_embedded_dialog_new (const char *icon_stock_id,
 
 void
 gth_embedded_dialog_set_icon (GthEmbeddedDialog *dialog,
-			      const char        *icon_stock_id)
+			      const char        *icon_stock_id,
+			      GtkIconSize        size)
 {
 	if (icon_stock_id == NULL) {
 		gtk_widget_hide (dialog->priv->icon_image);
 		return;
 	}
 
-	gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->icon_image), icon_stock_id, GTK_ICON_SIZE_BUTTON);
+	gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->icon_image), icon_stock_id, size);
 	gtk_widget_show (dialog->priv->icon_image);
 }
 
 
 void
 gth_embedded_dialog_set_gicon (GthEmbeddedDialog *dialog,
-			       GIcon             *icon)
+			       GIcon             *icon,
+			       GtkIconSize        size)
 {
 	if (icon == NULL) {
 		gtk_widget_hide (dialog->priv->icon_image);
 		return;
 	}
 
-	gtk_image_set_from_gicon (GTK_IMAGE (dialog->priv->icon_image), icon, GTK_ICON_SIZE_BUTTON);
+	gtk_image_set_from_gicon (GTK_IMAGE (dialog->priv->icon_image), icon, size);
 	gtk_widget_show (dialog->priv->icon_image);
 }
 
diff --git a/gthumb/gth-embedded-dialog.h b/gthumb/gth-embedded-dialog.h
index e9016fb..faf3d39 100644
--- a/gthumb/gth-embedded-dialog.h
+++ b/gthumb/gth-embedded-dialog.h
@@ -51,13 +51,13 @@ struct _GthEmbeddedDialogClass
 };
 
 GType         gth_embedded_dialog_get_type           (void) G_GNUC_CONST;
-GtkWidget *   gth_embedded_dialog_new                (const char        *icon_stock_id,
-						      const char        *primary_text,
-						      const char        *secondary_text);
+GtkWidget *   gth_embedded_dialog_new                (void);
 void          gth_embedded_dialog_set_icon           (GthEmbeddedDialog *dialog,
-						      const char        *icon_stock_id);
+						      const char        *icon_stock_id,
+						      GtkIconSize        size);
 void          gth_embedded_dialog_set_gicon          (GthEmbeddedDialog *dialog,
-						      GIcon             *icon);
+						      GIcon             *icon,
+						      GtkIconSize        size);
 void          gth_embedded_dialog_set_primary_text   (GthEmbeddedDialog *dialog,
 						      const char        *primary_text);
 void          gth_embedded_dialog_set_secondary_text (GthEmbeddedDialog *dialog,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]