Re: PATCH: use timeouts for progress dialogs



> @@ -400,7 +436,10 @@ nautilus_file_operations_progress_new_fi
>         char *progress_count;
>  
>         g_return_if_fail (NAUTILUS_IS_FILE_OPERATIONS_PROGRESS
> (progress));
> -       g_return_if_fail (GTK_WIDGET_REALIZED (progress));
> +
> +       if (!GTK_WIDGET_REALIZED (progress)) {
> +               return;
> +       }
> 
> Should this be here? 

I dunno, not sure why the return_if_fail was there in the first place.
I've removed it.

> Somewhere in here you should probably update start_time, in case a pause
> happens twice before the timeout happens (it's not likely, but you
> should probably take care of it anyway).

Done. Also changed it so that start_time is first set when the timeout
is created in _new(), not in _init().

- Frank
Index: libnautilus-private/nautilus-file-operations.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations.c,v
retrieving revision 1.153
diff -u -p -r1.153 nautilus-file-operations.c
--- libnautilus-private/nautilus-file-operations.c	12 Jul 2002 18:36:13 -0000	1.153
+++ libnautilus-private/nautilus-file-operations.c	6 Aug 2002 02:20:12 -0000
@@ -73,7 +73,6 @@ typedef struct {
 	GnomeVFSXferOverwriteMode overwrite_mode;
 	GtkWidget *parent_view;
 	TransferKind kind;
-	gboolean show_progress_dialog;
 	void (* done_callback) (GHashTable *debuting_uris, gpointer data);
 	gpointer done_callback_data;
 	GHashTable *debuting_uris;
@@ -280,14 +279,10 @@ static void
 create_transfer_dialog (const GnomeVFSXferProgressInfo *progress_info,
 			TransferInfo *transfer_info)
 {
-	if (!transfer_info->show_progress_dialog) {
-		return;
-	}
-
 	g_return_if_fail (transfer_info->progress_dialog == NULL);
 
 	transfer_info->progress_dialog = nautilus_file_operations_progress_new 
-		(transfer_info->operation_title, "", "", "", 0, 0);
+		(transfer_info->operation_title, "", "", "", 0, 0, TRUE);
 
 	/* Treat clicking on the close box or use of the escape key
 	 * the same as clicking cancel.
@@ -307,8 +302,6 @@ create_transfer_dialog (const GnomeVFSXf
 			GTK_WINDOW (transfer_info->progress_dialog), 
 			GTK_WINDOW (gtk_widget_get_toplevel (transfer_info->parent_view)));
 	}
-
-	gtk_widget_show (GTK_WIDGET (transfer_info->progress_dialog));
 }
 
 static void
@@ -800,6 +793,9 @@ handle_transfer_vfs_error (const GnomeVF
 
 		/* transfer error, prompt the user to continue or stop */
 
+		/* stop timeout while waiting for user */
+		nautilus_file_operations_progress_pause_timeout (transfer_info->progress_dialog);
+
 		formatted_source_name = NULL;
 		formatted_target_name = NULL;
 
@@ -958,6 +954,8 @@ handle_transfer_vfs_error (const GnomeVF
 		g_free (formatted_source_name);
 		g_free (formatted_target_name);
 
+		nautilus_file_operations_progress_resume_timeout (transfer_info->progress_dialog);
+
 		return error_dialog_result;
 
 	case GNOME_VFS_XFER_ERROR_MODE_ABORT:
@@ -999,6 +997,8 @@ handle_transfer_overwrite (const GnomeVF
 	int result;
 	char *text, *formatted_name;
 
+	nautilus_file_operations_progress_pause_timeout (transfer_info->progress_dialog);	
+
 	/* Handle special case files such as Trash, mount links and home directory */	
 	if (is_special_link (progress_info->target_name)) {
 		formatted_name = extract_and_ellipsize_file_name_for_dialog
@@ -1025,6 +1025,8 @@ handle_transfer_overwrite (const GnomeVF
 		g_free (text);
 		g_free (formatted_name);
 
+		nautilus_file_operations_progress_resume_timeout (transfer_info->progress_dialog);
+
 		return GNOME_VFS_XFER_OVERWRITE_ACTION_SKIP;
 	}
 	
@@ -1044,6 +1046,9 @@ handle_transfer_overwrite (const GnomeVF
 			(parent_for_error_dialog (transfer_info), TRUE, text, 
 			 _("Conflict while copying"),
 			 _("Replace"), _("Skip"), NULL);
+			 
+		nautilus_file_operations_progress_resume_timeout (transfer_info->progress_dialog);
+					 
 		switch (result) {
 		case 0:
 			return GNOME_VFS_XFER_OVERWRITE_ACTION_REPLACE;
@@ -1059,6 +1064,8 @@ handle_transfer_overwrite (const GnomeVF
 			 _("Conflict while copying"),
 			 _("Replace All"), _("Replace"), _("Skip"), NULL);
 
+		nautilus_file_operations_progress_resume_timeout (transfer_info->progress_dialog);
+
 		switch (result) {
 		case 0:
 			return GNOME_VFS_XFER_OVERWRITE_ACTION_REPLACE_ALL;
@@ -1688,7 +1695,6 @@ nautilus_file_operations_copy_move (cons
 	gboolean target_is_trash;
 	gboolean is_desktop_trash_link;
 	gboolean duplicate;
-	gboolean all_local;
 	
 	IconPositionIterator *icon_position_iterator;
 
@@ -1712,7 +1718,6 @@ nautilus_file_operations_copy_move (cons
 	 */
 	source_uri_list = NULL;
 	target_uri_list = NULL;
-	all_local = TRUE;
 	duplicate = copy_action != GDK_ACTION_MOVE;
 	for (p = item_uris; p != NULL; p = p->next) {
 		/* Filter out special Nautilus link files */
@@ -1750,11 +1755,6 @@ nautilus_file_operations_copy_move (cons
 			target_uri_list = g_list_prepend (target_uri_list, target_uri);
 			source_uri_list = g_list_prepend (source_uri_list, source_uri);
 
-			if (all_local && (!gnome_vfs_uri_is_local (source_uri)
-					  || !gnome_vfs_uri_is_local (target_uri))) {
-				all_local = FALSE;
-			}
-
 			if (duplicate
 			    && !gnome_vfs_uri_equal (source_dir_uri, target_dir_uri)) {
 				duplicate = FALSE;
@@ -1823,11 +1823,6 @@ nautilus_file_operations_copy_move (cons
 
 		transfer_info->kind = TRANSFER_MOVE_TO_TRASH;
 
-		/* Do an arbitrary guess that an operation will take very little
-		 * time and the progress shouldn't be shown.
-		 */
-		transfer_info->show_progress_dialog = 
-			!all_local || g_list_length ((GList *) item_uris) > 20;
 	} else if ((move_options & GNOME_VFS_XFER_REMOVESOURCE) != 0) {
 		/* localizers: progress dialog title */
 		transfer_info->operation_title = _("Moving files");
@@ -1840,11 +1835,6 @@ nautilus_file_operations_copy_move (cons
 
 		transfer_info->kind = TRANSFER_MOVE;
 
-		/* Do an arbitrary guess that an operation will take very little
-		 * time and the progress shouldn't be shown.
-		 */
-		transfer_info->show_progress_dialog = 
-			!all_local || g_list_length ((GList *) item_uris) > 20;
 	} else if ((move_options & GNOME_VFS_XFER_LINK_ITEMS) != 0) {
 		/* when creating links, handle name conflicts automatically */
 		move_options |= GNOME_VFS_XFER_USE_UNIQUE_NAMES;
@@ -1858,8 +1848,7 @@ nautilus_file_operations_copy_move (cons
 		transfer_info->cleanup_name = _("Finishing Creating Links...");
 
 		transfer_info->kind = TRANSFER_LINK;
-		transfer_info->show_progress_dialog =
-			g_list_length ((GList *)item_uris) > 20;
+
 	} else {
 		/* localizers: progress dialog title */
 		transfer_info->operation_title = _("Copying files");
@@ -1871,8 +1860,6 @@ nautilus_file_operations_copy_move (cons
 		transfer_info->cleanup_name = "";
 
 		transfer_info->kind = TRANSFER_COPY;
-		/* always show progress during copy */
-		transfer_info->show_progress_dialog = TRUE;
 	}
 
 	/* we'll need to check for copy into Trash and for moving/copying the Trash itself */
@@ -2140,7 +2127,6 @@ nautilus_file_operations_delete (const G
 	uri_list = g_list_reverse (uri_list);
 
 	transfer_info = transfer_info_new (parent_view);
-	transfer_info->show_progress_dialog = TRUE;
 
 	/* localizers: progress dialog title */
 	transfer_info->operation_title = _("Deleting files");
@@ -2176,7 +2162,6 @@ do_empty_trash (GtkWidget *parent_view)
 	if (trash_dir_list != NULL) {
 		/* set up the move parameters */
 		transfer_info = transfer_info_new (parent_view);
-		transfer_info->show_progress_dialog = TRUE;
 
 		/* localizers: progress dialog title */
 		transfer_info->operation_title = _("Emptying the Trash");
Index: libnautilus-private/nautilus-file-operations-progress.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations-progress.c,v
retrieving revision 1.36
diff -u -p -r1.36 nautilus-file-operations-progress.c
--- libnautilus-private/nautilus-file-operations-progress.c	17 Apr 2002 12:29:10 -0000	1.36
+++ libnautilus-private/nautilus-file-operations-progress.c	6 Aug 2002 02:20:12 -0000
@@ -55,6 +55,8 @@
 
 #define MINIMUM_TIME_UP    1000
 
+#define SHOW_TIMEOUT	   1200
+
 static GdkPixbuf *empty_jar_pixbuf, *full_jar_pixbuf;
 
 static void nautilus_file_operations_progress_class_init (NautilusFileOperationsProgressClass *klass);
@@ -83,10 +85,17 @@ struct NautilusFileOperationsProgressDet
 	gulong files_total;
 	gulong bytes_total;
 
-	/* system time (microseconds) when dialog was mapped */
+	/* system time (microseconds) when show timeout was started */
 	gint64 start_time;
 
+	/* system time (microseconds) when dialog was mapped */
+	gint64 show_time;
+	
+	/* time remaining in show timeout if it's paused and resumed */
+	guint remaining_time;
+
 	guint delayed_close_timeout_id;
+	guint delayed_show_timeout_id;
 
 	int progress_jar_position;
 };
@@ -124,7 +133,7 @@ static void
 nautilus_file_operations_progress_update (NautilusFileOperationsProgress *progress)
 {
 	double fraction;
-	
+
 	if (progress->details->bytes_total == 0) {
 		/* We haven't set up the file count yet, do not update
 		 * the progress bar until we do.
@@ -191,6 +200,11 @@ nautilus_file_operations_progress_destro
 		progress->details->delayed_close_timeout_id = 0;
 	}
 	
+	if (progress->details->delayed_show_timeout_id != 0) {
+		g_source_remove (progress->details->delayed_show_timeout_id);
+		progress->details->delayed_show_timeout_id = 0;
+	}
+	
 	EEL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object));
 }
 
@@ -228,7 +242,7 @@ map_callback (GtkWidget *widget)
 
 	EEL_CALL_PARENT (GTK_WIDGET_CLASS, map, (widget));
 
-	progress->details->start_time = eel_get_system_time ();
+	progress->details->show_time = eel_get_system_time ();
 }
 
 static gboolean
@@ -335,13 +349,28 @@ nautilus_file_operations_progress_class_
 	
 }
 
+static gboolean
+delayed_show_callback (gpointer callback_data)
+{
+	NautilusFileOperationsProgress *progress;
+	
+	progress = NAUTILUS_FILE_OPERATIONS_PROGRESS (callback_data);
+	
+	progress->details->delayed_show_timeout_id = 0;
+	
+	gtk_widget_show (GTK_WIDGET (progress));
+	
+	return FALSE;
+}
+
 NautilusFileOperationsProgress *
 nautilus_file_operations_progress_new (const char *title,
 				       const char *operation_string,
 				       const char *from_prefix,
 				       const char *to_prefix,
 				       gulong total_files,
-				       gulong total_bytes)
+				       gulong total_bytes,
+				       gboolean use_timeout)
 {
 	GtkWidget *widget;
 	NautilusFileOperationsProgress *progress;
@@ -359,6 +388,12 @@ nautilus_file_operations_progress_new (c
 
 	progress->details->from_prefix = from_prefix;
 	progress->details->to_prefix = to_prefix;
+
+	if (use_timeout) {
+		progress->details->start_time = eel_get_system_time ();	
+		progress->details->delayed_show_timeout_id =
+			g_timeout_add (SHOW_TIMEOUT, delayed_show_callback, progress);
+	}
 	
 	return progress;
 }
@@ -400,7 +435,6 @@ nautilus_file_operations_progress_new_fi
 	char *progress_count;
 
 	g_return_if_fail (NAUTILUS_IS_FILE_OPERATIONS_PROGRESS (progress));
-	g_return_if_fail (GTK_WIDGET_REALIZED (progress));
 
 	progress->details->from_prefix = from_prefix;
 	progress->details->to_prefix = to_prefix;
@@ -485,7 +519,7 @@ nautilus_file_operations_progress_done (
 	g_assert (progress->details->start_time != 0);
 
 	/* compute time up in milliseconds */
-	time_up = (eel_get_system_time () - progress->details->start_time) / 1000;
+	time_up = (eel_get_system_time () - progress->details->show_time) / 1000;
 	if (time_up >= MINIMUM_TIME_UP) {
 		gtk_object_destroy (GTK_OBJECT (progress));
 		return;
@@ -498,4 +532,48 @@ nautilus_file_operations_progress_done (
 		(MINIMUM_TIME_UP - time_up,
 		 delayed_close_callback,
 		 progress);
+}
+
+void
+nautilus_file_operations_progress_pause_timeout (NautilusFileOperationsProgress *progress)
+{
+	guint time_up;
+
+	if (progress->details->delayed_show_timeout_id == 0) {
+		progress->details->remaining_time = 0;
+		return;
+	}
+	
+	time_up = (eel_get_system_time () - progress->details->start_time) / 1000;
+	
+	if (time_up >= SHOW_TIMEOUT) {
+		progress->details->remaining_time = 0;
+		return;
+	}
+	
+	g_source_remove (progress->details->delayed_show_timeout_id);
+	progress->details->delayed_show_timeout_id = 0;
+	progress->details->remaining_time = SHOW_TIMEOUT - time_up;
+}
+
+void
+nautilus_file_operations_progress_resume_timeout (NautilusFileOperationsProgress *progress)
+{
+	if (progress->details->delayed_show_timeout_id != 0) {
+		return;
+	}
+	
+	if (progress->details->remaining_time <= 0) {
+		return;
+	}
+	
+	progress->details->delayed_show_timeout_id =
+		g_timeout_add (progress->details->remaining_time,
+			       delayed_show_callback,
+			       progress);
+			       
+	progress->details->start_time = eel_get_system_time () - 
+			1000 * (SHOW_TIMEOUT - progress->details->remaining_time);
+					
+	progress->details->remaining_time = 0;
 }
Index: libnautilus-private/nautilus-file-operations-progress.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations-progress.h,v
retrieving revision 1.10
diff -u -p -r1.10 nautilus-file-operations-progress.h
--- libnautilus-private/nautilus-file-operations-progress.h	27 Nov 2001 01:46:16 -0000	1.10
+++ libnautilus-private/nautilus-file-operations-progress.h	6 Aug 2002 02:20:12 -0000
@@ -55,7 +55,8 @@ NautilusFileOperationsProgress *nautilus
 											const char                     *from_prefix,
 											const char                     *to_prefix,
 											gulong                          files_total,
-											gulong                          bytes_total);
+											gulong                          bytes_total,
+											gboolean			use_timeout);
 void                            nautilus_file_operations_progress_done                 (NautilusFileOperationsProgress *dialog);
 void                            nautilus_file_operations_progress_set_progress_title   (NautilusFileOperationsProgress *dialog,
 											const char                     *progress_title);
@@ -77,5 +78,7 @@ void                            nautilus
 void                            nautilus_file_operations_progress_update_sizes         (NautilusFileOperationsProgress *dialog,
 											gulong                          bytes_done_in_file,
 											gulong                          bytes_done);
+void				nautilus_file_operations_progress_pause_timeout	       (NautilusFileOperationsProgress *progress);
+void				nautilus_file_operations_progress_resume_timeout       (NautilusFileOperationsProgress *progress);
 
 #endif /* NAUTILUS_FILE_OPERATIONS_PROGRESS_H */


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