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
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
* vi:set noexpandtab tabstop=8 shiftwidth=8:
*
* Copyright (C) 2013-2014 Richard Hughes <richard@hughsie.com>
* Copyright (C) 2015 Kalev Lember <klember@redhat.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include "config.h"
#include "gs-app.h"
#include "gs-progress-button.h"
struct _GsProgressButton
{
GtkButton parent_instance;
GtkCssProvider *css_provider;
};
G_DEFINE_TYPE (GsProgressButton, gs_progress_button, GTK_TYPE_BUTTON)
void
gs_progress_button_set_progress (GsProgressButton *button, guint percentage)
{
g_autofree gchar *css = NULL;
if (percentage == GS_APP_PROGRESS_UNKNOWN) {
g_warning ("FIXME: Unknown progress handling is not yet implemented for GsProgressButton");
percentage = 0;
}
if (percentage == 0)
css = g_strdup (".install-progress { background-size: 0; }");
else if (percentage == 100)
css = g_strdup (".install-progress { background-size: 100%; }");
else
css = g_strdup_printf (".install-progress { background-size: %u%%; }", percentage);
gtk_css_provider_load_from_data (button->css_provider, css, -1, NULL);
}
void
gs_progress_button_set_show_progress (GsProgressButton *button, gboolean show_progress)
{
GtkStyleContext *context;
context = gtk_widget_get_style_context (GTK_WIDGET (button));
if (show_progress)
gtk_style_context_add_class (context, "install-progress");
else
gtk_style_context_remove_class (context, "install-progress");
}
static void
gs_progress_button_dispose (GObject *object)
{
GsProgressButton *button = GS_PROGRESS_BUTTON (object);
g_clear_object (&button->css_provider);
G_OBJECT_CLASS (gs_progress_button_parent_class)->dispose (object);
}
static void
gs_progress_button_init (GsProgressButton *button)
{
button->css_provider = gtk_css_provider_new ();
gtk_style_context_add_provider (gtk_widget_get_style_context (GTK_WIDGET (button)),
GTK_STYLE_PROVIDER (button->css_provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
}
static void
gs_progress_button_class_init (GsProgressButtonClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = gs_progress_button_dispose;
}
GtkWidget *
gs_progress_button_new (void)
{
return g_object_new (GS_TYPE_PROGRESS_BUTTON, NULL);
}
|