#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); } }