1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
* vi:set noexpandtab tabstop=8 shiftwidth=8:
*
* Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
* Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include "config.h"
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include "gs-popular-tile.h"
#include "gs-star-widget.h"
#include "gs-common.h"
struct _GsPopularTile
{
GsAppTile parent_instance;
GtkWidget *label;
GtkWidget *image;
GtkWidget *eventbox;
GtkWidget *stack;
GtkWidget *stars;
GtkCssProvider *tile_provider; /* (owned) (nullable) */
};
G_DEFINE_TYPE (GsPopularTile, gs_popular_tile, GS_TYPE_APP_TILE)
static void
gs_popular_tile_dispose (GObject *object)
{
GsPopularTile *tile = GS_POPULAR_TILE (object);
g_clear_object (&tile->tile_provider);
G_OBJECT_CLASS (gs_popular_tile_parent_class)->dispose (object);
}
static void
gs_popular_tile_refresh (GsAppTile *self)
{
GsPopularTile *tile = GS_POPULAR_TILE (self);
GsApp *app = gs_app_tile_get_app (self);
AtkObject *accessible;
gboolean installed;
g_autofree gchar *name = NULL;
const gchar *css;
if (app == NULL)
return;
accessible = gtk_widget_get_accessible (GTK_WIDGET (tile));
switch (gs_app_get_state (app)) {
case AS_APP_STATE_INSTALLED:
case AS_APP_STATE_REMOVING:
case AS_APP_STATE_UPDATABLE:
case AS_APP_STATE_UPDATABLE_LIVE:
installed = TRUE;
/* TRANSLATORS: this refers to an app (by name) that is installed */
name = g_strdup_printf (_("%s (Installed)"),
gs_app_get_name (app));
break;
case AS_APP_STATE_AVAILABLE:
case AS_APP_STATE_INSTALLING:
default:
installed = FALSE;
name = g_strdup (gs_app_get_name (app));
break;
}
gtk_widget_set_visible (tile->eventbox, installed);
if (GTK_IS_ACCESSIBLE (accessible)) {
atk_object_set_name (accessible, name);
atk_object_set_description (accessible, gs_app_get_summary (app));
}
gtk_widget_set_sensitive (tile->stars, gs_app_get_rating (app) >= 0);
gs_star_widget_set_rating (GS_STAR_WIDGET (tile->stars),
gs_app_get_rating (app));
gtk_stack_set_visible_child_name (GTK_STACK (tile->stack), "content");
/* perhaps set custom css */
css = gs_app_get_metadata_item (app, "GnomeSoftware::PopularTile-css");
gs_utils_widget_set_css (GTK_WIDGET (tile), &tile->tile_provider, "popular-tile", css);
if (gs_app_get_pixbuf (app) != NULL) {
gs_image_set_from_pixbuf (GTK_IMAGE (tile->image), gs_app_get_pixbuf (app));
} else {
gtk_image_set_from_icon_name (GTK_IMAGE (tile->image),
"application-x-executable",
GTK_ICON_SIZE_DIALOG);
}
gtk_label_set_label (GTK_LABEL (tile->label), gs_app_get_name (app));
}
static void
gs_popular_tile_init (GsPopularTile *tile)
{
gtk_widget_set_has_window (GTK_WIDGET (tile), FALSE);
gtk_widget_init_template (GTK_WIDGET (tile));
}
static void
gs_popular_tile_class_init (GsPopularTileClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GsAppTileClass *app_tile_class = GS_APP_TILE_CLASS (klass);
object_class->dispose = gs_popular_tile_dispose;
app_tile_class->refresh = gs_popular_tile_refresh;
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-popular-tile.ui");
gtk_widget_class_bind_template_child (widget_class, GsPopularTile, label);
gtk_widget_class_bind_template_child (widget_class, GsPopularTile, image);
gtk_widget_class_bind_template_child (widget_class, GsPopularTile, eventbox);
gtk_widget_class_bind_template_child (widget_class, GsPopularTile, stack);
gtk_widget_class_bind_template_child (widget_class, GsPopularTile, stars);
}
GtkWidget *
gs_popular_tile_new (GsApp *app)
{
GsPopularTile *tile = g_object_new (GS_TYPE_POPULAR_TILE, NULL);
if (app != NULL)
gs_app_tile_set_app (GS_APP_TILE (tile), app);
return GTK_WIDGET (tile);
}
|