[gnome-software] gs-upgrade-banner: Add support for a pulsing progress bar
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] gs-upgrade-banner: Add support for a pulsing progress bar
- Date: Thu, 14 May 2020 15:01:42 +0000 (UTC)
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]