#include "common.h" #include "customcellrendererprogress.h" /* Private class member */ #define PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), \ CUSTOM_TYPE_CELL_RENDERER_PROGRESS, \ CustomCellRendererProgressPrivate)) typedef struct _CustomCellRendererProgressPrivate CustomCellRendererProgressPrivate; struct _CustomCellRendererProgressPrivate { gfloat downloaded; gfloat seeded; gchar buffer[10]; }; static void custom_cell_renderer_progress_get_property(GObject* object, guint param_id, GValue* value, GParamSpec* pspec); static void custom_cell_renderer_progress_set_property(GObject* object, guint param_id, const GValue* value, GParamSpec* pspec); static void update_progress(CustomCellRendererProgress* cell_progress, gfloat downloaded, gfloat seeded); enum { PROP_0, PROP_DOWNLOADED, PROP_SEEDED, }; G_DEFINE_TYPE(CustomCellRendererProgress, custom_cell_renderer_progress, GTK_TYPE_CELL_RENDERER_PROGRESS) static void custom_cell_renderer_progress_init(CustomCellRendererProgress* cell_progress) { update_progress(cell_progress, PRIVATE(cell_progress)->downloaded, PRIVATE(cell_progress)->seeded); } static void custom_cell_renderer_progress_class_init(CustomCellRendererProgressClass *cell_progress_class) { GObjectClass *object_class; /* GtkCellRendererClass *cell_renderer_class; */ object_class = G_OBJECT_CLASS(cell_progress_class); /* cell_renderer_class = GTK_CELL_RENDERER_CLASS(cell_progress_class); */ g_type_class_add_private(object_class, sizeof(CustomCellRendererProgressPrivate)); object_class->set_property = custom_cell_renderer_progress_set_property; object_class->get_property = custom_cell_renderer_progress_get_property; g_object_class_install_property(object_class, PROP_DOWNLOADED, g_param_spec_float("downloaded", "Percent downloaded", "Percent of torrent that has been downloaded", 0.0, 100.0, 0, G_PARAM_READABLE | G_PARAM_WRITABLE)); g_object_class_install_property(object_class, PROP_SEEDED, g_param_spec_float("seeded", "Seeded ratio", "Seeded ratio", 0.0, G_MAXFLOAT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE)); } GtkCellRenderer* custom_cell_renderer_progress_new(void) { return g_object_new(CUSTOM_TYPE_CELL_RENDERER_PROGRESS, NULL); } void custom_cell_renderer_progress_get_property(GObject* object, guint param_id, GValue* value, GParamSpec* pspec) { CustomCellRendererProgress* progress = CUSTOM_CELL_RENDERER_PROGRESS(object); switch (param_id) { case PROP_DOWNLOADED: g_value_set_float(value, PRIVATE(progress)->downloaded); break; case PROP_SEEDED: g_value_set_float(value, PRIVATE(progress)->seeded); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); } } void custom_cell_renderer_progress_set_property(GObject* object, guint param_id, const GValue* value, GParamSpec* pspec) { CustomCellRendererProgress* progress = CUSTOM_CELL_RENDERER_PROGRESS(object); gboolean changed = FALSE; switch (param_id) { case PROP_DOWNLOADED: { gfloat downloaded = g_value_get_float(value); if (PRIVATE(progress)->downloaded != downloaded) { PRIVATE(progress)->downloaded = downloaded; changed = TRUE; } break; } case PROP_SEEDED: { gfloat seeded = g_value_get_float(value); if (PRIVATE(progress)->seeded != seeded) { PRIVATE(progress)->seeded = seeded; changed = TRUE; } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); } if (changed) { update_progress(progress, PRIVATE(progress)->downloaded, PRIVATE(progress)->seeded); } } void update_progress(CustomCellRendererProgress* cell_progress, gfloat downloaded, gfloat seeded) { g_snprintf(PRIVATE(cell_progress)->buffer, sizeof(PRIVATE(cell_progress)->buffer), "%2.2f", seeded); g_object_set(cell_progress, "value", (gint)downloaded, "text", PRIVATE(cell_progress)->buffer, NULL); }