diff options
Diffstat (limited to 'lib/egg/egg-toggle-action.c')
-rw-r--r-- | lib/egg/egg-toggle-action.c | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/lib/egg/egg-toggle-action.c b/lib/egg/egg-toggle-action.c new file mode 100644 index 000000000..6c0c0b442 --- /dev/null +++ b/lib/egg/egg-toggle-action.c @@ -0,0 +1,197 @@ +#include "egg-toggle-action.h" +#include "eggtoggletoolbutton.h" + +enum { + TOGGLED, + LAST_SIGNAL +}; + +static void egg_toggle_action_init (EggToggleAction *action); +static void egg_toggle_action_class_init (EggToggleActionClass *class); + +GType +egg_toggle_action_get_type (void) +{ + static GtkType type = 0; + + if (!type) + { + static const GTypeInfo type_info = + { + sizeof (EggToggleActionClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) egg_toggle_action_class_init, + (GClassFinalizeFunc) NULL, + NULL, + + sizeof (EggToggleAction), + 0, /* n_preallocs */ + (GInstanceInitFunc) egg_toggle_action_init, + }; + + type = g_type_register_static (EGG_TYPE_ACTION, + "EggToggleAction", + &type_info, 0); + } + return type; +} + +static void egg_toggle_action_activate (EggAction *action); +static void egg_toggle_action_real_toggled (EggToggleAction *action); +static void connect_proxy (EggAction *action, + GtkWidget *proxy); +static void disconnect_proxy (EggAction *action, + GtkWidget *proxy); + +static GObjectClass *parent_class = NULL; +static guint action_signals[LAST_SIGNAL] = { 0 }; + +static void +egg_toggle_action_class_init (EggToggleActionClass *class) +{ + EggActionClass *action_class; + + parent_class = g_type_class_peek_parent (class); + action_class = EGG_ACTION_CLASS (class); + + action_class->activate = egg_toggle_action_activate; + action_class->connect_proxy = connect_proxy; + action_class->disconnect_proxy = disconnect_proxy; + + action_class->menu_item_type = GTK_TYPE_CHECK_MENU_ITEM; + action_class->toolbar_item_type = EGG_TYPE_TOGGLE_TOOL_BUTTON; + + class->toggled = egg_toggle_action_real_toggled; + + action_signals[TOGGLED] = + g_signal_new ("toggled", + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (EggToggleActionClass, toggled), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +static void +egg_toggle_action_init (EggToggleAction *action) +{ + action->active = FALSE; +} + +static void +egg_toggle_action_activate (EggAction *action) +{ + EggToggleAction *toggle_action; + + g_return_if_fail (EGG_IS_TOGGLE_ACTION (action)); + + toggle_action = EGG_TOGGLE_ACTION (action); + + toggle_action->active = !toggle_action->active; + + egg_toggle_action_toggled (toggle_action); +} + +static void +egg_toggle_action_real_toggled (EggToggleAction *action) +{ + GSList *slist; + + g_return_if_fail (EGG_IS_TOGGLE_ACTION (action)); + + for (slist = EGG_ACTION (action)->proxies; slist; slist = slist->next) + { + GtkWidget *proxy = slist->data; + + egg_action_block_activate_from (EGG_ACTION (action), proxy); + if (GTK_IS_CHECK_MENU_ITEM (proxy)) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (proxy), + action->active); + else if (EGG_IS_TOGGLE_TOOL_BUTTON (proxy)) + egg_toggle_tool_button_set_active (EGG_TOGGLE_TOOL_BUTTON (proxy), + action->active); + else { + g_warning ("Don't know how to toggle `%s' widgets", + G_OBJECT_TYPE_NAME (proxy)); + } + egg_action_unblock_activate_from (EGG_ACTION (action), proxy); + } +} + +static void +connect_proxy (EggAction *action, GtkWidget *proxy) +{ + EggToggleAction *toggle_action; + + toggle_action = EGG_TOGGLE_ACTION (action); + + /* do this before hand, so that we don't call the "activate" handler */ + if (GTK_IS_MENU_ITEM (proxy)) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (proxy), + toggle_action->active); + else if (EGG_IS_TOGGLE_TOOL_BUTTON (proxy)) + egg_toggle_tool_button_set_active (EGG_TOGGLE_TOOL_BUTTON (proxy), + toggle_action->active); + + (* EGG_ACTION_CLASS (parent_class)->connect_proxy) (action, proxy); +} + +static void +disconnect_proxy (EggAction *action, GtkWidget *proxy) +{ + EggToggleAction *toggle_action; + + toggle_action = EGG_TOGGLE_ACTION (action); + + (* EGG_ACTION_CLASS (parent_class)->disconnect_proxy) (action, proxy); +} + +/** + * egg_toggle_action_toggled: + * @action: the action object + * + * Emits the "toggled" signal on the toggle action. + */ +void +egg_toggle_action_toggled (EggToggleAction *action) +{ + g_return_if_fail (EGG_IS_TOGGLE_ACTION (action)); + + g_signal_emit (action, action_signals[TOGGLED], 0); +} + +/** + * egg_toggle_action_set_active: + * @action: the action object + * @is_active: whether the action should be checked or not + * + * Sets the checked state on the toggle action. + */ +void +egg_toggle_action_set_active (EggToggleAction *action, gboolean is_active) +{ + g_return_if_fail (EGG_IS_TOGGLE_ACTION (action)); + + is_active = is_active != 0; + + if (action->active != is_active) + { + egg_action_activate (EGG_ACTION (action)); + } +} + +/** + * egg_toggle_action_get_active: + * @action: the action object + * + * Returns: the checked state of the toggle action + */ +gboolean +egg_toggle_action_get_active (EggToggleAction *action) +{ + g_return_val_if_fail (EGG_IS_TOGGLE_ACTION (action), FALSE); + + return action->active; +} |