]> spindle.queued.net Git - midori/commitdiff
Show estimated time remaining in transferbar tooltip
authorPaweł Forysiuk <tuxator@o2.pl>
Wed, 20 Apr 2011 18:52:07 +0000 (20:52 +0200)
committerChristian Dywan <christian@twotoasts.de>
Wed, 20 Apr 2011 18:52:07 +0000 (20:52 +0200)
midori/sokoke.c
midori/sokoke.h
toolbars/midori-transferbar.c

index ac617f681365e00ac110256762ba3ab4692ac7cb..39b0a4d9f984d33125fe51b67b97a82aa81d4fee 100644 (file)
@@ -2208,3 +2208,82 @@ sokoke_build_thumbnail_path (const gchar* name)
     }
     return path;
 }
+
+gchar*
+midori_download_prepare_tooltip_text (WebKitDownload* download)
+{
+    gdouble* last_time;
+    guint64* last_size;
+    gint hour = 3600, min = 60;
+    gint hours_left, minutes_left, seconds_left;
+    guint64 total_size = webkit_download_get_total_size (download);
+    guint64 current_size  = webkit_download_get_current_size (download);
+    gdouble time_elapsed = webkit_download_get_elapsed_time (download);
+    gdouble time_estimated, time_diff;
+    gchar* current, *total, *download_speed;
+    gchar* hours_str, *minutes_str, *seconds_str;
+    GString* tooltip = g_string_new (NULL);
+
+    time_diff = time_elapsed / current_size;
+    time_estimated = (total_size - current_size) * time_diff;
+
+    hours_left = time_estimated / hour;
+    minutes_left = (time_estimated - (hours_left * hour)) / min;
+    seconds_left = (time_estimated - (hours_left * hour) - (minutes_left * min));
+
+    hours_str = g_strdup_printf (ngettext ("%d hour", "%d hours", hours_left), hours_left);
+    minutes_str = g_strdup_printf (ngettext ("%d minute", "%d minutes", minutes_left), minutes_left);
+    seconds_str = g_strdup_printf (ngettext ("%d second", "%d seconds", seconds_left), seconds_left);
+
+    current = g_format_size_for_display (current_size);
+    total = g_format_size_for_display (total_size);
+    last_time = g_object_get_data (G_OBJECT (download), "last-time");
+    last_size = g_object_get_data (G_OBJECT (download), "last-size");
+
+    /* i18n: Download tooltip (size): 4KB of 43MB */
+    g_string_append_printf (tooltip, _("%s of %s"), current, total);
+    g_free (current);
+    g_free (total);
+
+    if (time_elapsed != *last_time)
+        download_speed = g_format_size_for_display (
+                (current_size - *last_size) / (time_elapsed - *last_time));
+    else
+        /* i18n: Unknown number of bytes, used for transfer rate like ?B/s */
+        download_speed = g_strdup (_("?B"));
+
+    /* i18n: Download tooltip (transfer rate): (130KB/s) */
+    g_string_append_printf (tooltip, _(" (%s/s)"), download_speed);
+    g_free (download_speed);
+
+    if (time_estimated > 0)
+    {
+        gchar* eta;
+        if (hours_left > 0)
+            eta = g_strdup_printf ("%s, %s", hours_str, minutes_str);
+        else if (minutes_left >= 10)
+            eta = g_strdup_printf ("%s", minutes_str);
+        else if (minutes_left < 10 && minutes_left > 0)
+            eta = g_strdup_printf ("%s, %s", minutes_str, seconds_str);
+        else if (seconds_left > 0)
+            eta = g_strdup_printf ("%s", seconds_str);
+        else
+            eta = g_strdup ("");
+        /* i18n: Download tooltip (estimated time) : - 1 hour, 5 minutes remaning */
+        g_string_append_printf (tooltip, _(" - %s remaining"), eta);
+        g_free (eta);
+    }
+
+    g_free (hours_str);
+    g_free (seconds_str);
+    g_free (minutes_str);
+
+    if (time_elapsed - *last_time > 5.0)
+    {
+        *last_time = time_elapsed;
+        *last_size = current_size;
+    }
+
+    return g_string_free (tooltip, FALSE);
+}
+
index 976fe91fa8c5c6430a416dc04bdfa2ef1b64dc7f..ffe3058fbc5ca1ba2c90bf10f9ab582e7afdcd67 100644 (file)
@@ -286,4 +286,7 @@ sokoke_widget_copy_clipboard (GtkWidget*   widget,
 gchar*
 sokoke_build_thumbnail_path (const gchar* name);
 
+gchar*
+midori_download_prepare_tooltip_text (WebKitDownload* download);
+
 #endif /* !__SOKOKE_H__ */
index 6b1de4c0092d05264d6a3ed2fa717326e67a707f..7b7ec3dce9626650dc1df2ad5fdde1bf82e28f1b 100644 (file)
@@ -75,14 +75,8 @@ midori_transferbar_download_notify_progress_cb (WebKitDownload* download,
                                                 GParamSpec*     pspec,
                                                 GtkWidget*      progress)
 {
-    gchar* current;
-    gchar* total;
-    gchar* size_text;
+    gchar* tooltip;
     gchar* text;
-    gchar* transfer;
-    gdouble* last_time;
-    guint64* last_size;
-    gdouble timestamp;
     guint64 size;
 
     gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress),
@@ -96,31 +90,12 @@ midori_transferbar_download_notify_progress_cb (WebKitDownload* download,
         return;
     }
 
-    current = g_format_size_for_display (webkit_download_get_current_size (download));
-    total = g_format_size_for_display (webkit_download_get_total_size (download));
-    last_time = g_object_get_data (G_OBJECT (download), "last-time");
-    last_size = g_object_get_data (G_OBJECT (download), "last-size");
-    timestamp = webkit_download_get_elapsed_time (download);
-    if (timestamp != *last_time)
-        transfer = g_format_size_for_display ((size - *last_size) / (timestamp - *last_time));
-    else
-        /* i18n: Unknown number of bytes, used for transfer rate like ?B/s */
-        transfer = g_strdup (_("?B"));
-    /* i18n: Download tooltip, 4KB of 43MB, 130KB/s */
-    size_text = g_strdup_printf (_("%s of %s, %s/s"), current, total, transfer);
-    if (timestamp - *last_time > 5.0)
-    {
-        *last_time = timestamp;
-        *last_size = size;
-    }
-    g_free (current);
-    g_free (total);
-    text = g_strdup_printf ("%s (%s)",
-        gtk_progress_bar_get_text (GTK_PROGRESS_BAR (progress)),
-        size_text);
+    tooltip = midori_download_prepare_tooltip_text (download);
+    text = g_strdup_printf ("%s\n%s",
+        gtk_progress_bar_get_text (GTK_PROGRESS_BAR (progress)), tooltip);
     gtk_widget_set_tooltip_text (progress, text);
-    g_free (size_text);
-    g_free (transfer);
+
+    g_free (tooltip);
     g_free (text);
 }