static gint gs_editor_flow_box_sort_cb (GtkFlowBoxChild *row1, GtkFlowBoxChild *row2, gpointer user_data) { GsAppTile *tile1 = GS_APP_TILE (gtk_bin_get_child (GTK_BIN (row1))); GsAppTile *tile2 = GS_APP_TILE (gtk_bin_get_child (GTK_BIN (row2))); return g_strcmp0 (gs_app_get_name (gs_app_tile_get_app (tile1)), gs_app_get_name (gs_app_tile_get_app (tile2))); }
static void gs_app_tile_destroy (GtkWidget *widget) { GsAppTile *tile = GS_APP_TILE (widget); GsAppTilePrivate *priv; priv = gs_app_tile_get_instance_private (tile); if (priv->app) g_signal_handlers_disconnect_by_func (priv->app, app_state_changed, tile); g_clear_object (&priv->app); GTK_WIDGET_CLASS (gs_app_tile_parent_class)->destroy (widget); }
static gboolean app_state_changed_idle (gpointer user_data) { GsAppTile *tile = GS_APP_TILE (user_data); AtkObject *accessible; GsAppTilePrivate *priv; GtkWidget *label; gboolean installed; _cleanup_free_ gchar *name = NULL; priv = gs_app_tile_get_instance_private (tile); accessible = gtk_widget_get_accessible (GTK_WIDGET (tile)); label = gtk_bin_get_child (GTK_BIN (priv->eventbox)); switch (gs_app_get_state (priv->app)) { case AS_APP_STATE_INSTALLED: case AS_APP_STATE_UPDATABLE: installed = TRUE; name = g_strdup_printf ("%s (%s)", gs_app_get_name (priv->app), _("Installed")); /* TRANSLATORS: this is the small blue label on the tile * that tells the user the application is installed */ gtk_label_set_label (GTK_LABEL (label), _("Installed")); break; case AS_APP_STATE_INSTALLING: installed = TRUE; name = g_strdup_printf ("%s (%s)", gs_app_get_name (priv->app), _("Installing")); /* TRANSLATORS: this is the small blue label on the tile * that tells the user the application is being installed */ gtk_label_set_label (GTK_LABEL (label), _("Installing")); break; case AS_APP_STATE_REMOVING: installed = TRUE; name = g_strdup_printf ("%s (%s)", gs_app_get_name (priv->app), _("Removing")); /* TRANSLATORS: this is the small blue label on the tile * that tells the user the application is being removed */ gtk_label_set_label (GTK_LABEL (label), _("Removing")); break; case AS_APP_STATE_QUEUED_FOR_INSTALL: case AS_APP_STATE_AVAILABLE: default: installed = FALSE; name = g_strdup (gs_app_get_name (priv->app)); break; } gtk_widget_set_visible (priv->eventbox, installed); if (GTK_IS_ACCESSIBLE (accessible)) { atk_object_set_name (accessible, name); atk_object_set_description (accessible, gs_app_get_summary (priv->app)); } g_object_unref (tile); return G_SOURCE_REMOVE; }
static void gs_editor_refresh_details (GsEditor *self) { AsAppKind app_kind = AS_APP_KIND_UNKNOWN; GtkWidget *widget; const gchar *css = NULL; g_autoptr(GError) error = NULL; g_autoptr(GsApp) app = NULL; /* ignore changed events */ self->is_in_refresh = TRUE; /* create a GsApp for the AsApp */ if (self->selected_item != NULL) { app = gs_editor_convert_app (self, self->selected_item); g_debug ("refreshing details for %s", gs_app_get_id (app)); } /* get kind */ if (self->selected_item != NULL) app_kind = as_app_get_kind (self->selected_item); /* feature tiles */ if (app_kind != AS_APP_KIND_OS_UPGRADE) { if (self->selected_item != NULL) { gs_app_tile_set_app (GS_APP_TILE (self->featured_tile1), app); gtk_widget_set_sensitive (self->featured_tile1, TRUE); } else { gtk_widget_set_sensitive (self->featured_tile1, FALSE); } gtk_widget_set_visible (self->featured_tile1, TRUE); } else { gtk_widget_set_visible (self->featured_tile1, FALSE); } /* upgrade banner */ if (app_kind == AS_APP_KIND_OS_UPGRADE) { if (self->selected_item != NULL) { gs_upgrade_banner_set_app (GS_UPGRADE_BANNER (self->upgrade_banner), app); gtk_widget_set_sensitive (self->upgrade_banner, TRUE); } else { gtk_widget_set_sensitive (self->upgrade_banner, FALSE); } gtk_widget_set_visible (self->upgrade_banner, TRUE); } else { gtk_widget_set_visible (self->upgrade_banner, FALSE); } /* name */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "box_name")); if (self->selected_item != NULL) { const gchar *tmp; gtk_widget_set_visible (widget, app_kind == AS_APP_KIND_OS_UPGRADE); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "entry_name")); tmp = as_app_get_name (self->selected_item, NULL); if (tmp != NULL) gtk_entry_set_text (GTK_ENTRY (widget), tmp); } else { gtk_widget_set_visible (widget, FALSE); } /* summary */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "box_summary")); if (self->selected_item != NULL) { const gchar *tmp; gtk_widget_set_visible (widget, app_kind == AS_APP_KIND_OS_UPGRADE); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "entry_summary")); tmp = as_app_get_comment (self->selected_item, NULL); if (tmp != NULL) gtk_entry_set_text (GTK_ENTRY (widget), tmp); } else { gtk_widget_set_visible (widget, FALSE); } /* kudos */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "box_kudos")); if (self->selected_item != NULL) { gtk_widget_set_visible (widget, app_kind != AS_APP_KIND_OS_UPGRADE); } else { gtk_widget_set_visible (widget, TRUE); } /* category featured */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "checkbutton_category_featured")); if (self->selected_item != NULL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), as_app_has_category (self->selected_item, "Featured")); gtk_widget_set_sensitive (widget, TRUE); } else { gtk_widget_set_sensitive (widget, FALSE); } /* kudo popular */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "checkbutton_editors_pick")); if (self->selected_item != NULL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), as_app_has_kudo (self->selected_item, "GnomeSoftware::popular")); gtk_widget_set_sensitive (widget, TRUE); } else { gtk_widget_set_sensitive (widget, FALSE); } /* featured */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "textview_css")); if (self->selected_item != NULL) { GtkTextBuffer *buffer; GtkTextIter iter_end; GtkTextIter iter_start; g_autofree gchar *css_existing = NULL; if (app_kind == AS_APP_KIND_OS_UPGRADE) { css = as_app_get_metadata_item (self->selected_item, "GnomeSoftware::UpgradeBanner-css"); } else { css = as_app_get_metadata_item (self->selected_item, "GnomeSoftware::FeatureTile-css"); } if (css == NULL) css = ""; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); gtk_text_buffer_get_bounds (buffer, &iter_start, &iter_end); css_existing = gtk_text_buffer_get_text (buffer, &iter_start, &iter_end, FALSE); if (g_strcmp0 (css_existing, css) != 0) gtk_text_buffer_set_text (buffer, css, -1); gtk_widget_set_sensitive (widget, TRUE); } else { gtk_widget_set_sensitive (widget, FALSE); } /* desktop ID */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "entry_desktop_id")); if (self->selected_item != NULL) { const gchar *id = as_app_get_id (self->selected_item); if (id == NULL) id = ""; gtk_entry_set_text (GTK_ENTRY (widget), id); gtk_widget_set_sensitive (widget, TRUE); } else { gtk_entry_set_text (GTK_ENTRY (widget), ""); gtk_widget_set_sensitive (widget, FALSE); } /* validate CSS */ if (css == NULL) { widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "label_infobar_css")); gtk_label_set_label (GTK_LABEL (widget), ""); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "infobar_css")); gtk_info_bar_set_message_type (GTK_INFO_BAR (widget), GTK_MESSAGE_OTHER); } else if (!gs_design_validate_css (self, css, &error)) { g_autofree gchar *msg = g_strdup (error->message); g_strdelimit (msg, "\n\r<>", '\0'); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "label_infobar_css")); gtk_label_set_label (GTK_LABEL (widget), msg); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "infobar_css")); gtk_info_bar_set_message_type (GTK_INFO_BAR (widget), GTK_MESSAGE_WARNING); } else { widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "label_infobar_css")); gtk_label_set_label (GTK_LABEL (widget), _("CSS validated OK!")); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "infobar_css")); gtk_info_bar_set_message_type (GTK_INFO_BAR (widget), GTK_MESSAGE_OTHER); } /* do not ignore changed events */ self->is_in_refresh = FALSE; }