Hello Tristan
This patch should be enough for Adjustment properties.
greets
Juan Pablo
Index: src/glade-editor-property.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-editor-property.c,v
retrieving revision 1.21
diff -u -p -r1.21 glade-editor-property.c
--- src/glade-editor-property.c 29 Mar 2006 22:15:41 -0000 1.21
+++ src/glade-editor-property.c 30 Mar 2006 22:31:22 -0000
@@ -2340,6 +2340,255 @@ glade_eprop_objects_create_input (GladeE
/*******************************************************************************
+ GladeEditorPropertyAdjustmentClass
+ *******************************************************************************/
+typedef struct {
+ GladeEditorProperty parent_instance;
+
+ GtkWidget *value, *lower, *upper, *step_increment, *page_increment, *page_size;
+ GtkAdjustment *value_adj;
+ struct
+ {
+ gulong value, lower, upper, step_increment, page_increment, page_size;
+ }ids;
+} GladeEPropAdjustment;
+
+GLADE_MAKE_EPROP (GladeEPropAdjustment, glade_eprop_adjustment)
+#define GLADE_TYPE_EPROP_ADJUSTMENT (glade_eprop_adjustment_get_type())
+#define GLADE_EPROP_ADJUSTMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_ADJUSTMENT, GladeEPropAdjustment))
+#define GLADE_EPROP_ADJUSTMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_ADJUSTMENT, GladeEPropAdjustmentClass))
+#define GLADE_IS_EPROP_ADJUSTMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_ADJUSTMENT))
+#define GLADE_IS_EPROP_ADJUSTMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_ADJUSTMENT))
+#define GLADE_EPROP_ADJUSTMENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_ADJUSTMENT, GladeEPropAdjustmentClass))
+
+static void
+glade_eprop_adjustment_finalize (GObject *object)
+{
+ /* Chain up */
+ G_OBJECT_CLASS (editor_property_class)->finalize (object);
+}
+
+typedef struct _EPropAdjIdle EPropAdjIdleData;
+
+struct _EPropAdjIdle
+{
+ GtkSpinButton *spin;
+ gdouble value;
+};
+
+static gboolean
+glade_eprop_adj_set_value_idle (gpointer p)
+{
+ EPropAdjIdleData *data = (EPropAdjIdleData *) p;
+ gtk_spin_button_set_value (data->spin, data->value);
+ g_free (p);
+
+ return FALSE;
+}
+
+static void
+glade_eprop_adj_value_changed (GtkAdjustment *adj, GtkSpinButton *spin)
+{
+ GtkAdjustment *spin_adj = gtk_spin_button_get_adjustment (spin);
+ gdouble old_value = spin_adj->value;
+ EPropAdjIdleData *data = g_new (EPropAdjIdleData, 1);
+
+ g_signal_handlers_disconnect_by_func (adj, glade_eprop_adj_value_changed, spin);
+
+ data->spin = spin;
+ data->value = adj->value;
+ g_idle_add (glade_eprop_adj_set_value_idle, data);
+
+ adj->value = old_value;
+}
+
+static void
+glade_eprop_adjustment_load (GladeEditorProperty *eprop, GladeProperty *property)
+{
+ GladeEPropAdjustment *eprop_adj = GLADE_EPROP_ADJUSTMENT (eprop);
+ GObject *object;
+ GtkAdjustment *adj;
+
+ /* Chain up first */
+ editor_property_class->load (eprop, property);
+
+ if (property == NULL) return;
+
+ object = g_value_get_object (property->value);
+ if (object == NULL) return;
+
+ adj = GTK_ADJUSTMENT (object);
+
+ g_signal_connect (object, "value-changed",
+ G_CALLBACK (glade_eprop_adj_value_changed),
+ GTK_SPIN_BUTTON (eprop_adj->value));
+
+ /* Update value's adjustment */
+ eprop_adj->value_adj->lower = adj->lower;
+ eprop_adj->value_adj->upper = adj->upper;
+ eprop_adj->value_adj->step_increment = adj->step_increment;
+ eprop_adj->value_adj->page_increment = adj->page_increment;
+ eprop_adj->value_adj->page_size = adj->page_size;
+
+ /* Block Handlers */
+ g_signal_handler_block (eprop_adj->value, eprop_adj->ids.value);
+ g_signal_handler_block (eprop_adj->lower, eprop_adj->ids.lower);
+ g_signal_handler_block (eprop_adj->upper, eprop_adj->ids.upper);
+ g_signal_handler_block (eprop_adj->step_increment, eprop_adj->ids.step_increment);
+ g_signal_handler_block (eprop_adj->page_increment, eprop_adj->ids.page_increment);
+ g_signal_handler_block (eprop_adj->page_size, eprop_adj->ids.page_size);
+
+ /* Update spinbuttons values */
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->value), adj->value);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->lower), adj->lower);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->upper), adj->upper);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->step_increment), adj->step_increment);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->page_increment), adj->page_increment);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_adj->page_size), adj->page_size);
+
+ /* Unblock Handlers */
+ g_signal_handler_unblock (eprop_adj->value, eprop_adj->ids.value);
+ g_signal_handler_unblock (eprop_adj->lower, eprop_adj->ids.lower);
+ g_signal_handler_unblock (eprop_adj->upper, eprop_adj->ids.upper);
+ g_signal_handler_unblock (eprop_adj->step_increment, eprop_adj->ids.step_increment);
+ g_signal_handler_unblock (eprop_adj->page_increment, eprop_adj->ids.page_increment);
+ g_signal_handler_unblock (eprop_adj->page_size, eprop_adj->ids.page_size);
+}
+
+static GtkAdjustment *
+glade_eprop_adjustment_dup_adj (GladeEditorProperty *eprop)
+{
+ GtkAdjustment *adj;
+ GObject *object;
+
+ object = g_value_get_object (eprop->property->value);
+ if (object == NULL) return NULL;
+
+ adj = GTK_ADJUSTMENT (object);
+
+ return GTK_ADJUSTMENT (gtk_adjustment_new (adj->value,
+ adj->lower,
+ adj->upper,
+ adj->step_increment,
+ adj->page_increment,
+ adj->page_size));
+}
+
+static void
+glade_eprop_adjustment_prop_changed_common (GladeEditorProperty *eprop,
+ GtkAdjustment *adjustment)
+{
+ GValue value = {0, };
+
+ g_value_init (&value, GTK_TYPE_ADJUSTMENT);
+ g_value_set_object (&value, G_OBJECT (adjustment));
+
+ glade_editor_property_commit (eprop, &value);
+
+ g_value_unset (&value);
+}
+
+#define GLADE_EPROP_ADJUSTMENT_DEFINE_VALUE_CHANGED_FUNC(p) \
+static void \
+glade_eprop_adjustment_ ## p ## _changed (GtkSpinButton *spin, \
+ GladeEditorProperty *eprop) \
+{ \
+ GtkAdjustment *adj = glade_eprop_adjustment_dup_adj (eprop); \
+ if (adj == NULL) return; \
+ adj->p = gtk_spin_button_get_value (spin); \
+ glade_eprop_adjustment_prop_changed_common (eprop, adj); \
+}
+
+GLADE_EPROP_ADJUSTMENT_DEFINE_VALUE_CHANGED_FUNC (value)
+GLADE_EPROP_ADJUSTMENT_DEFINE_VALUE_CHANGED_FUNC (lower)
+GLADE_EPROP_ADJUSTMENT_DEFINE_VALUE_CHANGED_FUNC (upper)
+GLADE_EPROP_ADJUSTMENT_DEFINE_VALUE_CHANGED_FUNC (step_increment)
+GLADE_EPROP_ADJUSTMENT_DEFINE_VALUE_CHANGED_FUNC (page_increment)
+GLADE_EPROP_ADJUSTMENT_DEFINE_VALUE_CHANGED_FUNC (page_size)
+
+#define GLADE_EPROP_ADJUSTMENT_CONNECT(object, prop) \
+g_signal_connect (object, "value_changed", \
+G_CALLBACK (glade_eprop_adjustment_ ## prop ## _changed), eprop);
+
+static GtkWidget *
+glade_eprop_adjustment_create_input (GladeEditorProperty *eprop)
+{
+ GladeEPropAdjustment *eprop_adj = GLADE_EPROP_ADJUSTMENT (eprop);
+ GtkWidget *widget, *label;
+ GtkTable *table;
+
+ eprop_adj->value = gtk_spin_button_new_with_range (-G_MAXDOUBLE, G_MAXDOUBLE, 1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (eprop_adj->value), 2);
+ eprop_adj->ids.value = GLADE_EPROP_ADJUSTMENT_CONNECT (eprop_adj->value, value);
+ eprop_adj->value_adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (eprop_adj->value));
+
+ eprop_adj->lower = gtk_spin_button_new_with_range (-G_MAXDOUBLE, G_MAXDOUBLE, 1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (eprop_adj->lower), 2);
+ eprop_adj->ids.lower = GLADE_EPROP_ADJUSTMENT_CONNECT (eprop_adj->lower, lower);
+
+ eprop_adj->upper = gtk_spin_button_new_with_range (-G_MAXDOUBLE, G_MAXDOUBLE, 1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (eprop_adj->upper), 2);
+ eprop_adj->ids.upper = GLADE_EPROP_ADJUSTMENT_CONNECT (eprop_adj->upper, upper);
+
+ eprop_adj->step_increment = gtk_spin_button_new_with_range (0, G_MAXDOUBLE, 1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (eprop_adj->step_increment), 2);
+ eprop_adj->ids.step_increment = GLADE_EPROP_ADJUSTMENT_CONNECT (eprop_adj->step_increment, step_increment);
+
+ eprop_adj->page_increment = gtk_spin_button_new_with_range (0, G_MAXDOUBLE, 1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (eprop_adj->page_increment), 2);
+ eprop_adj->ids.page_increment = GLADE_EPROP_ADJUSTMENT_CONNECT (eprop_adj->page_increment, page_increment);
+
+ eprop_adj->page_size = gtk_spin_button_new_with_range (0, G_MAXDOUBLE, 1);
+ gtk_spin_button_set_digits (GTK_SPIN_BUTTON (eprop_adj->page_size), 2);
+ eprop_adj->ids.page_size = GLADE_EPROP_ADJUSTMENT_CONNECT (eprop_adj->page_size, page_size);
+
+ /* Eprop */
+ widget = gtk_table_new (6, 2, FALSE);
+ table = GTK_TABLE (widget);
+ gtk_table_set_col_spacings (table, 4);
+
+#define LABEL_X_ALIGN 1.0
+#define LABEL_Y_ALIGN 0.0
+
+ label = gtk_label_new ("Value :");
+ gtk_misc_set_alignment (GTK_MISC (label), LABEL_X_ALIGN, LABEL_Y_ALIGN);
+ gtk_table_attach_defaults (table, label, 0, 1, 0, 1);
+
+ label = gtk_label_new ("Lower :");
+ gtk_misc_set_alignment (GTK_MISC (label), LABEL_X_ALIGN, LABEL_Y_ALIGN);
+ gtk_table_attach_defaults (table, label, 0, 1, 1, 2);
+
+ label = gtk_label_new ("Upper :");
+ gtk_misc_set_alignment (GTK_MISC (label), LABEL_X_ALIGN, LABEL_Y_ALIGN);
+ gtk_table_attach_defaults (table, label, 0, 1, 2, 3);
+
+ label = gtk_label_new ("Step inc :");
+ gtk_misc_set_alignment (GTK_MISC (label), LABEL_X_ALIGN, LABEL_Y_ALIGN);
+ gtk_table_attach_defaults (table, label, 0, 1, 3, 4);
+
+ label = gtk_label_new ("Page inc :");
+ gtk_misc_set_alignment (GTK_MISC (label), LABEL_X_ALIGN, LABEL_Y_ALIGN);
+ gtk_table_attach_defaults (table, label, 0, 1, 4, 5);
+
+ label = gtk_label_new ("Page size :");
+ gtk_misc_set_alignment (GTK_MISC (label), LABEL_X_ALIGN, LABEL_Y_ALIGN);
+ gtk_table_attach_defaults (table, label, 0, 1, 5, 6);
+
+#undef LABEL_X_ALIGN
+#undef LABEL_Y_ALIGN
+
+ gtk_table_attach_defaults (table, eprop_adj->value, 1, 2, 0, 1);
+ gtk_table_attach_defaults (table, eprop_adj->lower, 1, 2, 1, 2);
+ gtk_table_attach_defaults (table, eprop_adj->upper, 1, 2, 2, 3);
+ gtk_table_attach_defaults (table, eprop_adj->step_increment, 1, 2, 3, 4);
+ gtk_table_attach_defaults (table, eprop_adj->page_increment, 1, 2, 4, 5);
+ gtk_table_attach_defaults (table, eprop_adj->page_size, 1, 2, 5, 6);
+
+ return widget;
+}
+
+
+/*******************************************************************************
Misc static stuff
*******************************************************************************/
static GType
@@ -2378,7 +2627,10 @@ glade_editor_property_type (GParamSpec *
{
if (pspec->value_type == GDK_TYPE_PIXBUF)
type = GLADE_TYPE_EPROP_RESOURCE;
- else
+ else
+ if (pspec->value_type == GTK_TYPE_ADJUSTMENT)
+ type = GLADE_TYPE_EPROP_ADJUSTMENT;
+ else
type = GLADE_TYPE_EPROP_OBJECT;
}
else if (GLADE_IS_PARAM_SPEC_OBJECTS(pspec))
Index: src/glade-gtk.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-gtk.c,v
retrieving revision 1.107
diff -u -p -r1.107 glade-gtk.c
--- src/glade-gtk.c 20 Mar 2006 15:09:28 -0000 1.107
+++ src/glade-gtk.c 30 Mar 2006 22:31:30 -0000
@@ -154,59 +154,24 @@ glade_gtk_progress_bar_set_format (GObje
gtk_progress_set_format_string (GTK_PROGRESS (bar), format);
}
-void GLADEGTK_API
-glade_gtk_spin_button_set_max (GObject *object, GValue *value)
-{
- GtkAdjustment *adjustment;
-
- adjustment = GTK_ADJUSTMENT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object)));
-
- adjustment->upper = g_value_get_float (value);
- gtk_adjustment_changed (adjustment);
-}
+/* GtkSpinButton */
void GLADEGTK_API
-glade_gtk_spin_button_set_min (GObject *object, GValue *value)
+glade_gtk_spin_button_set_adjustment (GObject *object, GValue *value)
{
- GtkAdjustment *adjustment;
-
- adjustment = GTK_ADJUSTMENT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object)));
-
- adjustment->lower = g_value_get_float (value);
- gtk_adjustment_changed (adjustment);
-}
-
-void GLADEGTK_API
-glade_gtk_spin_button_set_step_increment (GObject *object, GValue *value)
-{
- GtkAdjustment *adjustment;
-
- adjustment = GTK_ADJUSTMENT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object)));
-
- adjustment->step_increment = g_value_get_float (value);
- gtk_adjustment_changed (adjustment);
-}
-
-void GLADEGTK_API
-glade_gtk_spin_button_set_page_increment (GObject *object, GValue *value)
-{
- GtkAdjustment *adjustment;
-
- adjustment = GTK_ADJUSTMENT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object)));
-
- adjustment->page_increment = g_value_get_float (value);
- gtk_adjustment_changed (adjustment);
-}
-
-void GLADEGTK_API
-glade_gtk_spin_button_set_page_size (GObject *object, GValue *value)
-{
- GtkAdjustment *adjustment;
-
- adjustment = GTK_ADJUSTMENT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object)));
-
- adjustment->page_size = g_value_get_float (value);
- gtk_adjustment_changed (adjustment);
+ GObject *adjustment;
+ GtkAdjustment *adj;
+
+ g_return_if_fail (GTK_IS_SPIN_BUTTON (object));
+
+ adjustment = g_value_get_object (value);
+
+ if (adjustment && GTK_IS_ADJUSTMENT (adjustment))
+ {
+ adj = GTK_ADJUSTMENT (adjustment);
+ gtk_spin_button_set_adjustment (GTK_SPIN_BUTTON (object), adj);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (object), adj->value);
+ }
}
/* GtkBox */
Index: src/glade-property-class.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-property-class.c,v
retrieving revision 1.95
diff -u -p -r1.95 glade-property-class.c
--- src/glade-property-class.c 29 Mar 2006 22:15:41 -0000 1.95
+++ src/glade-property-class.c 30 Mar 2006 22:31:34 -0000
@@ -287,6 +287,15 @@ glade_property_class_make_string_from_ob
if ((filename = g_object_get_data (object, "GladeFileName")) != NULL)
string = g_path_get_basename (filename);
}
+ else if (property_class->pspec->value_type == GTK_TYPE_ADJUSTMENT)
+ {
+ GtkAdjustment *adj = GTK_ADJUSTMENT (object);
+ string = g_strdup_printf ("%lf %lf %lf %lf %lf %lf",
+ adj->value, adj->lower, adj->upper,
+ adj->step_increment,
+ adj->page_increment,
+ adj->page_size);
+ }
else if ((gwidget = glade_widget_get_from_gobject (object)) != NULL)
string = g_strdup (gwidget->name);
else
@@ -538,34 +547,40 @@ glade_property_class_make_object_from_st
GObject *object = NULL;
gchar *fullpath;
+ if (string == NULL) return NULL;
+
if (property_class->pspec->value_type == GDK_TYPE_PIXBUF && project)
{
GdkPixbuf *pixbuf;
- if (string)
- {
- fullpath = glade_project_resource_fullpath (project, string);
+ fullpath = glade_project_resource_fullpath (project, string);
- if ((pixbuf = gdk_pixbuf_new_from_file
- (fullpath, NULL)) != NULL)
- {
- g_object_set_data_full (G_OBJECT(pixbuf),
- "GladeFileName",
- g_strdup (string),
- g_free);
+ if ((pixbuf = gdk_pixbuf_new_from_file (fullpath, NULL)) != NULL)
+ {
+ g_object_set_data_full (G_OBJECT(pixbuf),
+ "GladeFileName",
+ g_strdup (string),
+ g_free);
- object = G_OBJECT(pixbuf);
- }
- g_free (fullpath);
+ object = G_OBJECT(pixbuf);
}
+ g_free (fullpath);
+ }
+ if (property_class->pspec->value_type == GTK_TYPE_ADJUSTMENT)
+ {
+ gdouble value, lower, upper, step_increment, page_increment, page_size;
+
+ sscanf (string, "%lf %lf %lf %lf %lf %lf", &value, &lower, &upper, &step_increment, &page_increment, &page_size);
+ object = G_OBJECT (gtk_adjustment_new (value, lower, upper, step_increment, page_increment, page_size));
}
else
{
GladeWidget *gwidget;
- if (string && (gwidget = glade_project_get_widget_by_name
+ if ((gwidget = glade_project_get_widget_by_name
(project, string)) != NULL)
object = gwidget->object;
}
+
return object;
}
@@ -925,7 +940,8 @@ glade_property_class_is_object (GladePro
{
g_return_val_if_fail (GLADE_IS_PROPERTY_CLASS (class), FALSE);
return (G_IS_PARAM_SPEC_OBJECT(class->pspec) &&
- class->pspec->value_type != GDK_TYPE_PIXBUF);
+ class->pspec->value_type != GDK_TYPE_PIXBUF &&
+ class->pspec->value_type != GTK_TYPE_ADJUSTMENT);
}
@@ -1078,9 +1094,9 @@ glade_property_class_make_adjustment (Gl
} else if (G_IS_PARAM_SPEC_DOUBLE(property_class->pspec))
{
float_range = TRUE;
- min = (gdouble)((GParamSpecFloat *) property_class->pspec)->minimum;
- max = (gdouble)((GParamSpecFloat *) property_class->pspec)->maximum;
- def = (gdouble)((GParamSpecFloat *) property_class->pspec)->default_value;
+ min = (gdouble)((GParamSpecDouble *) property_class->pspec)->minimum;
+ max = (gdouble)((GParamSpecDouble *) property_class->pspec)->maximum;
+ def = (gdouble)((GParamSpecDouble *) property_class->pspec)->default_value;
} else
{
g_critical ("Can't make adjustment for pspec type %s",
Index: widgets/gtk+.xml.in
===================================================================
RCS file: /cvs/gnome/glade3/widgets/gtk+.xml.in,v
retrieving revision 1.37
diff -u -p -r1.37 gtk+.xml.in
--- widgets/gtk+.xml.in 29 Mar 2006 22:15:41 -0000 1.37
+++ widgets/gtk+.xml.in 30 Mar 2006 22:31:37 -0000
@@ -3,7 +3,7 @@
<!-- Gtk+ Base -->
<glade-widget-class name="GtkWidget">
<properties>
- <property id="visible" common="True" ignore="True"/>
+ <property id="visible" common="True" ignore="True" default="True"/>
<property id="width-request" common="True" optional="True" optional-default="False" default="0"/>
<property id="height-request" common="True" optional="True" optional-default="False" default="0"/>
@@ -432,6 +432,12 @@
<glade-widget-class name="GtkSpinButton" generic-name="spinbutton" _title="Spin Button">
<properties>
+ <property id="text" disabled="True"/>
+ <property id="value" disabled="True"/>
+ <property id="can-focus" default="True"/>
+ <property id="adjustment" default="0 0 100 1 10 10">
+ <set-function>glade_gtk_spin_button_set_adjustment</set-function>
+ </property>
<property id="update-policy">
<displayable-values>
<value id="GTK_UPDATE_ALWAYS" _name="Always"/>
@@ -853,6 +859,8 @@
<glade-widget-class name="GtkViewport" generic-name="viewport" _title="Viewport">
<properties>
+ <property id="hadjustment" disabled="True"/>
+ <property id="vadjustment" disabled="True"/>
<property id="shadow-type">
<displayable-values>
<value id="GTK_SHADOW_NONE" _name="None"/>
@@ -867,6 +875,8 @@
<glade-widget-class name="GtkScrolledWindow" generic-name="scrolledwindow" _title="Scrolled Window">
<properties>
+ <property id="hadjustment" disabled="True"/>
+ <property id="vadjustment" disabled="True"/>
<property id="shadow-type">
<displayable-values>
<value id="GTK_SHADOW_NONE" _name="None"/>
_______________________________________________
Glade-devel maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/glade-devel