summaryrefslogtreecommitdiff
path: root/src/customcellrendererleft.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/customcellrendererleft.c')
-rw-r--r--src/customcellrendererleft.c127
1 files changed, 127 insertions, 0 deletions
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);
+ }
+}