X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktoggletoolbutton.c;h=0ed568cbe182d3f5213c5fbd43e1b2d01fa990f9;hb=e1edc998a2e9c557030d207533932b3120e13fe5;hp=0607d80ad5e4d3ae104ddb31b2b7f9be937aedfa;hpb=269d89c79c9e8e872b3599242d1e174afeab4b00;p=~andy%2Fgtk diff --git a/gtk/gtktoggletoolbutton.c b/gtk/gtktoggletoolbutton.c index 0607d80ad..0ed568cbe 100644 --- a/gtk/gtktoggletoolbutton.c +++ b/gtk/gtktoggletoolbutton.c @@ -1,4 +1,4 @@ -/* gtktoggletoolbutton.c + /* gtktoggletoolbutton.c * * Copyright (C) 2002 Anders Carlsson * Copyright (C) 2002 James Henstridge @@ -14,12 +14,10 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ -#include +#include "config.h" #include "gtktoggletoolbutton.h" #include "gtkcheckmenuitem.h" #include "gtklabel.h" @@ -27,8 +25,25 @@ #include "gtkstock.h" #include "gtkintl.h" #include "gtkradiotoolbutton.h" +#include "gtktoggleaction.h" +#include "gtkactivatable.h" #include "gtkprivate.h" -#include "gtkalias.h" + + +/** + * SECTION:gtktoggletoolbutton + * @Short_description: A GtkToolItem containing a toggle button + * @Title: GtkToggleToolButton + * @See_also: #GtkToolbar, #GtkToolButton, #GtkSeparatorToolItem + * + * A #GtkToggleToolButton is a #GtkToolItem that contains a toggle + * button. + * + * Use gtk_toggle_tool_button_new() to create a new + * #GtkToggleToolButton. Use gtk_toggle_tool_button_new_from_stock() to + * create a new #GtkToggleToolButton containing a stock item. + */ + #define MENU_ID "gtk-toggle-tool-button-menu-id" @@ -37,15 +52,26 @@ enum { LAST_SIGNAL }; -#define GTK_TOGGLE_TOOL_BUTTON_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_TOGGLE_TOOL_BUTTON, GtkToggleToolButtonPrivate)) +enum { + PROP_0, + PROP_ACTIVE +}; + struct _GtkToggleToolButtonPrivate { guint active : 1; }; -static void gtk_toggle_tool_button_init (GtkToggleToolButton *button); -static void gtk_toggle_tool_button_class_init (GtkToggleToolButtonClass *klass); + +static void gtk_toggle_tool_button_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gtk_toggle_tool_button_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); static gboolean gtk_toggle_tool_button_create_menu_proxy (GtkToolItem *button); @@ -54,35 +80,20 @@ static void button_toggled (GtkWidget *widget, static void menu_item_activated (GtkWidget *widget, GtkToggleToolButton *button); -static GObjectClass *parent_class = NULL; -static guint toggle_signals[LAST_SIGNAL] = { 0 }; -GType -gtk_toggle_tool_button_get_type (void) -{ - static GType type = 0; +static void gtk_toggle_tool_button_activatable_interface_init (GtkActivatableIface *iface); +static void gtk_toggle_tool_button_update (GtkActivatable *activatable, + GtkAction *action, + const gchar *property_name); +static void gtk_toggle_tool_button_sync_action_properties (GtkActivatable *activatable, + GtkAction *action); - if (!type) - { - static const GTypeInfo type_info = - { - sizeof (GtkToggleToolButtonClass), - (GBaseInitFunc) 0, - (GBaseFinalizeFunc) 0, - (GClassInitFunc) gtk_toggle_tool_button_class_init, - (GClassFinalizeFunc) 0, - NULL, - sizeof (GtkToggleToolButton), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_toggle_tool_button_init - }; - - type = g_type_register_static (GTK_TYPE_TOOL_BUTTON, - "GtkToggleToolButton", &type_info, 0); - } - return type; -} +static GtkActivatableIface *parent_activatable_iface; +static guint toggle_signals[LAST_SIGNAL] = { 0 }; +G_DEFINE_TYPE_WITH_CODE (GtkToggleToolButton, gtk_toggle_tool_button, GTK_TYPE_TOOL_BUTTON, + G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTIVATABLE, + gtk_toggle_tool_button_activatable_interface_init)) static void gtk_toggle_tool_button_class_init (GtkToggleToolButtonClass *klass) @@ -91,15 +102,31 @@ gtk_toggle_tool_button_class_init (GtkToggleToolButtonClass *klass) GtkToolItemClass *toolitem_class; GtkToolButtonClass *toolbutton_class; - parent_class = g_type_class_peek_parent (klass); - object_class = (GObjectClass *)klass; toolitem_class = (GtkToolItemClass *)klass; toolbutton_class = (GtkToolButtonClass *)klass; + object_class->set_property = gtk_toggle_tool_button_set_property; + object_class->get_property = gtk_toggle_tool_button_get_property; + toolitem_class->create_menu_proxy = gtk_toggle_tool_button_create_menu_proxy; toolbutton_class->button_type = GTK_TYPE_TOGGLE_BUTTON; - + + /** + * GtkToggleToolButton:active: + * + * If the toggle tool button should be pressed in. + * + * Since: 2.8 + */ + g_object_class_install_property (object_class, + PROP_ACTIVE, + g_param_spec_boolean ("active", + P_("Active"), + P_("If the toggle button should be pressed in"), + FALSE, + GTK_PARAM_READWRITE)); + /** * GtkToggleToolButton::toggled: * @toggle_tool_button: the object that emitted the signal @@ -107,7 +134,7 @@ gtk_toggle_tool_button_class_init (GtkToggleToolButtonClass *klass) * Emitted whenever the toggle tool button changes state. **/ toggle_signals[TOGGLED] = - g_signal_new ("toggled", + g_signal_new (I_("toggled"), G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GtkToggleToolButtonClass, toggled), @@ -124,7 +151,9 @@ gtk_toggle_tool_button_init (GtkToggleToolButton *button) GtkToolButton *tool_button = GTK_TOOL_BUTTON (button); GtkToggleButton *toggle_button = GTK_TOGGLE_BUTTON (_gtk_tool_button_get_button (tool_button)); - button->priv = GTK_TOGGLE_TOOL_BUTTON_GET_PRIVATE (button); + button->priv = G_TYPE_INSTANCE_GET_PRIVATE (button, + GTK_TYPE_TOGGLE_TOOL_BUTTON, + GtkToggleToolButtonPrivate); /* If the real button is a radio button, it may have been * active at the time it was created. @@ -135,6 +164,47 @@ gtk_toggle_tool_button_init (GtkToggleToolButton *button) "toggled", G_CALLBACK (button_toggled), button, 0); } +static void +gtk_toggle_tool_button_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkToggleToolButton *button = GTK_TOGGLE_TOOL_BUTTON (object); + + switch (prop_id) + { + case PROP_ACTIVE: + gtk_toggle_tool_button_set_active (button, + g_value_get_boolean (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gtk_toggle_tool_button_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GtkToggleToolButton *button = GTK_TOGGLE_TOOL_BUTTON (object); + + switch (prop_id) + { + case PROP_ACTIVE: + g_value_set_boolean (value, gtk_toggle_tool_button_get_active (button)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + static gboolean gtk_toggle_tool_button_create_menu_proxy (GtkToolItem *item) { @@ -144,12 +214,18 @@ gtk_toggle_tool_button_create_menu_proxy (GtkToolItem *item) GtkStockItem stock_item; gboolean use_mnemonic = TRUE; const char *label; + GtkWidget *label_widget; + const gchar *label_text; + const gchar *stock_id; - GtkWidget *label_widget = gtk_tool_button_get_label_widget (tool_button); - const gchar *label_text = gtk_tool_button_get_label (tool_button); - const gchar *stock_id = gtk_tool_button_get_stock_id (tool_button); + if (_gtk_tool_item_create_menu_proxy (item)) + return TRUE; - if (label_widget && GTK_IS_LABEL (label_widget)) + label_widget = gtk_tool_button_get_label_widget (tool_button); + label_text = gtk_tool_button_get_label (tool_button); + stock_id = gtk_tool_button_get_stock_id (tool_button); + + if (GTK_IS_LABEL (label_widget)) { label = gtk_label_get_label (GTK_LABEL (label_widget)); use_mnemonic = gtk_label_get_use_underline (GTK_LABEL (label_widget)); @@ -219,6 +295,7 @@ menu_item_activated (GtkWidget *menu_item, gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_tool_button_get_button (tool_button)), toggle_tool_button->priv->active); + g_object_notify (G_OBJECT (toggle_tool_button), "active"); g_signal_emit (toggle_tool_button, toggle_signals[TOGGLED], 0); } } @@ -227,7 +304,9 @@ static void button_toggled (GtkWidget *widget, GtkToggleToolButton *toggle_tool_button) { - gboolean toggle_active = GTK_TOGGLE_BUTTON (widget)->active; + gboolean toggle_active; + + toggle_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); if (toggle_tool_button->priv->active != toggle_active) { @@ -242,10 +321,57 @@ button_toggled (GtkWidget *widget, toggle_tool_button->priv->active); } + g_object_notify (G_OBJECT (toggle_tool_button), "active"); g_signal_emit (toggle_tool_button, toggle_signals[TOGGLED], 0); } } +static void +gtk_toggle_tool_button_activatable_interface_init (GtkActivatableIface *iface) +{ + parent_activatable_iface = g_type_interface_peek_parent (iface); + iface->update = gtk_toggle_tool_button_update; + iface->sync_action_properties = gtk_toggle_tool_button_sync_action_properties; +} + +static void +gtk_toggle_tool_button_update (GtkActivatable *activatable, + GtkAction *action, + const gchar *property_name) +{ + GtkToggleToolButton *button; + + parent_activatable_iface->update (activatable, action, property_name); + + button = GTK_TOGGLE_TOOL_BUTTON (activatable); + + if (strcmp (property_name, "active") == 0) + { + gtk_action_block_activate (action); + gtk_toggle_tool_button_set_active (button, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))); + gtk_action_unblock_activate (action); + } +} + +static void +gtk_toggle_tool_button_sync_action_properties (GtkActivatable *activatable, + GtkAction *action) +{ + GtkToggleToolButton *button; + + parent_activatable_iface->sync_action_properties (activatable, action); + + if (!GTK_IS_TOGGLE_ACTION (action)) + return; + + button = GTK_TOGGLE_TOOL_BUTTON (activatable); + + gtk_action_block_activate (action); + gtk_toggle_tool_button_set_active (button, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))); + gtk_action_unblock_activate (action); +} + + /** * gtk_toggle_tool_button_new: * @@ -288,7 +414,7 @@ gtk_toggle_tool_button_new_from_stock (const gchar *stock_id) g_return_val_if_fail (stock_id != NULL, NULL); button = g_object_new (GTK_TYPE_TOGGLE_TOOL_BUTTON, - "stock_id", stock_id, + "stock-id", stock_id, NULL); return GTK_TOOL_ITEM (button); @@ -335,6 +461,3 @@ gtk_toggle_tool_button_get_active (GtkToggleToolButton *button) return button->priv->active; } - -#define __GTK_TOGGLE_TOOL_BUTTON_C__ -#include "gtkaliasdef.c"