[gnome-software] gs-upgrade-banner: Add support for a pulsing progress bar



commit 0f0ee3098956c5125bffe7731cfb87fd046fafdb
Author: Philip Withnall <withnall endlessm com>
Date:   Thu May 14 13:43:31 2020 +0100

    gs-upgrade-banner: Add support for a pulsing progress bar
    
    If the progress is unknown, display a pulsing progress bar like in
    `GsDetailsPage`.
    
    Signed-off-by: Philip Withnall <withnall endlessm com>
    Helps: #276

 src/gs-upgrade-banner.c | 44 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 41 insertions(+), 3 deletions(-)
---
diff --git a/src/gs-upgrade-banner.c b/src/gs-upgrade-banner.c
index 8abe1d43..eef19a63 100644
--- a/src/gs-upgrade-banner.c
+++ b/src/gs-upgrade-banner.c
@@ -27,6 +27,7 @@ typedef struct
        GtkWidget       *label_upgrades_title;
        GtkWidget       *label_upgrades_warning;
        GtkWidget       *progressbar;
+       guint            progress_pulse_id;
 } GsUpgradeBannerPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GsUpgradeBanner, gs_upgrade_banner, GTK_TYPE_BIN)
@@ -41,6 +42,28 @@ enum {
 
 static guint signals [SIGNAL_LAST] = { 0 };
 
+static gboolean
+_pulse_cb (gpointer user_data)
+{
+       GsUpgradeBanner *self = GS_UPGRADE_BANNER (user_data);
+       GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self);
+
+       gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progressbar));
+
+       return G_SOURCE_CONTINUE;
+}
+
+static void
+stop_progress_pulsing (GsUpgradeBanner *self)
+{
+       GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self);
+
+       if (priv->progress_pulse_id != 0) {
+               g_source_remove (priv->progress_pulse_id);
+               priv->progress_pulse_id = 0;
+       }
+}
+
 static void
 gs_upgrade_banner_refresh (GsUpgradeBanner *self)
 {
@@ -49,6 +72,7 @@ gs_upgrade_banner_refresh (GsUpgradeBanner *self)
        g_autofree gchar *name_bold = NULL;
        g_autofree gchar *version_bold = NULL;
        g_autofree gchar *str = NULL;
+       guint percentage;
 
        if (priv->app == NULL)
                return;
@@ -165,12 +189,24 @@ gs_upgrade_banner_refresh (GsUpgradeBanner *self)
        /* do a fill bar for the current progress */
        switch (gs_app_get_state (priv->app)) {
        case AS_APP_STATE_INSTALLING:
-               gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progressbar),
-                                              (gdouble) gs_app_get_progress (priv->app) / 100.0f);
-               gtk_widget_show (priv->progressbar);
+               percentage = gs_app_get_progress (priv->app);
+               if (percentage == GS_APP_PROGRESS_UNKNOWN) {
+                       if (priv->progress_pulse_id == 0)
+                               priv->progress_pulse_id = g_timeout_add (50, _pulse_cb, self);
+
+                       gtk_widget_set_visible (priv->progressbar, TRUE);
+                       break;
+               } else if (percentage <= 100) {
+                       stop_progress_pulsing (self);
+                       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progressbar),
+                                                      (gdouble) percentage / 100.f);
+                       gtk_widget_set_visible (priv->progressbar, TRUE);
+                       break;
+               }
                break;
        default:
                gtk_widget_hide (priv->progressbar);
+               stop_progress_pulsing (self);
                break;
        }
 }
@@ -268,6 +304,8 @@ gs_upgrade_banner_destroy (GtkWidget *widget)
        GsUpgradeBanner *self = GS_UPGRADE_BANNER (widget);
        GsUpgradeBannerPrivate *priv = gs_upgrade_banner_get_instance_private (self);
 
+       stop_progress_pulsing (self);
+
        if (priv->app) {
                g_signal_handlers_disconnect_by_func (priv->app, app_state_changed, self);
                g_signal_handlers_disconnect_by_func (priv->app, app_progress_changed, self);


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