[et-mgmt-tools] [PATCH 4/9]: virt-manager: allow multiple sparclines per widget

Daniel P. Berrange berrange at redhat.com
Mon Oct 6 10:33:16 UTC 2008


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 at redhat.com
> 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 :|




More information about the et-mgmt-tools mailing list