[libdazzle] widgets: add DzlProgressMenuButton:show-progress



commit 5adc5fe71853ed84e68719dffa25d397ee06a6bc
Author: Christian Hergert <chergert redhat com>
Date:   Thu Nov 8 11:55:54 2018 -0800

    widgets: add DzlProgressMenuButton:show-progress
    
    This property can be used to show the content-loading-symbolic image
    instead of the generated icon progress.

 src/widgets/dzl-progress-menu-button.c | 68 +++++++++++++++++++++++++++++++++-
 src/widgets/dzl-progress-menu-button.h |  5 +++
 2 files changed, 72 insertions(+), 1 deletion(-)
---
diff --git a/src/widgets/dzl-progress-menu-button.c b/src/widgets/dzl-progress-menu-button.c
index c68be0c..a3b81b6 100644
--- a/src/widgets/dzl-progress-menu-button.c
+++ b/src/widgets/dzl-progress-menu-button.c
@@ -28,6 +28,8 @@
 typedef struct
 {
   GtkMenuButton    parent_instance;
+  GtkStack        *stack;
+  GtkImage        *image;
   DzlProgressIcon *icon;
   const gchar     *theatric_icon_name;
   gdouble          progress;
@@ -41,6 +43,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (DzlProgressMenuButton, dzl_progress_menu_button, GTK
 enum {
   PROP_0,
   PROP_PROGRESS,
+  PROP_SHOW_PROGRESS,
   PROP_SHOW_THEATRIC,
   PROP_THEATRIC_ICON_NAME,
   PROP_TRANSITION_DURATION,
@@ -200,6 +203,10 @@ dzl_progress_menu_button_get_property (GObject    *object,
       g_value_set_double (value, priv->progress);
       break;
 
+    case PROP_SHOW_PROGRESS:
+      g_value_set_boolean (value, dzl_progress_menu_button_get_show_progress (self));
+      break;
+
     case PROP_SHOW_THEATRIC:
       g_value_set_boolean (value, priv->show_theatric);
       break;
@@ -232,6 +239,10 @@ dzl_progress_menu_button_set_property (GObject      *object,
       dzl_progress_menu_button_set_progress (self, g_value_get_double (value));
       break;
 
+    case PROP_SHOW_PROGRESS:
+      dzl_progress_menu_button_set_show_progress (self, g_value_get_boolean (value));
+      break;
+
     case PROP_SHOW_THEATRIC:
       dzl_progress_menu_button_set_show_theatric (self, g_value_get_double (value));
       break;
@@ -264,6 +275,13 @@ dzl_progress_menu_button_class_init (DzlProgressMenuButtonClass *klass)
                          0.0, 1.0, 0.0,
                          (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
 
+  properties [PROP_SHOW_PROGRESS] =
+    g_param_spec_boolean ("show-progress",
+                          "Show Progress",
+                          "Show progress instead of image",
+                          TRUE,
+                          (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
   properties [PROP_SHOW_THEATRIC] =
     g_param_spec_boolean ("show-theatric",
                           "Show Theatric",
@@ -299,6 +317,16 @@ dzl_progress_menu_button_init (DzlProgressMenuButton *self)
   priv->show_theatric = TRUE;
   priv->transition_duration = 750;
 
+  priv->stack = g_object_new (GTK_TYPE_STACK,
+                              "homogeneous", FALSE,
+                              "visible", TRUE,
+                              NULL);
+  g_signal_connect (priv->stack,
+                    "destroy",
+                    G_CALLBACK (gtk_widget_destroyed),
+                    &priv->stack);
+  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->stack));
+
   priv->icon = g_object_new (DZL_TYPE_PROGRESS_ICON,
                              "visible", TRUE,
                              NULL);
@@ -306,7 +334,17 @@ dzl_progress_menu_button_init (DzlProgressMenuButton *self)
                     "destroy",
                     G_CALLBACK (gtk_widget_destroyed),
                     &priv->icon);
-  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->icon));
+  gtk_container_add (GTK_CONTAINER (priv->stack), GTK_WIDGET (priv->icon));
+
+  priv->image = g_object_new (GTK_TYPE_IMAGE,
+                              "icon-name", "content-loading-symbolic",
+                              "visible", TRUE,
+                              NULL);
+  g_signal_connect (priv->image,
+                    "destroy",
+                    G_CALLBACK (gtk_widget_destroyed),
+                    &priv->image);
+  gtk_container_add (GTK_CONTAINER (priv->stack), GTK_WIDGET (priv->image));
 }
 
 /**
@@ -329,3 +367,31 @@ dzl_progress_menu_button_reset_theatrics (DzlProgressMenuButton *self)
 
   priv->suppress_theatric = FALSE;
 }
+
+gboolean
+dzl_progress_menu_button_get_show_progress (DzlProgressMenuButton *self)
+{
+  DzlProgressMenuButtonPrivate *priv = dzl_progress_menu_button_get_instance_private (self);
+
+  g_return_val_if_fail (DZL_IS_PROGRESS_MENU_BUTTON (self), FALSE);
+
+  return gtk_stack_get_visible_child (priv->stack) == GTK_WIDGET (priv->icon);
+}
+
+void
+dzl_progress_menu_button_set_show_progress (DzlProgressMenuButton *self,
+                                            gboolean               show_progress)
+{
+  DzlProgressMenuButtonPrivate *priv = dzl_progress_menu_button_get_instance_private (self);
+
+  g_return_if_fail (DZL_IS_PROGRESS_MENU_BUTTON (self));
+
+  if (show_progress != dzl_progress_menu_button_get_show_progress (self))
+    {
+      if (show_progress)
+        gtk_stack_set_visible_child (priv->stack, GTK_WIDGET (priv->icon));
+      else
+        gtk_stack_set_visible_child (priv->stack, GTK_WIDGET (priv->image));
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SHOW_PROGRESS]);
+    }
+}
diff --git a/src/widgets/dzl-progress-menu-button.h b/src/widgets/dzl-progress-menu-button.h
index c3ef499..826a259 100644
--- a/src/widgets/dzl-progress-menu-button.h
+++ b/src/widgets/dzl-progress-menu-button.h
@@ -54,6 +54,11 @@ void       dzl_progress_menu_button_set_show_theatric (DzlProgressMenuButton *se
                                                        gboolean               show_theatic);
 DZL_AVAILABLE_IN_ALL
 void       dzl_progress_menu_button_reset_theatrics   (DzlProgressMenuButton *self);
+DZL_AVAILABLE_IN_3_32
+gboolean   dzl_progress_menu_button_get_show_progress (DzlProgressMenuButton *self);
+DZL_AVAILABLE_IN_3_32
+void       dzl_progress_menu_button_set_show_progress (DzlProgressMenuButton *self,
+                                                       gboolean               show_progress);
 
 G_END_DECLS
 


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