mirror of https://github.com/Gnucash/gnucash
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
5.0 KiB
198 lines
5.0 KiB
#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;
|
|
}
|