summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-11-05 14:21:24 +0100
committerAlexander Larsson <alexl@redhat.com>2010-11-05 14:25:12 +0100
commit5f62ba26930c64e358e9e917836d56d7269eeb8a (patch)
treed27bc419a81965ab38562af72038b435e728d9a5
parentf03481c4f296b96b269ca986ec6729640fbb8f88 (diff)
downloadgtk+-radio-group.tar.gz
Convert the "group" property on radio widgets to a GtkRadioGroupradio-group
The various radio widgets all have a write-only "group" property of the same type as the widget. This let you set the group in a bindable way, but is quite weird when we have a real GtkRadioGroup object. We convert this to a real read-write GtkRadioGroup type. Additionally we make it CONSTRUCT and use it in the various constructors instead of hand-rolling the set_group call.
-rw-r--r--gtk/gtkradioaction.c25
-rw-r--r--gtk/gtkradiobutton.c42
-rw-r--r--gtk/gtkradiomenuitem.c22
-rw-r--r--gtk/gtkradiotoolbutton.c58
-rw-r--r--tests/testgtk.c11
5 files changed, 83 insertions, 75 deletions
diff --git a/gtk/gtkradioaction.c b/gtk/gtkradioaction.c
index a0c5c31aef..35acfce76c 100644
--- a/gtk/gtkradioaction.c
+++ b/gtk/gtkradioaction.c
@@ -134,9 +134,9 @@ gtk_radio_action_class_init (GtkRadioActionClass *klass)
PROP_GROUP,
g_param_spec_object ("group",
P_("Group"),
- P_("The radio action whose group this action belongs to."),
- GTK_TYPE_RADIO_ACTION,
- GTK_PARAM_WRITABLE));
+ P_("The radio group this action belongs to."),
+ GTK_TYPE_RADIO_GROUP,
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
/**
* GtkRadioAction:current-value:
@@ -263,18 +263,12 @@ gtk_radio_action_set_property (GObject *object,
case PROP_VALUE:
radio_action->private_data->value = g_value_get_int (value);
break;
- case PROP_GROUP:
+ case PROP_GROUP:
{
- GtkRadioAction *arg;
- GtkRadioGroup *group = NULL;
-
- if (G_VALUE_HOLDS_OBJECT (value))
- {
- arg = GTK_RADIO_ACTION (g_value_get_object (value));
- if (arg)
- group = gtk_radio_action_get_group (arg);
- gtk_radio_action_set_group (radio_action, group);
- }
+ GtkRadioGroup *group;
+
+ group = g_value_get_object (value);
+ gtk_radio_action_set_group (radio_action, group);
}
break;
case PROP_CURRENT_VALUE:
@@ -299,6 +293,9 @@ gtk_radio_action_get_property (GObject *object,
switch (prop_id)
{
+ case PROP_GROUP:
+ g_value_set_object (value, gtk_radio_action_get_group (radio_action));
+ break;
case PROP_VALUE:
g_value_set_int (value, radio_action->private_data->value);
break;
diff --git a/gtk/gtkradiobutton.c b/gtk/gtkradiobutton.c
index dc749469bc..837e3e55f8 100644
--- a/gtk/gtkradiobutton.c
+++ b/gtk/gtkradiobutton.c
@@ -163,9 +163,9 @@ gtk_radio_button_class_init (GtkRadioButtonClass *class)
PROP_GROUP,
g_param_spec_object ("group",
P_("Group"),
- P_("The radio button whose group this widget belongs to."),
- GTK_TYPE_RADIO_BUTTON,
- GTK_PARAM_WRITABLE));
+ P_("The radio group this button belongs to."),
+ GTK_TYPE_RADIO_GROUP,
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
widget_class->destroy = gtk_radio_button_destroy;
widget_class->focus = gtk_radio_button_focus;
@@ -235,15 +235,9 @@ gtk_radio_button_set_property (GObject *object,
switch (prop_id)
{
GtkRadioGroup *group;
- GtkRadioButton *button;
case PROP_GROUP:
- button = g_value_get_object (value);
-
- if (button)
- group = gtk_radio_button_get_group (button);
- else
- group = NULL;
+ group = g_value_get_object (value);
gtk_radio_button_set_group (radio_button, group);
break;
default:
@@ -258,8 +252,15 @@ gtk_radio_button_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
+ GtkRadioButton *radio_button;
+
+ radio_button = GTK_RADIO_BUTTON (object);
+
switch (prop_id)
{
+ case PROP_GROUP:
+ g_value_set_object (value, gtk_radio_button_get_group (radio_button));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -365,10 +366,7 @@ gtk_radio_button_new (GtkRadioGroup *group)
{
GtkRadioButton *radio_button;
- radio_button = g_object_new (GTK_TYPE_RADIO_BUTTON, NULL);
-
- if (group)
- gtk_radio_button_set_group (radio_button, group);
+ radio_button = g_object_new (GTK_TYPE_RADIO_BUTTON, "group", group, NULL);
return GTK_WIDGET (radio_button);
}
@@ -389,11 +387,7 @@ gtk_radio_button_new_with_label (GtkRadioGroup *group,
{
GtkWidget *radio_button;
- radio_button = g_object_new (GTK_TYPE_RADIO_BUTTON, "label", label, NULL) ;
-
- if (group)
- gtk_radio_button_set_group (GTK_RADIO_BUTTON (radio_button), group);
-
+ radio_button = g_object_new (GTK_TYPE_RADIO_BUTTON, "group", group, "label", label, NULL) ;
return radio_button;
}
@@ -417,14 +411,12 @@ gtk_radio_button_new_with_mnemonic (GtkRadioGroup *group,
{
GtkWidget *radio_button;
- radio_button = g_object_new (GTK_TYPE_RADIO_BUTTON,
- "label", label,
- "use-underline", TRUE,
+ radio_button = g_object_new (GTK_TYPE_RADIO_BUTTON,
+ "group", group,
+ "label", label,
+ "use-underline", TRUE,
NULL);
- if (group)
- gtk_radio_button_set_group (GTK_RADIO_BUTTON (radio_button), group);
-
return radio_button;
}
diff --git a/gtk/gtkradiomenuitem.c b/gtk/gtkradiomenuitem.c
index 73aabd0045..1be17022a0 100644
--- a/gtk/gtkradiomenuitem.c
+++ b/gtk/gtkradiomenuitem.c
@@ -65,9 +65,7 @@ gtk_radio_menu_item_new (GtkRadioGroup *group)
{
GtkRadioMenuItem *radio_menu_item;
- radio_menu_item = g_object_new (GTK_TYPE_RADIO_MENU_ITEM, NULL);
-
- gtk_radio_menu_item_set_group (radio_menu_item, group);
+ radio_menu_item = g_object_new (GTK_TYPE_RADIO_MENU_ITEM, "group", group, NULL);
return GTK_WIDGET (radio_menu_item);
}
@@ -87,10 +85,7 @@ gtk_radio_menu_item_set_property (GObject *object,
GtkRadioGroup *group;
case PROP_GROUP:
- if (G_VALUE_HOLDS_OBJECT (value))
- group = gtk_radio_menu_item_get_group ((GtkRadioMenuItem*) g_value_get_object (value));
- else
- group = NULL;
+ group = g_value_get_object (value);
gtk_radio_menu_item_set_group (radio_menu_item, group);
break;
default:
@@ -105,8 +100,15 @@ gtk_radio_menu_item_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
+ GtkRadioMenuItem *radio_menu_item;
+
+ radio_menu_item = GTK_RADIO_MENU_ITEM (object);
+
switch (prop_id)
{
+ case PROP_GROUP:
+ g_value_set_object (value, gtk_radio_menu_item_get_group (radio_menu_item));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -374,9 +376,9 @@ gtk_radio_menu_item_class_init (GtkRadioMenuItemClass *klass)
PROP_GROUP,
g_param_spec_object ("group",
P_("Group"),
- P_("The radio menu item whose group this widget belongs to."),
- GTK_TYPE_RADIO_MENU_ITEM,
- GTK_PARAM_WRITABLE));
+ P_("The radio group this menu item belongs to."),
+ GTK_TYPE_RADIO_GROUP,
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
/**
* GtkStyle::group-changed:
diff --git a/gtk/gtkradiotoolbutton.c b/gtk/gtkradiotoolbutton.c
index fdd5863561..26e9d40c4b 100644
--- a/gtk/gtkradiotoolbutton.c
+++ b/gtk/gtkradiotoolbutton.c
@@ -36,6 +36,10 @@ static void gtk_radio_tool_button_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
+static void gtk_radio_tool_button_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
G_DEFINE_TYPE (GtkRadioToolButton, gtk_radio_tool_button, GTK_TYPE_TOGGLE_TOOL_BUTTON)
@@ -49,7 +53,8 @@ gtk_radio_tool_button_class_init (GtkRadioToolButtonClass *klass)
toolbutton_class = (GtkToolButtonClass *)klass;
object_class->set_property = gtk_radio_tool_button_set_property;
-
+ object_class->get_property = gtk_radio_tool_button_get_property;
+
toolbutton_class->button_type = GTK_TYPE_RADIO_BUTTON;
/**
@@ -63,9 +68,9 @@ gtk_radio_tool_button_class_init (GtkRadioToolButtonClass *klass)
PROP_GROUP,
g_param_spec_object ("group",
P_("Group"),
- P_("The radio tool button whose group this button belongs to."),
- GTK_TYPE_RADIO_TOOL_BUTTON,
- GTK_PARAM_WRITABLE));
+ P_("The radio group this tool button belongs to."),
+ GTK_TYPE_RADIO_GROUP,
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
}
@@ -90,15 +95,10 @@ gtk_radio_tool_button_set_property (GObject *object,
{
case PROP_GROUP:
{
- GtkRadioToolButton *arg;
- GtkRadioGroup *group = NULL;
- if (G_VALUE_HOLDS_OBJECT (value))
- {
- arg = GTK_RADIO_TOOL_BUTTON (g_value_get_object (value));
- if (arg)
- group = gtk_radio_tool_button_get_group (arg);
- gtk_radio_tool_button_set_group (button, group);
- }
+ GtkRadioGroup *group;
+
+ group = g_value_get_object (value);
+ gtk_radio_tool_button_set_group (button, group);
}
break;
default:
@@ -107,6 +107,27 @@ gtk_radio_tool_button_set_property (GObject *object,
}
}
+static void
+gtk_radio_tool_button_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtkRadioToolButton *button;
+
+ button = GTK_RADIO_TOOL_BUTTON (object);
+
+ switch (prop_id)
+ {
+ case PROP_GROUP:
+ g_value_set_object (value, gtk_radio_tool_button_get_group (button));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
/**
* gtk_radio_tool_button_new:
* @group: (allow-none): An existing radio button group, or %NULL if you are creating a new group
@@ -121,12 +142,11 @@ GtkToolItem *
gtk_radio_tool_button_new (GtkRadioGroup *group)
{
GtkRadioToolButton *button;
-
+
button = g_object_new (GTK_TYPE_RADIO_TOOL_BUTTON,
+ "group", group,
NULL);
- gtk_radio_tool_button_set_group (button, group);
-
return GTK_TOOL_ITEM (button);
}
@@ -150,14 +170,12 @@ gtk_radio_tool_button_new_from_stock (GtkRadioGroup *group,
GtkRadioToolButton *button;
g_return_val_if_fail (stock_id != NULL, NULL);
-
+
button = g_object_new (GTK_TYPE_RADIO_TOOL_BUTTON,
+ "group", group,
"stock-id", stock_id,
NULL);
-
- gtk_radio_tool_button_set_group (button, group);
-
return GTK_TOOL_ITEM (button);
}
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 9f4e1d586e..1d9131b87c 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -858,9 +858,9 @@ static GtkWidget *
create_widget_grid (GType widget_type)
{
GtkWidget *table;
- GtkWidget *group_widget = NULL;
+ GtkRadioGroup *group = NULL;
gint i, j;
-
+
table = gtk_table_new (FALSE, 3, 3);
for (i = 0; i < 5; i++)
@@ -892,10 +892,9 @@ create_widget_grid (GType widget_type)
if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
{
- if (!group_widget)
- group_widget = widget;
- else
- g_object_set (widget, "group", group_widget, NULL);
+ if (!group)
+ group = gtk_radio_group_new ();
+ g_object_set (widget, "group", group, NULL);
}
}