From 3411ddd3e6f9ee43e4eaa0c74935f1af8f36ee9d Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Sat, 12 Nov 2011 11:34:07 +0100 Subject: Initial commit --- src/customcellrendererleft.c | 127 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/customcellrendererleft.c (limited to 'src/customcellrendererleft.c') diff --git a/src/customcellrendererleft.c b/src/customcellrendererleft.c new file mode 100644 index 0000000..89184e5 --- /dev/null +++ b/src/customcellrendererleft.c @@ -0,0 +1,127 @@ +#include "common.h" + +#include "customcellrendererleft.h" + +static void custom_cell_renderer_left_get_property(GObject* object, + guint param_id, + GValue* value, + GParamSpec* pspec); +static void custom_cell_renderer_left_set_property(GObject* object, + guint param_id, + const GValue* value, + GParamSpec* pspec); + +static void convert_left_to_string(gchar* str, guint size, gint64 left); + +enum { + PROP_0, + PROP_LEFT, +}; + +G_DEFINE_TYPE(CustomCellRendererLeft, custom_cell_renderer_left, GTK_TYPE_CELL_RENDERER_TEXT) + +static void custom_cell_renderer_left_init(CustomCellRendererLeft* cell_left) +{ + convert_left_to_string(cell_left->buffer, sizeof(cell_left->buffer), + cell_left->left); + g_object_set(cell_left, "text", cell_left->buffer, NULL); +} + +static void custom_cell_renderer_left_class_init(CustomCellRendererLeftClass *cell_left_class) +{ + GObjectClass *object_class; + /* GtkCellRendererClass *cell_renderer_class; */ + + object_class = G_OBJECT_CLASS(cell_left_class); + /* cell_renderer_class = GTK_CELL_RENDERER_CLASS(cell_left_class); */ + + object_class->set_property = custom_cell_renderer_left_set_property; + object_class->get_property = custom_cell_renderer_left_get_property; + + g_object_class_install_property(object_class, + PROP_LEFT, + g_param_spec_int64("left", + "Time left", + "The time left for the transfer in seconds or -1 if unknown", + -1, + G_MAXINT64, + 0, + G_PARAM_READABLE | G_PARAM_WRITABLE)); +} + +GtkCellRenderer* custom_cell_renderer_left_new(void) +{ + return g_object_new(CUSTOM_TYPE_CELL_RENDERER_LEFT, NULL); +} + +void custom_cell_renderer_left_get_property(GObject* object, + guint param_id, + GValue* value, + GParamSpec* pspec) +{ + CustomCellRendererLeft* left = CUSTOM_CELL_RENDERER_LEFT(object); + + switch (param_id) + { + case PROP_LEFT: + g_value_set_int64(value, left->left); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); + } +} + +void custom_cell_renderer_left_set_property(GObject* object, + guint param_id, + const GValue* value, + GParamSpec* pspec) +{ + CustomCellRendererLeft* left = CUSTOM_CELL_RENDERER_LEFT(object); + gboolean changed = FALSE; + + switch (param_id) + { + case PROP_LEFT: + { + gint64 left_value = g_value_get_int64(value); + + if (left->left != left_value) + { + left->left = left_value; + changed = TRUE; + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); + } + + if (changed) + { + convert_left_to_string(left->buffer, sizeof(left->buffer), left->left); + g_object_set(left, "text", left->buffer, NULL); + } +} + +void convert_left_to_string(gchar* str, guint size, gint64 left) +{ + if (left < 0) + { + *str = '\0'; + } + else if (left < 60) + { + g_snprintf(str, size, "%02" G_GINT64_FORMAT "s", left); + } + else if (left < 60 * 60) + { + g_snprintf(str, size, "%02" G_GINT64_FORMAT "m%02" G_GINT64_FORMAT "s", + left / 60, left % 60); + } + else + { + left /= 60; + g_snprintf(str, size, "%" G_GINT64_FORMAT "h%02" G_GINT64_FORMAT "m", + left / 60, left % 60); + } +} -- cgit v1.2.3-70-g09d2