[gnome-software] Make the GsAppWidget state dependant on GsAppState



commit 0c805dd677662c7043320b0ed3071428564b08b4
Author: Richard Hughes <richard hughsie com>
Date:   Thu Aug 22 18:16:07 2013 +0100

    Make the GsAppWidget state dependant on GsAppState
    
    This allows you to call gs_app_set_state() and for the widget to DTRT.

 src/gs-app-widget.c                |  360 +++++++++++++++++-------------------
 src/gs-app-widget.h                |   21 +--
 src/gs-app.c                       |   18 ++-
 src/gs-app.h                       |    2 +
 src/gs-main.c                      |    7 +-
 src/gs-plugin-loader.c             |    1 +
 src/gs-shell-installed.c           |    4 -
 src/gs-shell-updates.c             |   12 +-
 src/plugins/gs-plugin-packagekit.c |    3 +-
 9 files changed, 197 insertions(+), 231 deletions(-)
---
diff --git a/src/gs-app-widget.c b/src/gs-app-widget.c
index 8099ddd..419a41a 100644
--- a/src/gs-app-widget.c
+++ b/src/gs-app-widget.c
@@ -31,8 +31,6 @@ struct _GsAppWidgetPrivate
 {
        ChMarkdown      *markdown;
        GsApp           *app;
-       gchar           *status;
-       GsAppWidgetKind  kind;
        GtkWidget       *widget_button;
        GtkWidget       *widget_description1;
        GtkWidget       *widget_description2;
@@ -65,7 +63,7 @@ gs_app_widget_refresh (GsAppWidget *app_widget)
 {
        GsAppWidgetPrivate *priv = app_widget->priv;
        GtkStyleContext *context;
-        GtkWidget *box;
+       GtkWidget *box;
 
        if (app_widget->priv->app == NULL)
                return;
@@ -74,9 +72,9 @@ gs_app_widget_refresh (GsAppWidget *app_widget)
                             gs_app_get_name (priv->app));
        gtk_label_set_label (GTK_LABEL (priv->widget_version),
                             gs_app_get_version (priv->app));
-        if (gs_app_get_pixbuf (priv->app))
-               gtk_image_set_from_pixbuf (GTK_IMAGE (priv->widget_image),
-                                          gs_app_get_pixbuf (priv->app));
+       if (gs_app_get_pixbuf (priv->app))
+               gtk_image_set_from_pixbuf (GTK_IMAGE (priv->widget_image),
+                                          gs_app_get_pixbuf (priv->app));
        gtk_widget_set_visible (priv->widget_name, TRUE);
        gtk_widget_set_visible (priv->widget_version, TRUE);
        gtk_widget_set_visible (priv->widget_image, TRUE);
@@ -88,59 +86,46 @@ gs_app_widget_refresh (GsAppWidget *app_widget)
        gtk_style_context_remove_class (context, "destructive-action");
        gtk_style_context_remove_class (context, "suggested-action");
 
-       switch (app_widget->priv->kind) {
-       case GS_APP_WIDGET_KIND_INSTALL:
+       switch (gs_app_get_state (app_widget->priv->app)) {
+       case GS_APP_STATE_AVAILABLE:
                gtk_widget_set_visible (priv->widget_spinner, FALSE);
                gtk_widget_set_visible (priv->widget_button, TRUE);
                gtk_button_set_label (GTK_BUTTON (priv->widget_button), _("Install"));
                gtk_style_context_add_class (context, "suggested-action");
                break;
-       case GS_APP_WIDGET_KIND_REMOVE:
+       case GS_APP_STATE_INSTALLED:
                gtk_widget_set_visible (priv->widget_spinner, FALSE);
                gtk_widget_set_visible (priv->widget_button, TRUE);
                gtk_button_set_label (GTK_BUTTON (priv->widget_button), _("Remove"));
                gtk_style_context_add_class (context, "destructive-action");
                break;
-       case GS_APP_WIDGET_KIND_UPDATE:
+       case GS_APP_STATE_UPDATABLE:
                gtk_widget_set_visible (priv->widget_spinner, FALSE);
                gtk_widget_set_visible (priv->widget_button, FALSE);
                gtk_button_set_label (GTK_BUTTON (priv->widget_button), _("Update"));
                gtk_style_context_add_class (context, "suggested-action");
                break;
-       case GS_APP_WIDGET_KIND_BUSY:
+       case GS_APP_STATE_INSTALLING:
                gtk_spinner_start (GTK_SPINNER (priv->widget_spinner));
                gtk_widget_set_visible (priv->widget_spinner, TRUE);
                gtk_widget_set_visible (priv->widget_button, TRUE);
                gtk_widget_set_sensitive (priv->widget_button, FALSE);
-               gtk_button_set_label (GTK_BUTTON (priv->widget_button), priv->status);
+               gtk_button_set_label (GTK_BUTTON (priv->widget_button), _("Installing"));
+               break;
+       case GS_APP_STATE_REMOVING:
+               gtk_spinner_start (GTK_SPINNER (priv->widget_spinner));
+               gtk_widget_set_visible (priv->widget_spinner, TRUE);
+               gtk_widget_set_visible (priv->widget_button, TRUE);
+               gtk_widget_set_sensitive (priv->widget_button, FALSE);
+               gtk_button_set_label (GTK_BUTTON (priv->widget_button), _("Removing"));
                break;
        default:
                gtk_widget_set_visible (priv->widget_button, FALSE);
                break;
        }
-        box = gtk_widget_get_parent (priv->widget_button);
-        gtk_widget_set_visible (box, gtk_widget_get_visible (priv->widget_spinner) ||
-                                     gtk_widget_get_visible (priv->widget_button));
-}
-
-/**
- * gs_app_widget_get_status:
- **/
-const gchar *
-gs_app_widget_get_status (GsAppWidget *app_widget)
-{
-       g_return_val_if_fail (GS_IS_APP_WIDGET (app_widget), NULL);
-       return app_widget->priv->status;
-}
-
-/**
- * gs_app_widget_get_kind:
- **/
-GsAppWidgetKind
-gs_app_widget_get_kind (GsAppWidget *app_widget)
-{
-       g_return_val_if_fail (GS_IS_APP_WIDGET (app_widget), 0);
-       return app_widget->priv->kind;
+       box = gtk_widget_get_parent (priv->widget_button);
+       gtk_widget_set_visible (box, gtk_widget_get_visible (priv->widget_spinner) ||
+                                    gtk_widget_get_visible (priv->widget_button));
 }
 
 static guint
@@ -155,26 +140,26 @@ _g_string_replace (GString *string, const gchar *search, const gchar *replace)
        replace_len = strlen (replace);
 
        do {
-               tmp = g_strstr_len (string->str, -1, search);
-               if (tmp == NULL)
-                       goto out;
-
-               /* reallocate the string if required */
-               if (search_len > replace_len) {
-                       g_string_erase (string,
-                                       tmp - string->str,
--                                       search_len - replace_len);
-               }
-               if (search_len < replace_len) {
-                       g_string_insert_len (string,
-                                            tmp - string->str,
-                                            search,
-                                            replace_len - search_len);
-               }
-
-               /* just memcmp in the new string */
-               memcpy (tmp, replace, replace_len);
-               cnt++;
+              tmp = g_strstr_len (string->str, -1, search);
+              if (tmp == NULL)
+                      goto out;
+
+              /* reallocate the string if required */
+              if (search_len > replace_len) {
+                      g_string_erase (string,
+                                      tmp - string->str,
+-                                     search_len - replace_len);
+              }
+              if (search_len < replace_len) {
+                      g_string_insert_len (string,
+                                           tmp - string->str,
+                                           search,
+                                           replace_len - search_len);
+              }
+
+              /* just memcmp in the new string */
+              memcpy (tmp, replace, replace_len);
+              cnt++;
        } while (TRUE);
 out:
        return cnt;
@@ -190,39 +175,28 @@ gs_app_widget_get_app (GsAppWidget *app_widget)
        return app_widget->priv->app;
 }
 
-/**
- * gs_app_widget_set_app:
- **/
-void
-gs_app_widget_set_app (GsAppWidget *app_widget, GsApp *app)
-{
-       g_return_if_fail (GS_IS_APP_WIDGET (app_widget));
-       g_return_if_fail (GS_IS_APP (app));
-       app_widget->priv->app = g_object_ref (app);
-       gs_app_widget_refresh (app_widget);
-}
 
 /**
- * gs_app_widget_set_status:
+ * gs_app_widget_app_state_changed_cb:
  **/
-void
-gs_app_widget_set_status (GsAppWidget *app_widget, const gchar *status)
+static void
+gs_app_widget_app_state_changed_cb (GsApp *app, GsAppWidget *app_widget)
 {
-       g_return_if_fail (GS_IS_APP_WIDGET (app_widget));
-       g_return_if_fail (status != NULL);
-       g_free (app_widget->priv->status);
-       app_widget->priv->status = g_strdup (status);
        gs_app_widget_refresh (app_widget);
 }
 
 /**
- * gs_app_widget_set_kind:
+ * gs_app_widget_set_app:
  **/
 void
-gs_app_widget_set_kind (GsAppWidget *app_widget, GsAppWidgetKind kind)
+gs_app_widget_set_app (GsAppWidget *app_widget, GsApp *app)
 {
        g_return_if_fail (GS_IS_APP_WIDGET (app_widget));
-       app_widget->priv->kind = kind;
+       g_return_if_fail (GS_IS_APP (app));
+       app_widget->priv->app = g_object_ref (app);
+       g_signal_connect (app_widget->priv->app, "state-changed",
+                         G_CALLBACK (gs_app_widget_app_state_changed_cb),
+                         app_widget);
        gs_app_widget_refresh (app_widget);
 }
 
@@ -235,8 +209,6 @@ gs_app_widget_destroy (GtkWidget *object)
        GsAppWidget *app_widget = GS_APP_WIDGET (object);
        GsAppWidgetPrivate *priv = app_widget->priv;
 
-       g_free (priv->status);
-       priv->status = NULL;
        if (priv->markdown != NULL)
                g_clear_object (&priv->markdown);
        if (priv->app != NULL)
@@ -279,114 +251,114 @@ gs_app_widget_button_clicked_cb (GtkWidget *widget, GsAppWidget *app_widget)
 
 static void
 break_lines (PangoContext *context,
-             const gchar *text, const gchar *end,
-             gint width,
-             gchar **line1, gchar **line2, gchar **line3)
+            const gchar *text, const gchar *end,
+            gint width,
+            gchar **line1, gchar **line2, gchar **line3)
 {
-        PangoLayout *layout;
-        PangoLayoutIter *iter;
-        gchar *tmp;
-        gchar *p, *p2, *r;
-        gint i2 = 0, i3 = 0, i4 = 0;
-        gint lines;
-
-        layout = pango_layout_new (context);
-        pango_layout_set_width (layout, width * PANGO_SCALE);
-        pango_layout_set_wrap (layout, PANGO_WRAP_WORD);
-
-        tmp = g_strconcat (text, end, NULL);
-        pango_layout_set_text (layout, tmp, -1);
-        g_free (tmp);
-
-        lines = pango_layout_get_line_count (layout);
-
-        iter = pango_layout_get_iter (layout);
-        if (pango_layout_iter_next_line (iter))
-                i2 = pango_layout_iter_get_index (iter);
-        else
-                goto out;
-        if (pango_layout_iter_next_line (iter))
-                i3 = pango_layout_iter_get_index (iter);
-        else
-                goto out;
-        if (pango_layout_iter_next_line (iter))
-                i4 = pango_layout_iter_get_index (iter);
-        else
-                goto out;
-        pango_layout_iter_free (iter);
-
-        p = (gchar *)text + i4;
-        while (text <= p && pango_layout_get_line_count (layout) > 3) {
-                p = g_utf8_prev_char (p);
-                r = g_strndup (text, p - text);
-                p2 = g_strconcat (r, "...", end, NULL);
-                pango_layout_set_text (layout, p2, -1);
-                g_free (p2);
-                g_free (r);
-        }
+       PangoLayout *layout;
+       PangoLayoutIter *iter;
+       gchar *tmp;
+       gchar *p, *p2, *r;
+       gint i2 = 0, i3 = 0, i4 = 0;
+       gint lines;
+
+       layout = pango_layout_new (context);
+       pango_layout_set_width (layout, width * PANGO_SCALE);
+       pango_layout_set_wrap (layout, PANGO_WRAP_WORD);
+
+       tmp = g_strconcat (text, end, NULL);
+       pango_layout_set_text (layout, tmp, -1);
+       g_free (tmp);
+
+       lines = pango_layout_get_line_count (layout);
+
+       iter = pango_layout_get_iter (layout);
+       if (pango_layout_iter_next_line (iter))
+               i2 = pango_layout_iter_get_index (iter);
+       else
+               goto out;
+       if (pango_layout_iter_next_line (iter))
+               i3 = pango_layout_iter_get_index (iter);
+       else
+               goto out;
+       if (pango_layout_iter_next_line (iter))
+               i4 = pango_layout_iter_get_index (iter);
+       else
+               goto out;
+       pango_layout_iter_free (iter);
+
+       p = (gchar *)text + i4;
+       while (text <= p && pango_layout_get_line_count (layout) > 3) {
+               p = g_utf8_prev_char (p);
+               r = g_strndup (text, p - text);
+               p2 = g_strconcat (r, "...", end, NULL);
+               pango_layout_set_text (layout, p2, -1);
+               g_free (p2);
+               g_free (r);
+       }
 
 out:
-        g_object_unref (layout);
-
-        if (lines == 1) {
-                *line1 = g_strdup (text);
-                *line2 = NULL;
-                *line3 = NULL;
-        }
-        else if (lines == 2) {
-                i2 = MIN (i2, (gint)strlen (text));
-                *line1 = g_strndup (text, i2);
-                *line2 = g_strdup (text + i2);
-                *line3 = NULL;
-        }
-        else {
-                i2 = MIN (i2, (gint)strlen (text));
-                i3 = MIN (i3, (gint)strlen (text));
-                *line1 = g_strndup (text, i2);
-                *line2 = g_strndup (text + i2, i3 - i2);
-                *line3 = g_strdup (text + i3);
-        }
+       g_object_unref (layout);
+
+       if (lines == 1) {
+               *line1 = g_strdup (text);
+               *line2 = NULL;
+               *line3 = NULL;
+       }
+       else if (lines == 2) {
+               i2 = MIN (i2, (gint)strlen (text));
+               *line1 = g_strndup (text, i2);
+               *line2 = g_strdup (text + i2);
+               *line3 = NULL;
+       }
+       else {
+               i2 = MIN (i2, (gint)strlen (text));
+               i3 = MIN (i3, (gint)strlen (text));
+               *line1 = g_strndup (text, i2);
+               *line2 = g_strndup (text + i2, i3 - i2);
+               *line3 = g_strdup (text + i3);
+       }
 }
 
 static void
 size_allocate_cb (GtkWidget     *box,
-                  GtkAllocation *allocation,
-                  GsAppWidget   *app_widget)
+                 GtkAllocation *allocation,
+                 GsAppWidget   *app_widget)
 {
-        gchar *tmp;
-        gchar *line1, *line2, *line3;
-        GString *s = NULL;
+       gchar *tmp;
+       gchar *line1, *line2, *line3;
+       GString *s = NULL;
 
        tmp = (gchar *)gs_app_get_description (app_widget->priv->app);
        if (tmp == NULL) {
                tmp = _("The author of this software has not included a long description.");
-        }
-        else {
-                s = g_string_new (tmp);
-                _g_string_replace (s, "\n", " ");
-                tmp = s->str;
-        }
-
-        break_lines (gtk_widget_get_pango_context (box),
-                     tmp, _("Read More"), allocation->width,
-                     &line1, &line2, &line3);
-
-        gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description1), line1);
-        gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description2), line2);
-        gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description3), line3);
-
-        if (s)
-                g_string_free (s, TRUE);
+       }
+       else {
+               s = g_string_new (tmp);
+               _g_string_replace (s, "\n", " ");
+               tmp = s->str;
+       }
+
+       break_lines (gtk_widget_get_pango_context (box),
+                    tmp, _("Read More"), allocation->width,
+                    &line1, &line2, &line3);
+
+       gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description1), line1);
+       gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description2), line2);
+       gtk_label_set_label (GTK_LABEL (app_widget->priv->widget_description3), line3);
+
+       if (s)
+               g_string_free (s, TRUE);
 }
 
 static gboolean
 read_more_cb (GtkLabel    *widget,
-              const gchar *uri,
-              GsAppWidget *app_widget)
+             const gchar *uri,
+             GsAppWidget *app_widget)
 {
        g_signal_emit (app_widget, signals[SIGNAL_READ_MORE_CLICKED], 0);
 
-        return TRUE;
+       return TRUE;
 }
 
 /**
@@ -397,7 +369,7 @@ gs_app_widget_init (GsAppWidget *app_widget)
 {
        GsAppWidgetPrivate *priv;
        GtkWidget *box, *box2;
-        gchar *tmp;
+       gchar *tmp;
        PangoAttrList *attr_list;
 
        g_return_if_fail (GS_IS_APP_WIDGET (app_widget));
@@ -409,12 +381,12 @@ gs_app_widget_init (GsAppWidget *app_widget)
 
        /* set defaults */
        gtk_box_set_spacing (GTK_BOX (app_widget), 3);
-        g_object_set (app_widget, "margin", 9, NULL);
+       g_object_set (app_widget, "margin", 9, NULL);
 
        /* pixbuf */
        priv->widget_image = gtk_image_new_from_icon_name ("missing-image",
                                                           GTK_ICON_SIZE_DIALOG);
-        gtk_image_set_pixel_size (GTK_IMAGE (priv->widget_image), 64);
+       gtk_image_set_pixel_size (GTK_IMAGE (priv->widget_image), 64);
 
        gtk_widget_set_margin_right (priv->widget_image, 9);
        gtk_widget_set_valign (priv->widget_image, GTK_ALIGN_START);
@@ -443,36 +415,36 @@ gs_app_widget_init (GsAppWidget *app_widget)
 
        /* description */
        box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-        gtk_widget_set_hexpand (box, TRUE);
-        gtk_widget_set_halign (box, GTK_ALIGN_FILL);
+       gtk_widget_set_hexpand (box, TRUE);
+       gtk_widget_set_halign (box, GTK_ALIGN_FILL);
        priv->widget_description1 = gtk_label_new (NULL);
        gtk_misc_set_alignment (GTK_MISC (priv->widget_description1), 0.0, 0.5);
        gtk_label_set_ellipsize (GTK_LABEL (priv->widget_description1), PANGO_ELLIPSIZE_END);
-        gtk_container_add (GTK_CONTAINER (box), priv->widget_description1);
+       gtk_container_add (GTK_CONTAINER (box), priv->widget_description1);
        priv->widget_description2 = gtk_label_new (NULL);
        gtk_misc_set_alignment (GTK_MISC (priv->widget_description2), 0.0, 0.5);
        gtk_label_set_ellipsize (GTK_LABEL (priv->widget_description2), PANGO_ELLIPSIZE_END);
-        gtk_container_add (GTK_CONTAINER (box), priv->widget_description2);
-        box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+       gtk_container_add (GTK_CONTAINER (box), priv->widget_description2);
+       box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
        gtk_box_pack_start (GTK_BOX (box), box2, TRUE, TRUE, 0);
        priv->widget_description3 = gtk_label_new (NULL);
        gtk_misc_set_alignment (GTK_MISC (priv->widget_description3), 0.0, 0.5);
        gtk_label_set_ellipsize (GTK_LABEL (priv->widget_description3), PANGO_ELLIPSIZE_END);
-        gtk_widget_set_size_request (priv->widget_description3, 100, -1);
-        gtk_container_add (GTK_CONTAINER (box2), priv->widget_description3);
-        priv->widget_read_more = gtk_label_new (NULL);
-        g_signal_connect (priv->widget_read_more, "activate-link",
-                          G_CALLBACK (read_more_cb), app_widget);
-        tmp = g_markup_printf_escaped ("<a href=''>%s</a>", _("Read More"));
-        gtk_label_set_markup (GTK_LABEL (priv->widget_read_more), tmp);
-        g_free (tmp);
-        gtk_misc_set_alignment (GTK_MISC (priv->widget_read_more), 1, 0.5);
-        gtk_widget_set_halign (priv->widget_read_more, GTK_ALIGN_END);
-        gtk_box_pack_start (GTK_BOX (box2), priv->widget_read_more, TRUE, TRUE, 0);
+       gtk_widget_set_size_request (priv->widget_description3, 100, -1);
+       gtk_container_add (GTK_CONTAINER (box2), priv->widget_description3);
+       priv->widget_read_more = gtk_label_new (NULL);
+       g_signal_connect (priv->widget_read_more, "activate-link",
+                         G_CALLBACK (read_more_cb), app_widget);
+       tmp = g_markup_printf_escaped ("<a href=''>%s</a>", _("Read More"));
+       gtk_label_set_markup (GTK_LABEL (priv->widget_read_more), tmp);
+       g_free (tmp);
+       gtk_misc_set_alignment (GTK_MISC (priv->widget_read_more), 1, 0.5);
+       gtk_widget_set_halign (priv->widget_read_more, GTK_ALIGN_END);
+       gtk_box_pack_start (GTK_BOX (box2), priv->widget_read_more, TRUE, TRUE, 0);
 
        gtk_box_pack_start (GTK_BOX (app_widget), box, TRUE, TRUE, 0);
-        g_signal_connect (box, "size-allocate", G_CALLBACK (size_allocate_cb), app_widget);
-        gtk_widget_show_all (box);
+       g_signal_connect (box, "size-allocate", G_CALLBACK (size_allocate_cb), app_widget);
+       gtk_widget_show_all (box);
 
 
        /* button */
@@ -507,15 +479,15 @@ gs_app_widget_init (GsAppWidget *app_widget)
 
 void
 gs_app_widget_set_size_groups (GsAppWidget  *app_widget,
-                               GtkSizeGroup *image,
-                               GtkSizeGroup *name)
+                              GtkSizeGroup *image,
+                              GtkSizeGroup *name)
 {
-        GtkWidget *box;
+       GtkWidget *box;
 
-        gtk_size_group_add_widget (image, app_widget->priv->widget_image);
+       gtk_size_group_add_widget (image, app_widget->priv->widget_image);
 
-        box = gtk_widget_get_parent (app_widget->priv->widget_name);
-        gtk_size_group_add_widget (name, box);
+       box = gtk_widget_get_parent (app_widget->priv->widget_name);
+       gtk_size_group_add_widget (name, box);
 }
 
 /**
diff --git a/src/gs-app-widget.h b/src/gs-app-widget.h
index 881ecb3..0235f55 100644
--- a/src/gs-app-widget.h
+++ b/src/gs-app-widget.h
@@ -54,29 +54,14 @@ struct _GsAppWidgetClass
        void                    (*read_more_clicked)    (GsAppWidget    *app_widget);
 };
 
-typedef enum {
-       GS_APP_WIDGET_KIND_INSTALL,
-       GS_APP_WIDGET_KIND_UPDATE,
-       GS_APP_WIDGET_KIND_REMOVE,
-       GS_APP_WIDGET_KIND_BUSY,
-       GS_APP_WIDGET_KIND_BLANK,
-       GS_APP_WIDGET_KIND_LAST
-} GsAppWidgetKind;
-
 GType           gs_app_widget_get_type                 (void);
 GtkWidget      *gs_app_widget_new                      (void);
 GsApp          *gs_app_widget_get_app                  (GsAppWidget    *app_widget);
 void            gs_app_widget_set_app                  (GsAppWidget    *app_widget,
                                                         GsApp          *app);
-const gchar    *gs_app_widget_get_status               (GsAppWidget    *app_widget);
-void            gs_app_widget_set_status               (GsAppWidget    *app_widget,
-                                                        const gchar    *status);
-GsAppWidgetKind         gs_app_widget_get_kind                 (GsAppWidget    *app_widget);
-void            gs_app_widget_set_kind                 (GsAppWidget    *app_widget,
-                                                        GsAppWidgetKind kind);
-void             gs_app_widget_set_size_groups          (GsAppWidget    *app_widget,
-                                                         GtkSizeGroup   *image,
-                                                         GtkSizeGroup   *name);
+void            gs_app_widget_set_size_groups          (GsAppWidget    *app_widget,
+                                                        GtkSizeGroup   *image,
+                                                        GtkSizeGroup   *name);
 
 G_END_DECLS
 
diff --git a/src/gs-app.c b/src/gs-app.c
index 3fdf1e7..88cdf6c 100644
--- a/src/gs-app.c
+++ b/src/gs-app.c
@@ -35,7 +35,7 @@ struct GsAppPrivate
        gchar                   *summary;
        gchar                   *description;
        gchar                   *screenshot;
-        gchar                   *url;
+        gchar                  *url;
        gint                     rating;
        GsAppKind                kind;
        GsAppState               state;
@@ -62,6 +62,13 @@ enum {
 
 G_DEFINE_TYPE (GsApp, gs_app, G_TYPE_OBJECT)
 
+enum {
+       SIGNAL_STATE_CHANGED,
+       SIGNAL_LAST
+};
+
+static guint signals [SIGNAL_LAST] = { 0 };
+
 /**
  * gs_app_error_quark:
  * Return value: Our personal error quark.
@@ -115,8 +122,8 @@ void
 gs_app_set_state (GsApp *app, GsAppState state)
 {
        g_return_if_fail (GS_IS_APP (app));
-       g_return_if_fail (app->priv->state == GS_APP_STATE_UNKNOWN);
        app->priv->state = state;
+       g_signal_emit (app, signals[SIGNAL_STATE_CHANGED], 0);
 }
 
 /**
@@ -590,6 +597,13 @@ gs_app_class_init (GsAppClass *klass)
                                   G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
        g_object_class_install_property (object_class, PROP_STATE, pspec);
 
+       signals [SIGNAL_STATE_CHANGED] =
+               g_signal_new ("state-changed",
+                             G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
+                             G_STRUCT_OFFSET (GsAppClass, state_changed),
+                             NULL, NULL, g_cclosure_marshal_VOID__VOID,
+                             G_TYPE_NONE, 0);
+
        g_type_class_add_private (klass, sizeof (GsAppPrivate));
 }
 
diff --git a/src/gs-app.h b/src/gs-app.h
index 567d7df..e0cd3e3 100644
--- a/src/gs-app.h
+++ b/src/gs-app.h
@@ -46,6 +46,7 @@ typedef struct
 typedef struct
 {
        GObjectClass             parent_class;
+       void                    (*state_changed)        (GsApp          *app);
 } GsAppClass;
 
 typedef enum {
@@ -68,6 +69,7 @@ typedef enum {
        GS_APP_STATE_AVAILABLE,
        GS_APP_STATE_INSTALLING,
        GS_APP_STATE_REMOVING,
+       GS_APP_STATE_UPDATABLE,
        GS_APP_STATE_LAST
 } GsAppState;
 
diff --git a/src/gs-main.c b/src/gs-main.c
index cb6fecd..0b0565c 100644
--- a/src/gs-main.c
+++ b/src/gs-main.c
@@ -112,7 +112,6 @@ gs_main_progress_cb (PkProgress *progress,
 //                     app_widget = gs_main_get_app_widget_for_id (priv->list_box_installed,
 //                                                                 pk_item_progress_get_package_id 
(item_progress));
 //                     if (app_widget != NULL) {
-//                             gs_app_widget_set_kind (app_widget, GS_APP_WIDGET_KIND_BUSY);
 //                             gs_app_widget_set_status (app_widget, pk_status_enum_to_string (status));
 //                     }
                }
@@ -347,12 +346,10 @@ gs_main_app_widget_button_clicked_cb (GsAppWidget *app_widget, GsMainPrivate *pr
        data->package_id = package_id;
        data->priv = priv;
 
-       if (kind == GS_APP_WIDGET_KIND_UPDATE) {
-       } else if (kind == GS_APP_WIDGET_KIND_INSTALL) {
+       if (kind == GS_APP_STATE_UPDATE) {
+       } else if (kind == GS_APP_STATE_INSTALL) {
                g_debug ("install %s", package_id);
                to_array[0] = package_id;
-               gs_app_widget_set_kind (app_widget, GS_APP_WIDGET_KIND_BUSY);
-               gs_app_widget_set_status (app_widget, "Installing");
                pk_task_install_packages_async (priv->task,
                                                (gchar**)to_array,
                                                priv->cancellable,
diff --git a/src/gs-plugin-loader.c b/src/gs-plugin-loader.c
index 603bd6c..ec6fef6 100644
--- a/src/gs-plugin-loader.c
+++ b/src/gs-plugin-loader.c
@@ -330,6 +330,7 @@ cd_plugin_loader_get_updates_thread_cb (GSimpleAsyncResult *res,
                /* create new meta object */
                app = gs_app_new ("os-update");
                gs_app_set_kind (app, GS_APP_KIND_OS_UPDATE);
+               gs_app_set_state (app, GS_APP_STATE_UPDATABLE);
                gs_app_set_name (app, _("OS Updates"));
                gs_app_set_summary (app, _("Includes performance, stability and security improvements for all 
users."));
                gs_app_set_description (app, _("Includes performance, stability and security improvements for 
all users."));
diff --git a/src/gs-shell-installed.c b/src/gs-shell-installed.c
index 4a9ae3c..8620e55 100644
--- a/src/gs-shell-installed.c
+++ b/src/gs-shell-installed.c
@@ -184,7 +184,6 @@ gs_shell_installed_app_remove_cb (GsAppWidget *app_widget,
        response = gtk_dialog_run (GTK_DIALOG (dialog));
        if (response == GTK_RESPONSE_OK) {
                g_debug ("remove %s", gs_app_get_id (app));
-               gs_app_widget_set_status (app_widget, "Removing");
                gs_plugin_loader_app_remove (priv->plugin_loader,
                                             app,
                                             NULL); /* cancellable */
@@ -228,9 +227,6 @@ gs_shell_installed_get_installed_cb (GObject *source_object,
                g_signal_connect (widget, "read-more-clicked",
                                  G_CALLBACK (gs_shell_installed_app_widget_read_more_clicked_cb),
                                  shell_installed);
-
-               gs_app_widget_set_kind (GS_APP_WIDGET (widget),
-                                       gs_app_get_kind (app) == GS_APP_KIND_SYSTEM ? 
GS_APP_WIDGET_KIND_BLANK : GS_APP_WIDGET_KIND_REMOVE);
                gs_app_widget_set_app (GS_APP_WIDGET (widget), app);
                gtk_container_add (GTK_CONTAINER (priv->list_box_installed), widget);
                gs_app_widget_set_size_groups (GS_APP_WIDGET (widget),
diff --git a/src/gs-shell-updates.c b/src/gs-shell-updates.c
index 3dd0bb9..817111c 100644
--- a/src/gs-shell-updates.c
+++ b/src/gs-shell-updates.c
@@ -26,7 +26,7 @@
 #include "gs-app-widget.h"
 
 static void    gs_shell_updates_finalize       (GObject        *object);
-static void     show_update_details             (GsAppWidget *app_widget, GsShellUpdates *shell_updates);
+static void     show_update_details         (GsAppWidget *app_widget, GsShellUpdates *shell_updates);
 
 #define GS_SHELL_UPDATES_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GS_TYPE_SHELL_UPDATES, 
GsShellUpdatesPrivate))
 
@@ -109,10 +109,8 @@ gs_shell_updates_get_updates_cb (GsPluginLoader *plugin_loader,
                app = GS_APP (l->data);
                g_debug ("adding update %s", gs_app_get_id (app));
                widget = gs_app_widget_new ();
-                g_signal_connect (widget, "read-more-clicked",
-                                  G_CALLBACK (show_update_details), shell_updates);
-               gs_app_widget_set_kind (GS_APP_WIDGET (widget),
-                                       GS_APP_WIDGET_KIND_UPDATE);
+               g_signal_connect (widget, "read-more-clicked",
+                                 G_CALLBACK (show_update_details), shell_updates);
                gs_app_widget_set_app (GS_APP_WIDGET (widget), app);
                gtk_container_add (GTK_CONTAINER (priv->list_box_updates), widget);
                gtk_widget_show (widget);
@@ -304,7 +302,7 @@ gs_shell_updates_activated_cb (GtkListBox *list_box,
 {
        GsAppWidget *app_widget = GS_APP_WIDGET (gtk_bin_get_child (GTK_BIN (row)));
 
-        show_update_details (app_widget, shell_updates);
+       show_update_details (app_widget, shell_updates);
 }
 
 /**
@@ -427,7 +425,7 @@ gs_shell_updates_setup (GsShellUpdates *shell_updates,
                          G_CALLBACK (gs_shell_updates_button_close_cb),
                          shell_updates);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "dialog_update"));
-        g_signal_connect (widget, "delete-event",
+       g_signal_connect (widget, "delete-event",
                          G_CALLBACK (gtk_widget_hide_on_delete),
                          shell_updates);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_update_back"));
diff --git a/src/plugins/gs-plugin-packagekit.c b/src/plugins/gs-plugin-packagekit.c
index ada17c1..796e8d1 100644
--- a/src/plugins/gs-plugin-packagekit.c
+++ b/src/plugins/gs-plugin-packagekit.c
@@ -174,6 +174,7 @@ gs_plugin_packagekit_add_installed_results (GsPlugin *plugin,
        for (i = 0; i < array->len; i++) {
                package = g_ptr_array_index (array, i);
                app = gs_app_new (pk_package_get_id (package));
+               gs_app_set_state (app, GS_APP_STATE_INSTALLED);
                gs_app_set_metadata (app,
                                     "package-id",
                                     pk_package_get_id (package));
@@ -297,7 +298,7 @@ gs_plugin_packagekit_add_updates_results (GsPlugin *plugin,
                gs_app_set_metadata (app, "update-details", update_text);
                gs_app_set_name (app, split[PK_PACKAGE_ID_NAME]);
                gs_app_set_version (app, split[PK_PACKAGE_ID_VERSION]);
-               gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+               gs_app_set_state (app, GS_APP_STATE_UPDATABLE);
                gs_app_set_kind (app, GS_APP_KIND_PACKAGE);
                gs_plugin_add_app (list, app);
                g_free (package_id);


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