mirror of
https://gitlab.gnome.org/GNOME/gimp.git
synced 2025-07-04 17:59:37 +00:00
propwidgets: Use g_bind_property()
Make some property widgets implementations easier by just using `g_bind_property()`, which does all the property change handling for us.
This commit is contained in:
parent
436a9d2b5d
commit
0828a371c2
1 changed files with 40 additions and 179 deletions
|
@ -79,12 +79,6 @@ static void connect_notify (GObject *config,
|
||||||
/* check button */
|
/* check button */
|
||||||
/******************/
|
/******************/
|
||||||
|
|
||||||
static void gimp_prop_check_button_callback (GtkWidget *widget,
|
|
||||||
GObject *config);
|
|
||||||
static void gimp_prop_check_button_notify (GObject *config,
|
|
||||||
GParamSpec *param_spec,
|
|
||||||
GtkWidget *button);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gimp_prop_check_button_new:
|
* gimp_prop_check_button_new:
|
||||||
* @config: Object to which property is attached.
|
* @config: Object to which property is attached.
|
||||||
|
@ -107,7 +101,7 @@ gimp_prop_check_button_new (GObject *config,
|
||||||
{
|
{
|
||||||
GParamSpec *param_spec;
|
GParamSpec *param_spec;
|
||||||
GtkWidget *button;
|
GtkWidget *button;
|
||||||
gboolean value;
|
const gchar *blurb;
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_OBJECT (config), NULL);
|
g_return_val_if_fail (G_IS_OBJECT (config), NULL);
|
||||||
g_return_val_if_fail (property_name != NULL, NULL);
|
g_return_val_if_fail (property_name != NULL, NULL);
|
||||||
|
@ -120,73 +114,20 @@ gimp_prop_check_button_new (GObject *config,
|
||||||
if (! label)
|
if (! label)
|
||||||
label = g_param_spec_get_nick (param_spec);
|
label = g_param_spec_get_nick (param_spec);
|
||||||
|
|
||||||
g_object_get (config,
|
|
||||||
property_name, &value,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
button = gtk_check_button_new_with_mnemonic (label);
|
button = gtk_check_button_new_with_mnemonic (label);
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), value);
|
|
||||||
|
|
||||||
set_param_spec (G_OBJECT (button), button, param_spec);
|
|
||||||
|
|
||||||
g_signal_connect (button, "toggled",
|
|
||||||
G_CALLBACK (gimp_prop_check_button_callback),
|
|
||||||
config);
|
|
||||||
|
|
||||||
connect_notify (config, property_name,
|
|
||||||
G_CALLBACK (gimp_prop_check_button_notify),
|
|
||||||
button);
|
|
||||||
|
|
||||||
gtk_widget_show (button);
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
blurb = g_param_spec_get_blurb (param_spec);
|
||||||
|
if (blurb)
|
||||||
|
gimp_help_set_help_data (button, blurb, NULL);
|
||||||
|
|
||||||
|
g_object_bind_property (config, property_name,
|
||||||
|
button, "active",
|
||||||
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||||
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gimp_prop_check_button_callback (GtkWidget *widget,
|
|
||||||
GObject *config)
|
|
||||||
{
|
|
||||||
GParamSpec *param_spec;
|
|
||||||
gboolean value;
|
|
||||||
gboolean v;
|
|
||||||
|
|
||||||
param_spec = get_param_spec (G_OBJECT (widget));
|
|
||||||
if (! param_spec)
|
|
||||||
return;
|
|
||||||
|
|
||||||
value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
|
|
||||||
|
|
||||||
g_object_get (config, param_spec->name, &v, NULL);
|
|
||||||
|
|
||||||
if (v != value)
|
|
||||||
g_object_set (config, param_spec->name, value, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gimp_prop_check_button_notify (GObject *config,
|
|
||||||
GParamSpec *param_spec,
|
|
||||||
GtkWidget *button)
|
|
||||||
{
|
|
||||||
gboolean value;
|
|
||||||
|
|
||||||
g_object_get (config,
|
|
||||||
param_spec->name, &value,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) != value)
|
|
||||||
{
|
|
||||||
g_signal_handlers_block_by_func (button,
|
|
||||||
gimp_prop_check_button_callback,
|
|
||||||
config);
|
|
||||||
|
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), value);
|
|
||||||
|
|
||||||
g_signal_handlers_unblock_by_func (button,
|
|
||||||
gimp_prop_check_button_callback,
|
|
||||||
config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void gimp_prop_enum_check_button_callback (GtkWidget *widget,
|
static void gimp_prop_enum_check_button_callback (GtkWidget *widget,
|
||||||
GObject *config);
|
GObject *config);
|
||||||
|
@ -450,7 +391,7 @@ gimp_prop_int_combo_box_new (GObject *config,
|
||||||
{
|
{
|
||||||
GParamSpec *param_spec;
|
GParamSpec *param_spec;
|
||||||
GtkWidget *combo_box;
|
GtkWidget *combo_box;
|
||||||
gint value;
|
const gchar *blurb;
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_OBJECT (config), NULL);
|
g_return_val_if_fail (G_IS_OBJECT (config), NULL);
|
||||||
g_return_val_if_fail (property_name != NULL, NULL);
|
g_return_val_if_fail (property_name != NULL, NULL);
|
||||||
|
@ -460,27 +401,18 @@ gimp_prop_int_combo_box_new (GObject *config,
|
||||||
if (! param_spec)
|
if (! param_spec)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
g_object_get (config,
|
|
||||||
property_name, &value,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
combo_box = g_object_new (GIMP_TYPE_INT_COMBO_BOX,
|
combo_box = g_object_new (GIMP_TYPE_INT_COMBO_BOX,
|
||||||
"model", store,
|
"model", store,
|
||||||
|
"visible", TRUE,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (combo_box), value);
|
blurb = g_param_spec_get_blurb (param_spec);
|
||||||
|
if (blurb)
|
||||||
|
gimp_help_set_help_data (combo_box, blurb, NULL);
|
||||||
|
|
||||||
g_signal_connect (combo_box, "changed",
|
g_object_bind_property (config, property_name,
|
||||||
G_CALLBACK (gimp_prop_int_combo_box_callback),
|
combo_box, "active",
|
||||||
config);
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||||
|
|
||||||
set_param_spec (G_OBJECT (combo_box), combo_box, param_spec);
|
|
||||||
|
|
||||||
connect_notify (config, property_name,
|
|
||||||
G_CALLBACK (gimp_prop_int_combo_box_notify),
|
|
||||||
combo_box);
|
|
||||||
|
|
||||||
gtk_widget_show (combo_box);
|
|
||||||
|
|
||||||
return combo_box;
|
return combo_box;
|
||||||
}
|
}
|
||||||
|
@ -2032,10 +1964,6 @@ gimp_prop_memsize_notify (GObject *config,
|
||||||
/* label */
|
/* label */
|
||||||
/***********/
|
/***********/
|
||||||
|
|
||||||
static void gimp_prop_label_notify (GObject *config,
|
|
||||||
GParamSpec *param_spec,
|
|
||||||
GtkWidget *label);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gimp_prop_label_new:
|
* gimp_prop_label_new:
|
||||||
* @config: Object to which property is attached.
|
* @config: Object to which property is attached.
|
||||||
|
@ -2056,75 +1984,30 @@ gimp_prop_label_new (GObject *config,
|
||||||
{
|
{
|
||||||
GParamSpec *param_spec;
|
GParamSpec *param_spec;
|
||||||
GtkWidget *label;
|
GtkWidget *label;
|
||||||
|
const gchar *blurb;
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_OBJECT (config), NULL);
|
g_return_val_if_fail (G_IS_OBJECT (config), NULL);
|
||||||
g_return_val_if_fail (property_name != NULL, NULL);
|
g_return_val_if_fail (property_name != NULL, NULL);
|
||||||
|
|
||||||
param_spec = find_param_spec (config, property_name, G_STRFUNC);
|
param_spec = find_param_spec (config, property_name, G_STRFUNC);
|
||||||
|
|
||||||
if (! param_spec)
|
if (! param_spec)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (! g_value_type_transformable (param_spec->value_type, G_TYPE_STRING))
|
|
||||||
{
|
|
||||||
g_warning ("%s: property '%s' of %s is not transformable to string",
|
|
||||||
G_STRLOC,
|
|
||||||
param_spec->name,
|
|
||||||
g_type_name (param_spec->owner_type));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
||||||
|
|
||||||
set_param_spec (G_OBJECT (label), label, param_spec);
|
|
||||||
|
|
||||||
connect_notify (config, property_name,
|
|
||||||
G_CALLBACK (gimp_prop_label_notify),
|
|
||||||
label);
|
|
||||||
|
|
||||||
gimp_prop_label_notify (config, param_spec, label);
|
|
||||||
|
|
||||||
gtk_widget_show (label);
|
gtk_widget_show (label);
|
||||||
|
|
||||||
|
blurb = g_param_spec_get_blurb (param_spec);
|
||||||
|
if (blurb)
|
||||||
|
gimp_help_set_help_data (label, blurb, NULL);
|
||||||
|
|
||||||
|
g_object_bind_property (config, property_name,
|
||||||
|
label, "label",
|
||||||
|
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||||
|
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gimp_prop_label_notify (GObject *config,
|
|
||||||
GParamSpec *param_spec,
|
|
||||||
GtkWidget *label)
|
|
||||||
{
|
|
||||||
GValue value = G_VALUE_INIT;
|
|
||||||
|
|
||||||
g_value_init (&value, param_spec->value_type);
|
|
||||||
|
|
||||||
g_object_get_property (config, param_spec->name, &value);
|
|
||||||
|
|
||||||
if (G_VALUE_HOLDS_STRING (&value))
|
|
||||||
{
|
|
||||||
const gchar *str = g_value_get_string (&value);
|
|
||||||
|
|
||||||
gtk_label_set_text (GTK_LABEL (label), str ? str : "");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GValue str_value = G_VALUE_INIT;
|
|
||||||
const gchar *str;
|
|
||||||
|
|
||||||
g_value_init (&str_value, G_TYPE_STRING);
|
|
||||||
g_value_transform (&value, &str_value);
|
|
||||||
|
|
||||||
str = g_value_get_string (&str_value);
|
|
||||||
|
|
||||||
gtk_label_set_text (GTK_LABEL (label), str ? str : "");
|
|
||||||
|
|
||||||
g_value_unset (&str_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_value_unset (&value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********/
|
/***********/
|
||||||
/* entry */
|
/* entry */
|
||||||
|
@ -4039,10 +3922,6 @@ gimp_prop_unit_combo_box_notify (GObject *config,
|
||||||
/* icon name */
|
/* icon name */
|
||||||
/***************/
|
/***************/
|
||||||
|
|
||||||
static void gimp_prop_icon_image_notify (GObject *config,
|
|
||||||
GParamSpec *param_spec,
|
|
||||||
GtkWidget *image);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gimp_prop_icon_image_new:
|
* gimp_prop_icon_image_new:
|
||||||
* @config: Object to which property is attached.
|
* @config: Object to which property is attached.
|
||||||
|
@ -4065,6 +3944,7 @@ gimp_prop_icon_image_new (GObject *config,
|
||||||
GParamSpec *param_spec;
|
GParamSpec *param_spec;
|
||||||
GtkWidget *image;
|
GtkWidget *image;
|
||||||
gchar *icon_name;
|
gchar *icon_name;
|
||||||
|
const gchar *blurb;
|
||||||
|
|
||||||
param_spec = check_param_spec (config, property_name,
|
param_spec = check_param_spec (config, property_name,
|
||||||
G_TYPE_PARAM_STRING, G_STRFUNC);
|
G_TYPE_PARAM_STRING, G_STRFUNC);
|
||||||
|
@ -4076,38 +3956,19 @@ gimp_prop_icon_image_new (GObject *config,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
image = gtk_image_new_from_icon_name (icon_name, icon_size);
|
image = gtk_image_new_from_icon_name (icon_name, icon_size);
|
||||||
|
|
||||||
if (icon_name)
|
|
||||||
g_free (icon_name);
|
|
||||||
|
|
||||||
set_param_spec (G_OBJECT (image), image, param_spec);
|
|
||||||
|
|
||||||
connect_notify (config, property_name,
|
|
||||||
G_CALLBACK (gimp_prop_icon_image_notify),
|
|
||||||
image);
|
|
||||||
|
|
||||||
gtk_widget_show (image);
|
gtk_widget_show (image);
|
||||||
|
|
||||||
return image;
|
blurb = g_param_spec_get_blurb (param_spec);
|
||||||
}
|
if (blurb)
|
||||||
|
gimp_help_set_help_data (image, blurb, NULL);
|
||||||
|
|
||||||
static void
|
g_object_bind_property (config, property_name,
|
||||||
gimp_prop_icon_image_notify (GObject *config,
|
image, "icon-name",
|
||||||
GParamSpec *param_spec,
|
G_BINDING_BIDIRECTIONAL);
|
||||||
GtkWidget *image)
|
|
||||||
{
|
|
||||||
gchar *icon_name;
|
|
||||||
GtkIconSize icon_size;
|
|
||||||
|
|
||||||
g_object_get (config,
|
|
||||||
param_spec->name, &icon_name,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
gtk_image_get_icon_name (GTK_IMAGE (image), NULL, &icon_size);
|
|
||||||
gtk_image_set_from_icon_name (GTK_IMAGE (image), icon_name, icon_size);
|
|
||||||
|
|
||||||
if (icon_name)
|
|
||||||
g_free (icon_name);
|
g_free (icon_name);
|
||||||
|
|
||||||
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue