summaryrefslogtreecommitdiff
path: root/src/customcellrendererrate.c
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@yahoo.com>2011-11-12 11:34:07 +0100
committerJoel Klinghed <the_jk@yahoo.com>2011-11-12 11:34:07 +0100
commit3411ddd3e6f9ee43e4eaa0c74935f1af8f36ee9d (patch)
tree5c4b1e34b8f7268096282c6376baaef1f2b966f6 /src/customcellrendererrate.c
Initial commit
Diffstat (limited to 'src/customcellrendererrate.c')
-rw-r--r--src/customcellrendererrate.c129
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);
+ }
+}