diff options
Diffstat (limited to 'src/customcellrendererstate.c')
| -rw-r--r-- | src/customcellrendererstate.c | 120 |
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; + } +} |
