X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkradioaction.c;h=4a5aaa786f1e27d340bd2fa8485529cc56a78bf3;hb=f076b6bb0284b59de67d5be8d53a14b5bb32e119;hp=772dd8c57cb4bb98c67701c00aec5f3971b17d18;hpb=4896e24bb1121bf114f9daf25a105f8a815066ff;p=~andy%2Fgtk diff --git a/gtk/gtkradioaction.c b/gtk/gtkradioaction.c index 772dd8c57..4a5aaa786 100644 --- a/gtk/gtkradioaction.c +++ b/gtk/gtkradioaction.c @@ -14,9 +14,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. 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 . */ /* @@ -28,17 +26,24 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#include +#include "config.h" #include "gtkradioaction.h" #include "gtkradiomenuitem.h" -#include "gtktoggleactionprivate.h" #include "gtktoggletoolbutton.h" #include "gtkintl.h" #include "gtkprivate.h" -#include "gtkalias.h" -#define GTK_RADIO_ACTION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_RADIO_ACTION, GtkRadioActionPrivate)) +/** + * SECTION:gtkradioaction + * @Short_description: An action of which only one in a group can be active + * @Title: GtkRadioAction + * + * A #GtkRadioAction is similar to #GtkRadioMenuItem. A number of radio + * actions can be linked together so that only one may be active at any + * one time. + */ + struct _GtkRadioActionPrivate { @@ -173,18 +178,24 @@ gtk_radio_action_class_init (GtkRadioActionClass *klass) static void gtk_radio_action_init (GtkRadioAction *action) { - action->private_data = GTK_RADIO_ACTION_GET_PRIVATE (action); + action->private_data = G_TYPE_INSTANCE_GET_PRIVATE (action, + GTK_TYPE_RADIO_ACTION, + GtkRadioActionPrivate); + action->private_data->group = g_slist_prepend (NULL, action); action->private_data->value = 0; + + gtk_toggle_action_set_draw_as_radio (GTK_TOGGLE_ACTION (action), TRUE); } /** * gtk_radio_action_new: * @name: A unique name for the action - * @label: The label displayed in menu items and on buttons, or %NULL - * @tooltip: A tooltip for this action, or %NULL - * @stock_id: The stock icon to display in widgets representing this - * action, or %NULL + * @label: (allow-none): The label displayed in menu items and on buttons, + * or %NULL + * @tooltip: (allow-none): A tooltip for this action, or %NULL + * @stock_id: (allow-none): The stock icon to display in widgets representing + * this action, or %NULL * @value: The value which gtk_radio_action_get_current_value() should * return if this action is selected. * @@ -206,12 +217,12 @@ gtk_radio_action_new (const gchar *name, g_return_val_if_fail (name != NULL, NULL); return g_object_new (GTK_TYPE_RADIO_ACTION, - "name", name, - "label", label, - "tooltip", tooltip, - "stock-id", stock_id, - "value", value, - NULL); + "name", name, + "label", label, + "tooltip", tooltip, + "stock-id", stock_id, + "value", value, + NULL); } static void @@ -308,11 +319,13 @@ gtk_radio_action_activate (GtkAction *action) GtkToggleAction *toggle_action; GtkToggleAction *tmp_action; GSList *tmp_list; + gboolean active; radio_action = GTK_RADIO_ACTION (action); toggle_action = GTK_TOGGLE_ACTION (action); - if (toggle_action->private_data->active) + active = gtk_toggle_action_get_active (toggle_action); + if (active) { tmp_list = radio_action->private_data->group; @@ -321,16 +334,20 @@ gtk_radio_action_activate (GtkAction *action) tmp_action = tmp_list->data; tmp_list = tmp_list->next; - if (tmp_action->private_data->active && (tmp_action != toggle_action)) + if (gtk_toggle_action_get_active (tmp_action) && + (tmp_action != toggle_action)) { - toggle_action->private_data->active = !toggle_action->private_data->active; + _gtk_toggle_action_set_active (toggle_action, !active); + break; } } + g_object_notify (G_OBJECT (action), "active"); } else { - toggle_action->private_data->active = !toggle_action->private_data->active; + _gtk_toggle_action_set_active (toggle_action, !active); + g_object_notify (G_OBJECT (action), "active"); tmp_list = radio_action->private_data->group; while (tmp_list) @@ -338,7 +355,8 @@ gtk_radio_action_activate (GtkAction *action) tmp_action = tmp_list->data; tmp_list = tmp_list->next; - if (tmp_action->private_data->active && (tmp_action != toggle_action)) + if (gtk_toggle_action_get_active (tmp_action) && + (tmp_action != toggle_action)) { _gtk_action_emit_activate (GTK_ACTION (tmp_action)); break; @@ -390,7 +408,7 @@ create_menu_item (GtkAction *action) * } * ]| * - * Returns: the list representing the radio group for this object + * Returns: (element-type GtkRadioAction) (transfer none): the list representing the radio group for this object * * Since: 2.4 */ @@ -405,7 +423,7 @@ gtk_radio_action_get_group (GtkRadioAction *action) /** * gtk_radio_action_set_group: * @action: the action object - * @group: a list representing a radio group + * @group: (element-type GtkRadioAction): a list representing a radio group * * Sets the radio group for the radio action object. * @@ -451,6 +469,61 @@ gtk_radio_action_set_group (GtkRadioAction *action, } } +/** + * gtk_radio_action_join_group: + * @action: the action object + * @group_source: (allow-none): a radio action object whos group we are + * joining, or %NULL to remove the radio action from its group + * + * Joins a radio action object to the group of another radio action object. + * + * Use this in language bindings instead of the gtk_radio_action_get_group() + * and gtk_radio_action_set_group() methods + * + * A common way to set up a group of radio actions is the following: + * |[ + * GtkRadioAction *action; + * GtkRadioAction *last_action; + * + * while (/* more actions to add */) + * { + * action = gtk_radio_action_new (...); + * + * gtk_radio_action_join_group (action, last_action); + * last_action = action; + * } + * ]| + * + * Since: 3.0 + */ +void +gtk_radio_action_join_group (GtkRadioAction *action, + GtkRadioAction *group_source) +{ + g_return_if_fail (GTK_IS_RADIO_ACTION (action)); + g_return_if_fail (group_source == NULL || GTK_IS_RADIO_ACTION (group_source)); + + if (group_source) + { + GSList *group; + group = gtk_radio_action_get_group (group_source); + + if (!group) + { + /* if we are not already part of a group we need to set up a new one + and then get the newly created group */ + gtk_radio_action_set_group (group_source, NULL); + group = gtk_radio_action_get_group (group_source); + } + + gtk_radio_action_set_group (action, group); + } + else + { + gtk_radio_action_set_group (action, NULL); + } +} + /** * gtk_radio_action_get_current_value: * @action: a #GtkRadioAction @@ -475,7 +548,7 @@ gtk_radio_action_get_current_value (GtkRadioAction *action) { GtkToggleAction *toggle_action = slist->data; - if (toggle_action->private_data->active) + if (gtk_toggle_action_get_active (toggle_action)) return GTK_RADIO_ACTION (toggle_action)->private_data->value; } } @@ -522,6 +595,3 @@ gtk_radio_action_set_current_value (GtkRadioAction *action, g_warning ("Radio group does not contain an action with value '%d'", current_value); } - -#define __GTK_RADIO_ACTION_C__ -#include "gtkaliasdef.c"