[gnome-software] Make the GsAppWidget state dependant on GsAppState
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Make the GsAppWidget state dependant on GsAppState
- Date: Thu, 22 Aug 2013 17:20:24 +0000 (UTC)
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]