diff options
author | Richard Hughes <richard@hughsie.com> | 2017-02-27 10:19:35 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2017-02-27 11:36:28 +0000 |
commit | cbf6498b64a62ef7a7d1c1472f312630ad93d4d3 (patch) | |
tree | a93d9e6576dd1bbd5b0a26db28e4febe212c4d4e | |
parent | 5767d3c3c4e9be253a4268c5c0795ab0928c0644 (diff) | |
download | appstream-glib-cbf6498b64a62ef7a7d1c1472f312630ad93d4d3.tar.gz |
Recalculate the state when formats are added or removed from a AsApp
-rw-r--r-- | libappstream-glib/as-app.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/libappstream-glib/as-app.c b/libappstream-glib/as-app.c index 4cf00d0..eedc0ee 100644 --- a/libappstream-glib/as-app.c +++ b/libappstream-glib/as-app.c @@ -2844,6 +2844,38 @@ as_app_add_permission (AsApp *app, const gchar *permission) g_ptr_array_add (priv->permissions, as_ref_string_new (permission)); } +static void +as_app_recalculate_state (AsApp *app) +{ + AsAppPrivate *priv = GET_PRIVATE (app); + gboolean is_installed = FALSE; + gboolean is_available = FALSE; + for (guint i = 0; i < priv->formats->len; i++) { + AsFormat *format = g_ptr_array_index (priv->formats, i); + switch (as_format_get_kind (format)) { + case AS_FORMAT_KIND_APPDATA: + case AS_FORMAT_KIND_DESKTOP: + case AS_FORMAT_KIND_METAINFO: + is_installed = TRUE; + break; + case AS_FORMAT_KIND_APPSTREAM: + is_available = TRUE; + break; + default: + break; + } + } + if (is_installed) { + as_app_set_state (app, AS_APP_STATE_INSTALLED); + return; + } + if (is_available) { + as_app_set_state (app, AS_APP_STATE_AVAILABLE); + return; + } + as_app_set_state (app, AS_APP_STATE_UNKNOWN); +} + /** * as_app_add_format: * @app: a #AsApp instance. @@ -2869,6 +2901,7 @@ as_app_add_format (AsApp *app, AsFormat *format) /* add */ g_ptr_array_add (priv->formats, g_object_ref (format)); + as_app_recalculate_state (app); } /** @@ -2887,6 +2920,7 @@ as_app_remove_format (AsApp *app, AsFormat *format) g_return_if_fail (AS_IS_APP (app)); g_return_if_fail (AS_IS_FORMAT (format)); g_ptr_array_remove (priv->formats, format); + as_app_recalculate_state (app); } /** |