summaryrefslogtreecommitdiff
path: root/src/customcellrendererstate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/customcellrendererstate.c')
-rw-r--r--src/customcellrendererstate.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/customcellrendererstate.c b/src/customcellrendererstate.c
new file mode 100644
index 0000000..1f0a7f8
--- /dev/null
+++ b/src/customcellrendererstate.c
@@ -0,0 +1,120 @@
+#include "common.h"
+
+#include "customcellrendererstate.h"
+
+static void custom_cell_renderer_state_get_property(GObject* object,
+ guint param_id,
+ GValue* value,
+ GParamSpec* pspec);
+static void custom_cell_renderer_state_set_property(GObject* object,
+ guint param_id,
+ const GValue* value,
+ GParamSpec* pspec);
+
+static void update_state(CustomCellRendererState* cell_state, gint state);
+
+enum {
+ PROP_0,
+ PROP_STATE,
+};
+
+G_DEFINE_TYPE(CustomCellRendererState, custom_cell_renderer_state, GTK_TYPE_CELL_RENDERER_PIXBUF)
+
+static void custom_cell_renderer_state_init(CustomCellRendererState* cell_state)
+{
+ update_state(cell_state, cell_state->state);
+}
+
+static void custom_cell_renderer_state_class_init(CustomCellRendererStateClass *cell_state_class)
+{
+ GObjectClass *object_class;
+ /* GtkCellRendererClass *cell_renderer_class; */
+
+ object_class = G_OBJECT_CLASS(cell_state_class);
+ /* cell_renderer_class = GTK_CELL_RENDERER_CLASS(cell_state_class); */
+
+ object_class->set_property = custom_cell_renderer_state_set_property;
+ object_class->get_property = custom_cell_renderer_state_get_property;
+
+ g_object_class_install_property(object_class,
+ PROP_STATE,
+ g_param_spec_int("state",
+ "Torrent state",
+ "Torrent state",
+ STATE_DEAD,
+ STATE_REHASH,
+ 0,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
+}
+
+GtkCellRenderer* custom_cell_renderer_state_new(void)
+{
+ return g_object_new(CUSTOM_TYPE_CELL_RENDERER_STATE, NULL);
+}
+
+void custom_cell_renderer_state_get_property(GObject* object,
+ guint param_id,
+ GValue* value,
+ GParamSpec* pspec)
+{
+ CustomCellRendererState* state = CUSTOM_CELL_RENDERER_STATE(object);
+
+ switch (param_id)
+ {
+ case PROP_STATE:
+ g_value_set_int(value, state->state);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
+ }
+}
+
+void custom_cell_renderer_state_set_property(GObject* object,
+ guint param_id,
+ const GValue* value,
+ GParamSpec* pspec)
+{
+ CustomCellRendererState* state = CUSTOM_CELL_RENDERER_STATE(object);
+ gboolean changed = FALSE;
+
+ switch (param_id)
+ {
+ case PROP_STATE:
+ {
+ gint state_value = g_value_get_int(value);
+
+ if (state->state != state_value)
+ {
+ state->state = state_value;
+ changed = TRUE;
+ }
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
+ }
+
+ if (changed)
+ {
+ update_state(state, state->state);
+ }
+}
+
+void update_state(CustomCellRendererState* cell_state, gint state)
+{
+ switch ((state_t)state)
+ {
+ case STATE_DEAD:
+ g_object_set(cell_state, "stock-id", GTK_STOCK_CLOSE, NULL);
+ break;
+ case STATE_ACTIVE:
+ g_object_set(cell_state, "stock-id", GTK_STOCK_YES, NULL);
+ break;
+ case STATE_REHASH:
+ g_object_set(cell_state, "stock-id", GTK_STOCK_REFRESH, NULL);
+ break;
+ default:
+ g_assert(FALSE);
+ break;
+ }
+}