Commit 484bb0f0 authored by Jody Goldberg's avatar Jody Goldberg Committed by Jody Goldberg

For Emmanuel Pacaud <emmanuel.pacaud@univ-poitiers.fr> Handle rings


2003-06-29  Jody Goldberg <jody@gnome.org>

	For Emmanuel Pacaud <emmanuel.pacaud@univ-poitiers.fr>
	* graph/plugins/plot_pie/gog-pie.c : Handle rings
parent f22eb810
......@@ -17,6 +17,7 @@ Andreas:
Emmanuel Pacaud:
* New format selector for stf.
* support Ring plots
Jean Brefort:
* Support image files in chart areas (background, bar/col or pie)
......
......@@ -64,6 +64,7 @@ plot_icon_DATA = \
chart_line_3_1.png \
chart_pie_1_1.png chart_pie_1_2.png chart_pie_1_3.png \
chart_pie_2_1.png chart_pie_2_2.png chart_pie_2_3.png \
chart_ring_1_1.png chart_ring_1_2.png \
chart_scatter_1_1.png \
chart_scatter_2_1.png chart_scatter_2_2.png \
chart_scatter_3_1.png chart_scatter_3_2.png \
......
2003-06-29 Jody Goldberg <jody@gnome.org>
For Emmanuel Pacaud <emmanuel.pacaud@univ-poitiers.fr>
* graph/plugins/plot_pie/gog-pie.c : Handle rings
2003-06-27 Jody Goldberg <jody@gnome.org>
* graph/gog-plot.c (gog_plot_set_property) : don't allow setting
vary_style_by_element if the plot does not permit it in the current
state.
(gog_plot_get_property) : be anal.
* graph/plugins/plot_barcol/gog-barcol.c
(gog_barcol_supports_vary_style_by_element) : new.
2003-06-27 Jody Goldberg <jody@gnome.org>
* graph/gog-plot-impl.h : Add GogPlotClass::supports_vary_by_element
......
......@@ -81,7 +81,7 @@ typedef enum {
} GogAxisType;
typedef enum {
GOG_AXES_XY,
GOG_AXES_XY_pseduo_3d,
GOG_AXES_XY_pseudo_3d,
GOG_AXES_XYZ,
GOG_AXES_TYPES
} GogAxesType;
......
......@@ -45,10 +45,9 @@ struct _GogPlot {
unsigned cardinality;
gboolean cardinality_valid;
unsigned index_num;
gboolean vary_style_by_element;
gboolean vary_style_by_element;
GogAxis *axis[GOG_AXIS_TYPES];
GogAxis *axis[GOG_AXIS_TYPES];
/* Usually a copy from the class but its here to allow a GogPlotType to
* override a things without requiring a completely new class */
......@@ -61,14 +60,13 @@ typedef struct {
GogPlotDesc desc;
GType series_type;
unsigned supports_vary_by_element : 1;
/* Virtuals */
GOData *(*axis_bounds) (GogPlot *plot, unsigned axis,
double *min, double *max);
unsigned (*cardinality) (GogPlot *plot);
gboolean (*foreach_elem) (GogPlot *plot,
GogEnumFunc handler, gpointer data);
gboolean (*supports_vary_style_by_element) (GogPlot const *plot);
} GogPlotClass;
#define GOG_PLOT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GOG_PLOT_TYPE, GogPlotClass))
......
......@@ -126,7 +126,8 @@ gog_plot_set_property (GObject *obj, guint param_id,
switch (param_id) {
case PLOT_PROP_VARY_STYLE_BY_ELEMENT:
b_tmp = g_value_get_boolean (value);
b_tmp = g_value_get_boolean (value) &&
gog_plot_supports_vary_style_by_element (plot);
if (plot->vary_style_by_element ^ b_tmp) {
plot->vary_style_by_element = b_tmp;
gog_plot_request_cardinality_update (plot);
......@@ -145,7 +146,9 @@ gog_plot_get_property (GObject *obj, guint param_id,
GogPlot *plot = GOG_PLOT (obj);
switch (param_id) {
case PLOT_PROP_VARY_STYLE_BY_ELEMENT:
g_value_set_boolean (value, plot->vary_style_by_element);
g_value_set_boolean (value,
plot->vary_style_by_element &&
gog_plot_supports_vary_style_by_element (plot));
break;
default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
......@@ -313,6 +316,25 @@ gog_plot_foreach_elem (GogPlot *plot, GogEnumFunc func, gpointer data)
}
}
GOData *
gog_plot_get_axis_bounds (GogPlot *plot, unsigned axis,
double *min, double *max)
{
return NULL;
}
gboolean
gog_plot_supports_vary_style_by_element (GogPlot const *plot)
{
GogPlotClass *klass = GOG_PLOT_GET_CLASS (plot);
g_return_val_if_fail (klass != NULL, FALSE);
if (klass->supports_vary_style_by_element)
return (klass->supports_vary_style_by_element) (plot);
return TRUE; /* default */
}
/****************************************************************************/
/* a placeholder. It seems likely that we will want this eventually */
GSF_CLASS_ABSTRACT (GogPlotView, gog_plot_view,
......
......@@ -42,6 +42,8 @@ void gog_plot_foreach_elem (GogPlot *,
GOData *gog_plot_get_axis_bounds (GogPlot *plot, unsigned axis,
double *min, double *max);
gboolean gog_plot_supports_vary_style_by_element (GogPlot const *plot);
GogSeries *gog_plot_new_series (GogPlot *plot);
GogPlotDesc const *gog_plot_description (GogPlot const *plot);
......
......@@ -221,6 +221,13 @@ gog_barcol_plot_update (GogObject *obj)
parent_klass->update (obj);
}
static gboolean
gog_barcol_supports_vary_style_by_element (GogPlot const *plot)
{
GogBarColPlot *barcol = GOG_BARCOL_PLOT (plot);
return barcol->type == GOG_BARCOL_NORMAL;
}
static void
gog_barcol_plot_class_init (GogPlotClass *plot_klass)
{
......@@ -267,7 +274,7 @@ gog_barcol_plot_class_init (GogPlotClass *plot_klass)
plot_klass->desc.num_series_min = 1;
plot_klass->desc.num_series_max = G_MAXINT;
plot_klass->series_type = gog_barcol_series_get_type ();
plot_klass->supports_vary_by_element = TRUE;
plot_klass->supports_vary_style_by_element = gog_barcol_supports_vary_style_by_element;
}
static void
......
......@@ -17,7 +17,7 @@ pie_la_SOURCES = \
gog-pie-prefs.c
xml_in_files = plugin.xml.in plot-types.xml.in
xml_DATA = $(xml_in_files:.xml.in=.xml) gog-pie-prefs.glade
xml_DATA = $(xml_in_files:.xml.in=.xml) gog-pie-prefs.glade gog-ring-prefs.glade
@INTLTOOL_XML_RULE@
......
......@@ -34,12 +34,14 @@ cb_default_separation_changed (GtkAdjustment *adj, GObject *pie)
{
g_object_set (pie, "default_separation", adj->value, NULL);
}
static void
cb_rotation_changed (GtkAdjustment *adj, GObject *pie)
{
g_object_set (pie, "initial_angle", adj->value, NULL);
}
static void
cb_use_style_toggled (GtkToggleButton *button, GObject *series)
{
......@@ -47,19 +49,11 @@ cb_use_style_toggled (GtkToggleButton *button, GObject *series)
gtk_toggle_button_get_active (button), NULL);
}
GtkWidget *
gog_pie_plot_pref (GogPiePlot *pie, CommandContext *cc)
static void
gog_pie_plot_pref_signal_connect (GogPiePlot *pie, GladeXML *gui)
{
GtkWidget *w;
char const *dir = gnm_plugin_get_dir_name (
plugins_get_plugin_by_id ("GOffice_plot_pie"));
char *path = g_build_filename (dir, "gog-pie-prefs.glade", NULL);
GladeXML *gui = gnm_glade_xml_new (cc, path, "gog_pie_prefs", NULL);
g_free (path);
if (gui == NULL)
return NULL;
GtkWidget *w;
w = glade_xml_get_widget (gui, "rotation_spinner");
gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), pie->initial_angle);
g_signal_connect (G_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w))),
......@@ -77,6 +71,22 @@ gog_pie_plot_pref (GogPiePlot *pie, CommandContext *cc)
g_signal_connect (G_OBJECT (w),
"toggled",
G_CALLBACK (cb_use_style_toggled), pie);
}
GtkWidget *
gog_pie_plot_pref (GogPiePlot *pie, CommandContext *cc)
{
GtkWidget *w;
char const *dir = gnm_plugin_get_dir_name (
plugins_get_plugin_by_id ("GOffice_plot_pie"));
char *path = g_build_filename (dir, "gog-pie-prefs.glade", NULL);
GladeXML *gui = gnm_glade_xml_new (cc, path, "gog_pie_prefs", NULL);
g_free (path);
if (gui == NULL)
return NULL;
gog_pie_plot_pref_signal_connect (pie, gui);
w = glade_xml_get_widget (gui, "gog_pie_prefs");
g_object_set_data_full (G_OBJECT (w),
......@@ -87,6 +97,45 @@ gog_pie_plot_pref (GogPiePlot *pie, CommandContext *cc)
/****************************************************************************/
GtkWidget *gog_ring_plot_pref (GogRingPlot *ring, CommandContext *cc);
static void
cb_center_size_changed (GtkAdjustment *adj, GObject *ring)
{
g_object_set (ring, "center_size", adj->value, NULL);
}
GtkWidget *
gog_ring_plot_pref (GogRingPlot *ring, CommandContext *cc)
{
GtkWidget *w;
char const *dir = gnm_plugin_get_dir_name (
plugins_get_plugin_by_id ("GOffice_plot_pie"));
char *path = g_build_filename (dir, "gog-ring-prefs.glade", NULL);
GladeXML *gui = gnm_glade_xml_new (cc, path, "gog_ring_prefs", NULL);
g_free (path);
if (gui == NULL)
return NULL;
gog_pie_plot_pref_signal_connect (GOG_PIE_PLOT (ring), gui);
w = glade_xml_get_widget (gui, "center_size_spinner");
gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), ring->center_size);
g_signal_connect (G_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w))),
"value_changed",
G_CALLBACK (cb_center_size_changed), ring);
w = glade_xml_get_widget (gui, "gog_ring_prefs");
g_object_set_data_full (G_OBJECT (w),
"state", gui, (GDestroyNotify)g_object_unref);
return w;
}
/****************************************************************************/
GtkWidget *gog_pie_series_pref (GogPieSeries *series, CommandContext *cc);
static void
......
......@@ -2,7 +2,6 @@
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
<widget class="GtkWindow" id="window1">
<property name="title" translatable="yes">window1</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
......
......@@ -47,7 +47,7 @@ enum {
GNUMERIC_MODULE_PLUGIN_INFO_DECL;
static GObjectClass *parent_klass;
static GObjectClass *pie_parent_klass;
static GType gog_pie_view_get_type (void);
static void
......@@ -163,7 +163,7 @@ gog_pie_plot_class_init (GogPlotClass *plot_klass)
GObjectClass *gobject_klass = (GObjectClass *) plot_klass;
GogObjectClass *gog_klass = (GogObjectClass *) plot_klass;
parent_klass = g_type_class_peek_parent (plot_klass);
pie_parent_klass = g_type_class_peek_parent (plot_klass);
gobject_klass->set_property = gog_pie_plot_set_property;
gobject_klass->get_property = gog_pie_plot_get_property;
......@@ -198,10 +198,10 @@ gog_pie_plot_class_init (GogPlotClass *plot_klass)
plot_klass->desc.series.dim = dimensions;
plot_klass->desc.series.num_dim = G_N_ELEMENTS(dimensions);
}
plot_klass->desc.num_series_min = plot_klass->desc.num_series_max = 1;
plot_klass->desc.num_series_min = 1;
plot_klass->desc.num_series_max = 1;
plot_klass->series_type = gog_pie_series_get_type ();
plot_klass->foreach_elem = gog_pie_plot_foreach_elem;
plot_klass->supports_vary_by_element = TRUE;
}
static void
......@@ -214,6 +214,103 @@ GSF_CLASS (GogPiePlot, gog_pie_plot,
gog_pie_plot_class_init, gog_pie_plot_init,
GOG_PLOT_TYPE)
/*****************************************************************************/
enum {
RING_PLOT_PROP_0,
RING_PLOT_PROP_CENTER_SIZE,
};
typedef struct {
GogPiePlotClass base;
} GogRingPlotClass;
static GObjectClass *ring_parent_klass;
static void
gog_ring_plot_set_property (GObject *obj, guint param_id,
GValue const *value, GParamSpec *pspec)
{
GogRingPlot *ring = GOG_RING_PLOT (obj);
switch (param_id) {
case RING_PLOT_PROP_CENTER_SIZE :
ring->center_size = g_value_get_float (value);
break;
default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
return; /* NOTE : RETURN */
}
/* none of the attributes triggers a size change yet.
* When we add data labels we'll need it */
gog_object_emit_changed (GOG_OBJECT (obj), FALSE);
}
static void
gog_ring_plot_get_property (GObject *obj, guint param_id,
GValue *value, GParamSpec *pspec)
{
GogRingPlot *ring = GOG_RING_PLOT (obj);
switch (param_id) {
case RING_PLOT_PROP_CENTER_SIZE :
g_value_set_float (value, ring->center_size);
break;
default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
break;
}
}
static char const *
gog_ring_plot_type_name (G_GNUC_UNUSED GogObject const *item)
{
return "PlotRing";
}
extern gpointer gog_ring_plot_pref (GogRingPlot *ring, CommandContext *cc);
static gpointer
gog_ring_plot_editor (GogObject *item,
G_GNUC_UNUSED GogDataAllocator *dalloc,
CommandContext *cc)
{
return gog_ring_plot_pref (GOG_RING_PLOT (item), cc);
}
static void
gog_ring_plot_class_init (GogPiePlotClass *pie_plot_klass)
{
GObjectClass *gobject_klass = (GObjectClass *) pie_plot_klass;
GogObjectClass *gog_klass = (GogObjectClass *) pie_plot_klass;
GogPlotClass *plot_klass = (GogPlotClass *) pie_plot_klass;
ring_parent_klass = g_type_class_peek_parent (pie_plot_klass);
gobject_klass->set_property = gog_ring_plot_set_property;
gobject_klass->get_property = gog_ring_plot_get_property;
gog_klass->type_name = gog_ring_plot_type_name;
gog_klass->editor = gog_ring_plot_editor;
g_object_class_install_property (gobject_klass, RING_PLOT_PROP_CENTER_SIZE,
g_param_spec_float ("center_size", "center_size",
"Size of the center hole as a percentage of the radius",
0, 100., 0.,
G_PARAM_READWRITE));
plot_klass->desc.num_series_min = 1;
plot_klass->desc.num_series_max = G_MAXINT;
}
static void
gog_ring_plot_init (GogRingPlot *ring)
{
ring->center_size = 0.5;
}
GSF_CLASS (GogRingPlot, gog_ring_plot,
gog_ring_plot_class_init, gog_ring_plot_init,
GOG_PIE_PLOT_TYPE)
/*****************************************************************************/
typedef GogPlotView GogPieView;
typedef GogPlotViewClass GogPieViewClass;
......@@ -233,6 +330,24 @@ gog_pie_view_render (GogView *view, GogViewAllocation const *bbox)
GogTheme *theme = gog_object_get_theme (GOG_OBJECT (model));
GogStyle *style;
GSList *ptr;
unsigned num_series = 0;
unsigned index;
double center_radius;
double center_size = 0.0;
double r_ext, r_int;
/* compute number of valid series */
for (ptr = model->base.series ; ptr != NULL ; ptr = ptr->next) {
if (!gog_series_is_valid (GOG_SERIES (ptr->data)))
continue;
num_series++;
}
if (num_series <=0 )
return;
if (GOG_IS_RING_PLOT (model))
center_size = GOG_RING_PLOT(model)->center_size;
/* centre things */
cx = view->allocation.x + view->allocation.w/2.;
......@@ -241,18 +356,22 @@ gog_pie_view_render (GogView *view, GogViewAllocation const *bbox)
r = view->allocation.h;
if (r > view->allocation.w)
r = view->allocation.w;
r /= 2.;
r /= (1. + model->default_separation);
r /= 2. * (1. + model->default_separation);
default_sep = r * model->default_separation;
center_radius = r * center_size;
r *= 1. - center_size;
elem = model->base.index_num;
index = 1;
for (ptr = model->base.series ; ptr != NULL ; ptr = ptr->next) {
series = ptr->data;
if (!gog_series_is_valid (GOG_SERIES (series)))
continue;
r_int = center_radius + r * ((double)index - 1.0) / (double)num_series;
r_ext = center_radius + r * (double)index / (double)num_series;
style = GOG_STYLED_OBJECT (series)->style;
if (model->base.vary_style_by_element) {
style = gog_style_dup (style);
......@@ -260,7 +379,7 @@ gog_pie_view_render (GogView *view, GogViewAllocation const *bbox)
}
gog_renderer_push_style (view->renderer, style);
theta = (model->initial_angle + series->initial_angle) * 2. * M_PI / 360.;
theta = (model->initial_angle + series->initial_angle) * 2. * M_PI / 360. - M_PI / 2.;
scale = 2 * M_PI / series->total;
vals = go_data_vector_get_values (GO_DATA_VECTOR (series->base.values[1].data));
......@@ -269,8 +388,14 @@ gog_pie_view_render (GogView *view, GogViewAllocation const *bbox)
if (!finite (len) || len < 1e-3)
continue;
real_cx = cx + default_sep * cos (theta + len/2.);
real_cy = cy + default_sep * sin (theta + len/2.);
/* only separate the outer ring ? (check this) */
if (num_series == index) {
real_cx = cx + default_sep * cos (theta + len/2.);
real_cy = cy + default_sep * sin (theta + len/2.);
} else {
real_cx = cx;
real_cy = cy;
}
n = MAX_ARC_SEGMENTS * len / (2 * M_PI);
if (n < 12)
......@@ -278,27 +403,27 @@ gog_pie_view_render (GogView *view, GogViewAllocation const *bbox)
else if (n > MAX_ARC_SEGMENTS)
n = MAX_ARC_SEGMENTS;
n /= 2;
dt = (double)len / (double)n;
path[0].code = ART_MOVETO;
path[0].x = real_cx;
path[0].y = real_cy;
for (tmp = theta, j = 0; j <= n ; tmp += dt) {
j++;
path[j].code = ART_LINETO;
path[j].x = real_cx + r * cos (tmp);
path[j].y = real_cy + r * sin (tmp);
path[0].x = real_cx + r_int * cos (theta);
path[0].y = real_cy + r_int * sin (theta);
for (tmp = theta, j = 0; j <= n ; tmp += dt, j++) {
path[j + 1].code = ART_LINETO;
path[j + 1].x = real_cx + r_ext * cos (tmp);
path[j + 1].y = real_cy + r_ext * sin (tmp);
path[2 * n - j + 2].code = ART_LINETO;
path[2 * n - j + 2].x = real_cx + r_int * cos (tmp);
path[2 * n - j + 2].y = real_cy + r_int * sin (tmp);
}
j++;
path[j].code = ART_LINETO;
path[j].x = real_cx;
path[j].y = real_cy;
path[j+1].code = ART_END;
path[2 * n + 3].code = ART_END;
if (model->base.vary_style_by_element)
gog_theme_init_style (theme, style, klass,
model->base.index_num + k);
gog_renderer_draw_polygon (view->renderer, path,
r * len < 5 /* drop outline for thin segments */);
r * len < 5 /* drop outline for thin segments */);
theta += len;
}
......@@ -306,6 +431,8 @@ gog_pie_view_render (GogView *view, GogViewAllocation const *bbox)
gog_renderer_pop_style (view->renderer);
if (model->base.vary_style_by_element)
g_object_unref (style);
index ++;
}
}
......@@ -440,6 +567,7 @@ void
plugin_init (void)
{
gog_pie_plot_get_type ();
gog_ring_plot_get_type ();
}
void
......
......@@ -41,6 +41,18 @@ typedef struct {
GType gog_pie_plot_get_type (void);
typedef struct {
GogPiePlot base;
float center_size;
} GogRingPlot;
#define GOG_RING_PLOT_TYPE (gog_ring_plot_get_type ())
#define GOG_RING_PLOT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GOG_RING_PLOT_TYPE, GogRingPlot))
#define GOG_IS_RING_PLOT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GOG_RING_PLOT_TYPE))
GType gog_ring_plot_get_type (void);
typedef struct {
GogSeries base;
......
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
<widget class="GtkWindow" id="window1">
<property name="title" translatable="yes">window1</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<child>
<widget class="GtkTable" id="gog_ring_prefs">
<property name="border_width">5</property>
<property name="visible">True</property>
<property name="n_rows">4</property>
<property name="n_columns">3</property>
<property name="homogeneous">False</property>
<property name="row_spacing">5</property>
<property name="column_spacing">5</property>
<child>
<widget class="GtkLabel" id="label61">
<property name="visible">True</property>
<property name="label" translatable="yes">Slices start _at:</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">rotation_spinner</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label63">
<property name="visible">True</property>
<property name="label" translatable="yes">degrees</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="vary_style_by_element">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Vary colours by slice</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">3</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label64">
<property name="visible">True</property>
<property name="label" translatable="yes">_Slice Separation:</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">separation_spinner</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label65">
<property name="visible">True</property>
<property name="label" translatable="yes">%</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>