diff options
Diffstat (limited to 'src/customcellrendererrate.c')
| -rw-r--r-- | src/customcellrendererrate.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/customcellrendererrate.c b/src/customcellrendererrate.c new file mode 100644 index 0000000..4b7b9bf --- /dev/null +++ b/src/customcellrendererrate.c @@ -0,0 +1,129 @@ +#include "common.h" + +#include "customcellrendererrate.h" + +static void custom_cell_renderer_rate_get_property(GObject* object, + guint param_id, + GValue* value, + GParamSpec* pspec); +static void custom_cell_renderer_rate_set_property(GObject* object, + guint param_id, + const GValue* value, + GParamSpec* pspec); + +static void convert_rate_to_string(gchar* str, guint size, gfloat rate); + +enum { + PROP_0, + PROP_RATE, +}; + +G_DEFINE_TYPE(CustomCellRendererRate, custom_cell_renderer_rate, GTK_TYPE_CELL_RENDERER_TEXT) + +static void custom_cell_renderer_rate_init(CustomCellRendererRate* cell_rate) +{ + convert_rate_to_string(cell_rate->buffer, sizeof(cell_rate->buffer), + cell_rate->rate); + g_object_set(cell_rate, "text", cell_rate->buffer, NULL); +} + +static void custom_cell_renderer_rate_class_init(CustomCellRendererRateClass *cell_rate_class) +{ + GObjectClass *object_class; + /* GtkCellRendererClass *cell_renderer_class; */ + + object_class = G_OBJECT_CLASS(cell_rate_class); + /* cell_renderer_class = GTK_CELL_RENDERER_CLASS(cell_rate_class); */ + + object_class->set_property = custom_cell_renderer_rate_set_property; + object_class->get_property = custom_cell_renderer_rate_get_property; + + g_object_class_install_property(object_class, + PROP_RATE, + g_param_spec_float("rate", + "Rate", + "The transfer rate in kilo (1000) byte per second", + 0.0, + G_MAXFLOAT, + 0, + G_PARAM_READABLE | G_PARAM_WRITABLE)); +} + +GtkCellRenderer* custom_cell_renderer_rate_new(void) +{ + return g_object_new(CUSTOM_TYPE_CELL_RENDERER_RATE, NULL); +} + +void custom_cell_renderer_rate_get_property(GObject* object, + guint param_id, + GValue* value, + GParamSpec* pspec) +{ + CustomCellRendererRate* rate = CUSTOM_CELL_RENDERER_RATE(object); + + switch (param_id) + { + case PROP_RATE: + g_value_set_float(value, rate->rate); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); + } +} + +void custom_cell_renderer_rate_set_property(GObject* object, + guint param_id, + const GValue* value, + GParamSpec* pspec) +{ + CustomCellRendererRate* rate = CUSTOM_CELL_RENDERER_RATE(object); + gboolean changed = FALSE; + + switch (param_id) + { + case PROP_RATE: + { + gfloat rate_value = g_value_get_float(value); + + if (rate->rate != rate_value) + { + rate->rate = rate_value; + changed = TRUE; + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); + } + + if (changed) + { + convert_rate_to_string(rate->buffer, sizeof(rate->buffer), rate->rate); + g_object_set(rate, "text", rate->buffer, NULL); + } +} + +void convert_rate_to_string(gchar* str, guint size, gfloat rate) +{ + if (rate <= 0.0f) + { + g_assert(size >= 1); + *str = '\0'; + } + else if (rate < 0.9f) + { + g_snprintf(str, size, "%3fB", rate * 1000.0f); + } + else if (rate <= 900.0f) + { + g_snprintf(str, size, "%3.2fkB", rate); + } + else if (rate <= 900000.0f) + { + g_snprintf(str, size, "%3.2fMB", rate / 1000.0f); + } + else + { + g_snprintf(str, size, "%3.2fGB", rate / 1000000.0f); + } +} |
