summaryrefslogtreecommitdiffstats
path: root/src/gs-progress-button.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/gs-progress-button.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/gs-progress-button.c b/src/gs-progress-button.c
new file mode 100644
index 0000000..ee6a855
--- /dev/null
+++ b/src/gs-progress-button.c
@@ -0,0 +1,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);
+}