diff options
| author | Joel Klinghed <the_jk@yahoo.com> | 2011-11-12 11:34:07 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@yahoo.com> | 2011-11-12 11:34:07 +0100 |
| commit | 3411ddd3e6f9ee43e4eaa0c74935f1af8f36ee9d (patch) | |
| tree | 5c4b1e34b8f7268096282c6376baaef1f2b966f6 /src/customcellrendererprogress.c | |
Initial commit
Diffstat (limited to 'src/customcellrendererprogress.c')
| -rw-r--r-- | src/customcellrendererprogress.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/customcellrendererprogress.c b/src/customcellrendererprogress.c new file mode 100644 index 0000000..04912e7 --- /dev/null +++ b/src/customcellrendererprogress.c @@ -0,0 +1,139 @@ +#include "common.h" + +#include "customcellrendererprogress.h" + +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, + cell_progress->downloaded, 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); */ + + 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, progress->downloaded); + break; + case PROP_SEEDED: + g_value_set_float(value, 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 (progress->downloaded != downloaded) + { + progress->downloaded = downloaded; + changed = TRUE; + } + break; + } + case PROP_SEEDED: + { + gfloat seeded = g_value_get_float(value); + + if (progress->seeded != seeded) + { + progress->seeded = seeded; + changed = TRUE; + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); + } + + if (changed) + { + update_progress(progress, progress->downloaded, progress->seeded); + } +} + +void update_progress(CustomCellRendererProgress* cell_progress, + gfloat downloaded, gfloat seeded) +{ + g_snprintf(cell_progress->buffer, sizeof(cell_progress->buffer), + "%2.2f", seeded); + g_object_set(cell_progress, + "value", (gint)downloaded, + "text", cell_progress->buffer, + NULL); +} |
