#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;
}