aboutsummaryrefslogtreecommitdiffstats
path: root/lib/egg/egg-radio-action.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/egg/egg-radio-action.c')
-rw-r--r--lib/egg/egg-radio-action.c194
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;
+ }
+}