On Sat, Oct 04, 2008 at 10:19:11PM +0200, Guido G?nther wrote: > Add num_sets property so a sparkline graph can have multiple lines > > all data is still stored in a 1D array so we can still use g_param_spec_double > for type checking. This removes the support for non cairo builds. What version of GTK first introduced support for Cairo in its widget sets. I don't want us to drop support for non-Cairo drawing if its still something people are likely to be using on older distros. The non-cairo code wasn't particularly complex / hard to maintain. Daniel > -- Guido > Add num_sets property so a sparkline graph can have multiple lines > > all data is still stored in a 1D array so we can still use g_param_spec_double > for type checking. This removes the support for non cairo builds. > > diff -r 9c478dd01da1 src/graphWidgets/sparkline.c > --- a/src/graphWidgets/sparkline.c Sat Oct 04 14:50:47 2008 +0200 > +++ b/src/graphWidgets/sparkline.c Sat Oct 04 14:51:42 2008 +0200 > @@ -44,6 +44,7 @@ > PROP_DATAARRAY, > PROP_FILLED, > PROP_REVERSED, > + PROP_NUMSETS, > }; > > static gpointer parent_class; > @@ -55,6 +56,8 @@ > { > gboolean filled; > gboolean reversed; > + gint num_sets; > + gint points_per_set; > GValueArray *data_array; > }; > > @@ -93,6 +96,8 @@ > priv->filled = TRUE; > priv->reversed = FALSE; > priv->data_array = g_value_array_new(0); > + priv->num_sets = 1; > + priv->points_per_set = 0; > > g_signal_connect (G_OBJECT (sparkline), "expose_event", > G_CALLBACK (gtk_sparkline_expose), NULL); > @@ -103,6 +108,7 @@ > { > GObjectClass *object_class = G_OBJECT_CLASS (class); > GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); > + GParamSpec *data_array_spec; > > parent_class = g_type_class_peek_parent (class); > > @@ -114,19 +120,28 @@ > widget_class->size_request = gtk_sparkline_size_request; > //widget_class->expose_event = gtk_sparkline_expose; > > + data_array_spec = g_param_spec_double("data_array_value", > + "Data array value", > + "GValueArray element", > + 0.0, > + 100.0, > + 0, > + G_PARAM_READABLE | G_PARAM_WRITABLE); > + > g_object_class_install_property (object_class, > PROP_DATAARRAY, > g_param_spec_value_array ("data_array", > "Data array", > "GValueArray of data", > - g_param_spec_double("data_array_value", > - "Data array value", > - "GValueArray element", > - 0.0, > - 100.0, > - 0, > - G_PARAM_READABLE | G_PARAM_WRITABLE), > + data_array_spec, > G_PARAM_READABLE | G_PARAM_WRITABLE)); > + g_object_class_install_property (object_class, > + PROP_NUMSETS, > + g_param_spec_int ("num_sets", > + "Num Sets", > + "Number of data sets in data", > + 1, 2, 1, > + G_PARAM_READABLE | G_PARAM_WRITABLE)); > g_object_class_install_property (object_class, > PROP_FILLED, > g_param_spec_boolean ("filled", > @@ -168,6 +183,10 @@ > g_value_set_boxed(value, priv->data_array); > break; > > + case PROP_NUMSETS: > + g_value_set_int(value, priv->num_sets); > + break; > + > case PROP_FILLED: > g_value_set_boolean(value, priv->filled); > break; > @@ -197,6 +216,7 @@ > case PROP_DATAARRAY: > g_value_array_free(priv->data_array); > priv->data_array = g_value_array_copy(g_value_get_boxed(value)); > + priv->points_per_set = priv->data_array->n_values / priv->num_sets; > gtk_widget_queue_draw(GTK_WIDGET(object)); > break; > > @@ -206,6 +226,10 @@ > > case PROP_REVERSED: > priv->reversed = g_value_get_boolean(value); > + break; > + > + case PROP_NUMSETS: > + priv->num_sets = g_value_get_int(value); > break; > > default: > @@ -225,22 +249,22 @@ > data = priv->data_array; > > if (area) { > - area->width = data->n_values; > + area->width = data->n_values / priv->num_sets; > area->height = 20; > } > } > > -static double get_y (GtkAllocation *cell_area, > - GValueArray *data, > - int index, int reversed) > +static double get_y (GtkSparklinePrivate *priv, GtkAllocation *cell_area, > + GValueArray *data, int set, int index) > { > double baseline_y = cell_area->height; > int n; > > - if (reversed) > - n = data->n_values - 1 - index; > + n = set * priv->points_per_set; > + if (priv->reversed) > + n += priv->points_per_set - 1 - index; > else > - n = index; > + n += index; > > GValue *val = g_value_array_get_nth(data, n); > return baseline_y - ((cell_area->height-1) * g_value_get_double(val)); > @@ -253,27 +277,15 @@ > { > GtkSparklinePrivate *priv; > GValueArray *data; > - GdkPoint *points; > - int index; > + int index, set; > double pixels_per_point; > GtkAllocation *cell_area = &widget->allocation; > -#if USE_CAIRO > cairo_t *cr; > -#endif > > priv = GTK_SPARKLINE_GET_PRIVATE (widget); > > data = priv->data_array; > - > - pixels_per_point = (double)cell_area->width / ((double)data->n_values-1); > - > - points = g_new(GdkPoint, data->n_values); > - for (index=0;index<data->n_values;index++) { > - double cx = ((double)index * pixels_per_point); > - double cy = get_y (cell_area, data, index, priv->reversed); > - points[index].x = cx; > - points[index].y = cy; > - } > + pixels_per_point = (double)cell_area->width / ((double)priv->points_per_set-1); > > gdk_draw_rectangle(widget->window, > widget->style->mid_gc[GTK_WIDGET_STATE (widget)], > @@ -300,7 +312,6 @@ > cell_area->height/NTICKS*index); > } > > -#if USE_CAIRO > cr = gdk_cairo_create (widget->window); > > /* Clip to the cell: */ > @@ -308,26 +319,33 @@ > cairo_rectangle (cr, 0, 0, cell_area->width, cell_area->height); > cairo_clip (cr); > > - /* Render the line: */ > + /* Render the lines: */ > cairo_set_line_width (cr, (double)0.5); > > - for (index=0;index<data->n_values;index++) { > - double cx = points[index].x; > - double cy = points[index].y; > - if (index) { > - cairo_line_to (cr, cx, cy); > - } else { > - cairo_move_to (cr, cx, cy); > + for (set=0; set < priv->num_sets; set++) { > + /* FIXME: add property to add line color */ > + if (set) > + cairo_set_source_rgb (cr, 0.25, 0.25, 0.25); > + else > + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); > + for (index=0; index < priv->points_per_set; index++) { > + double cx = ((double)index * pixels_per_point); > + double cy = get_y (priv, cell_area, data, set, index); > + if (index) { > + cairo_line_to (cr, cx, cy); > + } else { > + cairo_move_to (cr, cx, cy); > + } > } > - } > - if (data->n_values) { > - if (priv->filled) { > - double baseline_y = cell_area->height + cell_area->y; > - cairo_line_to (cr, cell_area->x + cell_area->width, baseline_y); > - cairo_line_to (cr, 0, baseline_y); > - cairo_fill (cr); > - } else { > - cairo_stroke (cr); > + if (priv->points_per_set) { > + if (priv->filled) { > + double baseline_y = cell_area->height + cell_area->y; > + cairo_line_to (cr, cell_area->x + cell_area->width, baseline_y); > + cairo_line_to (cr, 0, baseline_y); > + cairo_fill (cr); > + } else { > + cairo_stroke (cr); > + } > } > } > > @@ -336,14 +354,6 @@ > > cairo_destroy (cr); > > -#else > - gdk_draw_lines(widget->window, > - widget->style->fg_gc[GTK_WIDGET_STATE(widget)], > - points, data->n_values); > -#endif > - > - g_free(points); > - > return TRUE; > } > > _______________________________________________ > et-mgmt-tools mailing list > et-mgmt-tools@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/et-mgmt-tools -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| _______________________________________________ et-mgmt-tools mailing list et-mgmt-tools@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/et-mgmt-tools