diff options
Diffstat (limited to 'lib/egg/egg-radio-action.c')
-rw-r--r-- | lib/egg/egg-radio-action.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/lib/egg/egg-radio-action.c b/lib/egg/egg-radio-action.c new file mode 100644 index 000000000..888448c50 --- /dev/null +++ b/lib/egg/egg-radio-action.c @@ -0,0 +1,194 @@ +#include "egg-radio-action.h" + +static void egg_radio_action_init (EggRadioAction *action); +static void egg_radio_action_class_init (EggRadioActionClass *class); + +GType +egg_radio_action_get_type (void) +{ + static GtkType type = 0; + + if (!type) + { + static const GTypeInfo type_info = + { + sizeof (EggRadioActionClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) egg_radio_action_class_init, + (GClassFinalizeFunc) NULL, + NULL, + + sizeof (EggRadioAction), + 0, /* n_preallocs */ + (GInstanceInitFunc) egg_radio_action_init, + }; + + type = g_type_register_static (EGG_TYPE_TOGGLE_ACTION, + "EggRadioAction", + &type_info, 0); + } + return type; +} + +static void egg_radio_action_finalize (GObject *object); +static void egg_radio_action_activate (EggAction *action); + +static GObjectClass *parent_class = NULL; + +static void +egg_radio_action_class_init (EggRadioActionClass *class) +{ + GObjectClass *object_class; + EggActionClass *action_class; + + parent_class = g_type_class_peek_parent (class); + object_class = G_OBJECT_CLASS (class); + action_class = EGG_ACTION_CLASS (class); + + object_class->finalize = egg_radio_action_finalize; + + action_class->activate = egg_radio_action_activate; +} + +static void +egg_radio_action_init (EggRadioAction *action) +{ + action->group = g_slist_prepend (NULL, action); +} + +static void +egg_radio_action_finalize (GObject *object) +{ + EggRadioAction *action; + GSList *tmp_list; + + g_return_if_fail (EGG_IS_RADIO_ACTION (object)); + + action = EGG_RADIO_ACTION (object); + + action->group = g_slist_remove (action->group, action); + + tmp_list = action->group; + + while (tmp_list) + { + EggRadioAction *tmp_action = tmp_list->data; + + tmp_list = tmp_list->next; + tmp_action->group = action->group; + } + + if (parent_class->finalize) + (* parent_class->finalize) (object); +} + +static void +egg_radio_action_activate (EggAction *action) +{ + EggRadioAction *radio_action; + EggToggleAction *toggle_action; + EggToggleAction *tmp_action; + GSList *tmp_list; + + g_return_if_fail (EGG_IS_RADIO_ACTION (action)); + + radio_action = EGG_RADIO_ACTION (action); + toggle_action = EGG_TOGGLE_ACTION (action); + + if (toggle_action->active) + { + tmp_list = radio_action->group; + + while (tmp_list) + { + tmp_action = tmp_list->data; + tmp_list = tmp_list->next; + + if (tmp_action->active && (tmp_action != toggle_action)) + { + toggle_action->active = !toggle_action->active; + break; + } + } + } + else + { + toggle_action->active = !toggle_action->active; + + tmp_list = radio_action->group; + while (tmp_list) + { + tmp_action = tmp_list->data; + tmp_list = tmp_list->next; + + if (tmp_action->active && (tmp_action != toggle_action)) + { + egg_action_activate (EGG_ACTION (tmp_action)); + break; + } + } + } + + egg_toggle_action_toggled (toggle_action); +} + +/** + * egg_radio_action_get_group: + * @action: the action object + * + * Returns: the list representing the radio group for this object + */ +GSList * +egg_radio_action_get_group (EggRadioAction *action) +{ + g_return_val_if_fail (EGG_IS_RADIO_ACTION (action), NULL); + + return action->group; +} + +/** + * egg_radio_action_set_group: + * @action: the action object + * @group: a list representing a radio group + * + * Sets the radio group for the radio action object. + */ +void +egg_radio_action_set_group (EggRadioAction *action, GSList *group) +{ + g_return_if_fail (EGG_IS_RADIO_ACTION (action)); + g_return_if_fail (!g_slist_find (group, action)); + + if (action->group) + { + GSList *slist; + + action->group = g_slist_remove (action->group, action); + + for (slist = action->group; slist; slist = slist->next) + { + EggRadioAction *tmp_action = slist->data; + + tmp_action->group = action->group; + } + } + + action->group = g_slist_prepend (group, action); + + if (group) + { + GSList *slist; + + for (slist = action->group; slist; slist = slist->next) + { + EggRadioAction *tmp_action = slist->data; + + tmp_action->group = action->group; + } + } + else + { + EGG_TOGGLE_ACTION (action)->active = TRUE; + } +} |