X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fgtk-chart.c;h=0f6f1276bd44c0f3cebf76fec06a41c32f6dec10;hb=236cb5e47660876f46488ea8f76ecd5bebfa1fac;hp=3c9b9149a1939c99ae02c363ebc5a7e580f3208f;hpb=27f6e3b112df235c8e9afc9911b1f6bce208a001;p=chaz%2Fhomebank
diff --git a/src/gtk-chart.c b/src/gtk-chart.c
index 3c9b914..0f6f127 100644
--- a/src/gtk-chart.c
+++ b/src/gtk-chart.c
@@ -1,5 +1,5 @@
/* HomeBank -- Free, easy, personal accounting for everyone.
- * Copyright (C) 1995-2014 Maxime DOYEN
+ * Copyright (C) 1995-2019 Maxime DOYEN
*
* This file is part of HomeBank.
*
@@ -17,6 +17,7 @@
* along with this program. If not, see .
*/
+
#include
#include
@@ -27,10 +28,9 @@
#include "gtk-chart.h"
-#define HELPDRAW 0
-
#define MYDEBUG 0
+
#if MYDEBUG
#define DB(x) (x);
#else
@@ -38,25 +38,29 @@
#endif
+#define DYNAMICS 1
+
+#define DBGDRAW_RECT 0
+#define DBGDRAW_TEXT 0
+#define DBGDRAW_ITEM 0
+
+
static void gtk_chart_class_intern_init (gpointer);
-static void gtk_chart_class_init (GtkChartClass *klass);
-static void gtk_chart_init (GtkChart *chart);
-static void gtk_chart_destroy (GtkObject *chart);
+static void gtk_chart_class_init (GtkChartClass *klass);
+static void gtk_chart_init (GtkChart *chart);
+static void gtk_chart_dispose (GObject * object);
+static void gtk_chart_finalize (GObject * object);
-static gboolean
-drawarea_configure_event (GtkWidget *widget,
- GdkEventConfigure *event,
- gpointer user_data);
-static void drawarea_sizeallocate_callback(GtkWidget *widget, GtkAllocation *allocation, gpointer user_data);
+static gboolean drawarea_configure_event_callback(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data);
static void drawarea_realize_callback(GtkWidget *widget, gpointer user_data);
-static gboolean drawarea_draw_callback( GtkWidget *widget, GdkEventExpose *event, gpointer user_data);
+static gboolean drawarea_draw_callback(GtkWidget *widget, cairo_t *wcr, gpointer user_data);
static gboolean drawarea_motionnotifyevent_callback(GtkWidget *widget, GdkEventMotion *event, gpointer user_data);
static gboolean drawarea_querytooltip_callback(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data);
static gboolean drawarea_full_redraw(GtkWidget *widget, gpointer user_data);
static void chart_calculation(GtkChart *chart);
-static void chart_clear(GtkChart *chart, gboolean store);
+static void chart_clear(GtkChart *chart);
static void colchart_first_changed( GtkAdjustment *adj, gpointer user_data);
static void colchart_compute_range(GtkChart *chart);
@@ -65,12 +69,12 @@ static void colchart_scrollbar_setvalues(GtkChart *chart);
static void piechart_calculation(GtkChart *chart);
-static GdkPixbuf *create_color_pixbuf (GdkColor *col);
-static GtkWidget *legend_list_new(GtkChart *chart);
-static GtkHBoxClass *gtk_chart_parent_class = NULL;
+static GtkBoxClass *gtk_chart_parent_class = NULL;
+
+static const double dashed3[] = {3.0};
GType
gtk_chart_get_type ()
@@ -93,7 +97,7 @@ static GType chart_type = 0;
NULL
};
- chart_type = g_type_register_static (GTK_TYPE_HBOX, "GtkChart",
+ chart_type = g_type_register_static (GTK_TYPE_BOX, "GtkChart",
&chart_info, 0);
}
@@ -108,38 +112,45 @@ gtk_chart_class_intern_init (gpointer klass)
}
static void
-gtk_chart_class_init (GtkChartClass * klass)
+gtk_chart_class_init (GtkChartClass * class)
{
-//GObjectClass *gobject_class;
-GtkObjectClass *object_class;
-//GtkWidgetClass *widget_class;
-
- //gobject_class = (GObjectClass*) klass;
- object_class = (GtkObjectClass*) klass;
- //widget_class = (GtkWidgetClass*) klass;
-
- gtk_chart_parent_class = g_type_class_peek_parent (klass);
-
- DB( g_print("\n[gtkchart] class_init\n") );
-
- object_class->destroy = gtk_chart_destroy;
-
+GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+//GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+ DB( g_print("\n[gtkchart] class init\n") );
+
+ //gobject_class->get_property = gtk_chart_get_property;
+ //gobject_class->set_property = gtk_chart_set_property;
+ gobject_class->dispose = gtk_chart_dispose;
+ gobject_class->finalize = gtk_chart_finalize;
+
+ //widget_class->size_allocate = gtk_chart_size_allocate;
+
}
+
static void
gtk_chart_init (GtkChart * chart)
{
GtkWidget *widget, *vbox, *frame;
-GtkWidget *scrollwin, *treeview;
+
+ DB( g_print("\n[gtkchart] init\n") );
+
chart->surface = NULL;
chart->nb_items = 0;
chart->items = NULL;
chart->title = NULL;
+
+ chart->pfd = NULL;
chart->abs = FALSE;
chart->dual = FALSE;
+ chart->usrbarw = 0.0;
chart->barw = GTK_CHART_BARW;
-
+
+ chart->show_legend = TRUE;
+ chart->show_legend_wide = FALSE;
+ chart->show_mono = FALSE;
chart->active = -1;
chart->lastactive = -1;
@@ -152,24 +163,26 @@ GtkWidget *scrollwin, *treeview;
gtk_box_set_homogeneous(GTK_BOX(widget), FALSE);
- vbox = gtk_vbox_new (FALSE, 0);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start (GTK_BOX (widget), vbox, TRUE, TRUE, 0);
/* drawing area */
frame = gtk_frame_new(NULL);
- gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
chart->drawarea = gtk_drawing_area_new();
//gtk_widget_set_double_buffered (GTK_WIDGET(widget), FALSE);
gtk_container_add( GTK_CONTAINER(frame), chart->drawarea );
- gtk_widget_set_size_request(chart->drawarea, 150, 150 );
+ gtk_widget_set_size_request(chart->drawarea, 100, 100 );
+#if DYNAMICS == 1
gtk_widget_set_has_tooltip(chart->drawarea, TRUE);
+#endif
gtk_widget_show(chart->drawarea);
#if MYDEBUG == 1
- GtkStyle *style;
+ /*GtkStyle *style;
PangoFontDescription *font_desc;
g_print("draw_area font\n");
@@ -179,27 +192,20 @@ GtkWidget *scrollwin, *treeview;
g_print("family: %s\n", pango_font_description_get_family(font_desc) );
g_print("size: %d (%d)\n", pango_font_description_get_size (font_desc), pango_font_description_get_size (font_desc )/PANGO_SCALE );
-
+ */
#endif
/* scrollbar */
chart->adjustment = GTK_ADJUSTMENT(gtk_adjustment_new (0.0, 0.0, 1.0, 1.0, 1.0, 1.0));
- chart->scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (chart->adjustment));
+ chart->scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (chart->adjustment));
gtk_box_pack_start (GTK_BOX (vbox), chart->scrollbar, FALSE, TRUE, 0);
+ gtk_widget_show(chart->scrollbar);
+ g_signal_connect( G_OBJECT(chart->drawarea), "configure-event", G_CALLBACK (drawarea_configure_event_callback), chart);
+ g_signal_connect( G_OBJECT(chart->drawarea), "realize", G_CALLBACK(drawarea_realize_callback), chart ) ;
+ g_signal_connect( G_OBJECT(chart->drawarea), "draw", G_CALLBACK(drawarea_draw_callback), chart ) ;
- /* legend treeview */
- scrollwin = gtk_scrolled_window_new(NULL,NULL);
- chart->scrollwin = scrollwin;
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
- //gtk_container_set_border_width (GTK_CONTAINER(scrollwin), 5);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- treeview = legend_list_new(chart);
- chart->treeview = treeview;
- chart->legend = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
- gtk_container_add(GTK_CONTAINER(scrollwin), treeview);
- gtk_box_pack_start (GTK_BOX (widget), scrollwin, FALSE, FALSE, 0);
-
+#if DYNAMICS == 1
gtk_widget_add_events(GTK_WIDGET(chart->drawarea),
GDK_EXPOSURE_MASK |
//GDK_POINTER_MOTION_MASK |
@@ -208,14 +214,10 @@ GtkWidget *scrollwin, *treeview;
//GDK_BUTTON_RELEASE_MASK
);
- g_signal_connect( G_OBJECT(chart->drawarea),"configure-event", G_CALLBACK (drawarea_configure_event), chart);
- g_signal_connect( G_OBJECT(chart->drawarea), "size-allocate", G_CALLBACK(drawarea_sizeallocate_callback), chart ) ;
- g_signal_connect( G_OBJECT(chart->drawarea), "realize", G_CALLBACK(drawarea_realize_callback), chart ) ;
- g_signal_connect( G_OBJECT(chart->drawarea), "expose-event", G_CALLBACK(drawarea_draw_callback), chart ) ;
g_signal_connect( G_OBJECT(chart->drawarea), "query-tooltip", G_CALLBACK(drawarea_querytooltip_callback), chart );
g_signal_connect( G_OBJECT(chart->drawarea), "motion-notify-event", G_CALLBACK(drawarea_motionnotifyevent_callback), chart );
-
- g_signal_connect (G_OBJECT(chart->adjustment), "value_changed", G_CALLBACK (colchart_first_changed), chart);
+#endif
+ g_signal_connect (G_OBJECT(chart->adjustment), "value-changed", G_CALLBACK (colchart_first_changed), chart);
//g_signal_connect( G_OBJECT(chart->drawarea), "map-event", G_CALLBACK(chart_map), chart ) ;
//g_signal_connect( G_OBJECT(chart->drawarea), "button-press-event", G_CALLBACK(chart_button_press), chart );
@@ -230,6 +232,7 @@ gtk_chart_new (gint type)
{
GtkChart *chart;
+ DB( g_print("\n======================================================\n") );
DB( g_print("\n[gtkchart] new\n") );
chart = g_object_new (GTK_TYPE_CHART, NULL);
@@ -240,27 +243,55 @@ GtkChart *chart;
static void
-gtk_chart_destroy (GtkObject * object)
+gtk_chart_dispose (GObject *gobject)
{
-GtkChart *chart;
+//GtkChart *chart = GTK_CHART (object);
+
+ DB( g_print("\n[gtkchart] dispose\n") );
+
+ /* In dispose(), you are supposed to free all types referenced from this
+ * object which might themselves hold a reference to self. Generally,
+ * the most simple solution is to unref all members on which you own a
+ * reference.
+ */
+
+ /* dispose() might be called multiple times, so we must guard against
+ * calling g_object_unref() on an invalid GObject by setting the member
+ * NULL; g_clear_object() does this for us, atomically.
+ */
+ //g_clear_object (&self->priv->an_object);
+
+ /* Always chain up to the parent class; there is no need to check if
+ * the parent class implements the dispose() virtual function: it is
+ * always guaranteed to do so
+ */
+ G_OBJECT_CLASS (gtk_chart_parent_class)->dispose (gobject);
+}
- DB( g_print("\n[gtkchart] destroy\n") );
- g_return_if_fail (GTK_IS_CHART (object));
+static void
+gtk_chart_finalize (GObject * object)
+{
+GtkChart *chart = GTK_CHART (object);
- chart = GTK_CHART (object);
+ DB( g_print("\n[gtkchart] finalize\n") );
- chart_clear(chart, FALSE);
+ chart_clear(chart);
+ if(chart->pfd)
+ {
+ pango_font_description_free (chart->pfd);
+ chart->pfd = NULL;
+ }
+
if (chart->surface)
{
cairo_surface_destroy (chart->surface);
chart->surface = NULL;
}
- GTK_OBJECT_CLASS (gtk_chart_parent_class)->destroy (object);
-}
-
+ G_OBJECT_CLASS (gtk_chart_parent_class)->finalize (object);
+}
/*
@@ -268,43 +299,27 @@ GtkChart *chart;
*/
static gchar *chart_print_int(GtkChart *chart, gint value)
{
+ hb_strfmon_int(chart->buffer1, CHART_BUFFER_LENGTH-1, (gdouble)value, chart->kcur, chart->minor);
+ return chart->buffer1;
+}
- //mystrfmon(chart->buffer, CHART_BUFFER_LENGTH-1, (gdouble)value, chart->minor);
- mystrfmon_int(chart->buffer1, CHART_BUFFER_LENGTH-1, (gdouble)value, chart->minor);
-
- /*
- if(chart->minor)
- {
- value *= chart->minor_rate;
- strfmon(chart->buffer, CHART_BUFFER_LENGTH-1, "%!.0n ", (gdouble)value);
- strcat(chart->buffer, chart->minor_symbol);
- }
- else
- strfmon(chart->buffer, CHART_BUFFER_LENGTH-1, "%.0n", (gdouble)value);
- */
+/*
+** print a rate number
+*/
+static gchar *chart_print_rate(GtkChart *chart, gdouble value)
+{
+ g_snprintf (chart->buffer1, CHART_BUFFER_LENGTH-1, "%.2f%%", value);
return chart->buffer1;
}
+
/*
** print a double number
*/
static gchar *chart_print_double(GtkChart *chart, gchar *buffer, gdouble value)
{
-
- mystrfmon(buffer, CHART_BUFFER_LENGTH-1, value, chart->minor);
-
- /*
- if(chart->minor)
- {
- value *= chart->minor_rate;
- strfmon(chart->buffer, CHART_BUFFER_LENGTH-1, "%!n ", (gdouble)value);
- strcat(chart->buffer, chart->minor_symbol);
- }
- else
- strfmon(chart->buffer, CHART_BUFFER_LENGTH-1, "%n", (gdouble)value);
- */
-
+ hb_strfmon(buffer, CHART_BUFFER_LENGTH-1, value, chart->kcur, chart->minor);
return buffer;
}
@@ -312,7 +327,7 @@ static gchar *chart_print_double(GtkChart *chart, gchar *buffer, gdouble value)
/*
** clear any allocated memory
*/
-static void chart_clear(GtkChart *chart, gboolean store)
+static void chart_clear(GtkChart *chart)
{
gint i;
@@ -325,23 +340,25 @@ gint i;
chart->title = NULL;
}
+ if(chart->subtitle != NULL)
+ {
+ g_free(chart->subtitle);
+ chart->subtitle = NULL;
+ }
+
if(chart->items != NULL)
{
for(i=0;inb_items;i++)
{
ChartItem *item = &g_array_index(chart->items, ChartItem, i);
+ g_free(item->label); //we free label as it comes from a model_get into setup_with_model
g_free(item->legend);
}
g_array_free(chart->items, TRUE);
chart->items = NULL;
}
- if(store == TRUE)
- {
- gtk_list_store_clear (GTK_LIST_STORE(chart->legend));
- }
-
chart->nb_items = 0;
chart->total = 0;
@@ -363,13 +380,12 @@ static void chart_setup_with_model(GtkChart *chart, GtkTreeModel *list_store, gu
{
gint i;
gboolean valid;
-GtkTreeIter iter, l_iter;
-gint color;
-GdkColor colour;
+GtkTreeIter iter;
- DB( g_print("\n[gtkchart] setup with model\n") );
+ DB( g_print("\n[chart] setup with model\n") );
- chart_clear(chart, TRUE);
+ chart_clear(chart);
+
chart->nb_items = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL);
chart->items = g_array_sized_new(FALSE, FALSE, sizeof(ChartItem), chart->nb_items);
@@ -424,28 +440,19 @@ GdkColor colour;
item.serie2 = value2;
g_array_append_vals(chart->items, &item, 1);
- /* populate our legend list */
-
- color = i % chart->nb_cols;
- //color = id % chart->nb_cols;
-
- //DB( g_print ("Row %d: (%s, %2.f) color %d\n", id, title, value, color) );
-
- colour.red = COLTO16(chart->colors[color].r);
- colour.green = COLTO16(chart->colors[color].g);
- colour.blue = COLTO16(chart->colors[color].b);
-
- gtk_list_store_append (GTK_LIST_STORE(chart->legend), &l_iter);
- gtk_list_store_set (GTK_LIST_STORE(chart->legend), &l_iter,
- LST_LEGEND_COLOR, create_color_pixbuf (&colour),
- LST_LEGEND_TITLE, label,
- LST_LEGEND_AMOUNT, value1,
- -1);
-
+ /* ensure rawmin rawmax not equal */
+ if(chart->rawmin == chart->rawmax)
+ {
+ chart->rawmin = 0;
+ chart->rawmax = 100;
+ }
/* pie chart total sum */
chart->total += ABS(value1);
+ //leak
+ //don't g_free(label); here done into chart_clear
+
valid = gtk_tree_model_iter_next (list_store, &iter);
i++;
}
@@ -454,41 +461,51 @@ GdkColor colour;
for(i=0;inb_items;i++)
{
ChartItem *item = &g_array_index(chart->items, ChartItem, i);
+ gchar *strval;
+ strval = chart_print_double(chart, chart->buffer1, item->serie1);
item->rate = ABS(item->serie1*100/chart->total);
- item->legend = g_markup_printf_escaped("%s (%.2f%%)", item->label, item->rate);
+ item->legend = g_markup_printf_escaped("%s\n%s (%.f%%)", item->label, strval, item->rate);
}
- if( chart->type != CHART_TYPE_LINE )
- {
+ //g_print("total is %.2f\n", total);
+ //ensure the widget is mapped
+ //gtk_widget_map(chart);
- valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(chart->legend), &iter);
- while (valid)
- {
- gdouble amount, rate;
-
- gtk_tree_model_get(GTK_TREE_MODEL(chart->legend), &iter,
- LST_LEGEND_AMOUNT, &amount,
- -1);
+}
- rate = ABS( amount*100/chart->total);
- gtk_list_store_set(GTK_LIST_STORE(chart->legend), &iter,
- LST_LEGEND_RATE, rate,
- -1);
-
- valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(chart->legend), &iter);
- }
+static void chart_set_font_size(GtkChart *chart, PangoLayout *layout, gint font_size)
+{
+gint size = 10;
+
+ //TODO: use PANGO_SCALE INSTEAD
+ //DB( g_print("\n[chart] set font size\n") );
+
+ switch(font_size)
+ {
+ case CHART_FONT_SIZE_TITLE:
+ size = chart->pfd_size + 3;
+ break;
+ case CHART_FONT_SIZE_SUBTITLE:
+ size = chart->pfd_size + 1;
+ break;
+ case CHART_FONT_SIZE_NORMAL:
+ size = chart->pfd_size - 1;
+ break;
+ case CHART_FONT_SIZE_SMALL:
+ size = chart->pfd_size - 2;
+ break;
}
+ //DB( g_print(" size=%d\n", size) );
- //g_print("total is %.2f\n", total);
- //ensure the widget is mapped
- //gtk_widget_map(chart);
+ pango_font_description_set_size(chart->pfd, size * PANGO_SCALE);
-}
+ pango_layout_set_font_description (layout, chart->pfd);
+}
/*
@@ -499,14 +516,16 @@ static void chart_recompute(GtkChart *chart)
DB( g_print("\n[gtkchart] recompute\n") );
+
+ if( !gtk_widget_get_realized(chart->drawarea) || chart->surface == NULL )
+ return;
+
chart_calculation (chart);
switch(chart->type)
{
case CHART_TYPE_LINE:
case CHART_TYPE_COL:
- colchart_compute_range(chart);
-
colchart_calculation(chart);
gtk_adjustment_set_value(chart->adjustment, 0);
colchart_scrollbar_setvalues(chart);
@@ -517,7 +536,6 @@ static void chart_recompute(GtkChart *chart)
gtk_widget_hide(chart->scrollbar);
break;
}
-
}
@@ -554,14 +572,14 @@ static void colchart_compute_range(GtkChart *chart)
{
double lobound=chart->rawmin, hibound=chart->rawmax;
- DB( g_print("\n[gtkchart] bar compute range\n") );
+ DB( g_print("\n[column] compute range\n") );
/* comptute max ticks */
chart->range = chart->rawmax - chart->rawmin;
- gint maxticks = MIN(10,floor(chart->graph_height / (chart->font_h * 2)));
+ gint maxticks = MIN(10,floor(chart->graph.height / (chart->font_h * 2)));
DB( g_print(" raw :: [%.2f - %.2f] range=%.2f\n", chart->rawmin, chart->rawmax, chart->range) );
- DB( g_print(" raw :: maxticks=%d (%g / (%g*2))\n", maxticks, chart->graph_height, chart->font_h) );
+ DB( g_print(" raw :: maxticks=%d (%g / (%g*2))\n", maxticks, chart->graph.height, chart->font_h) );
DB( g_print("\n") );
chart->unit = CalculateStepSize((hibound-lobound), maxticks);
@@ -582,10 +600,11 @@ GtkWidget *drawarea = chart->drawarea;
GdkWindow *gdkwindow;
cairo_surface_t *surf = NULL;
cairo_t *cr;
-cairo_text_extents_t te;
-cairo_font_extents_t fe;
+int tw, th;
GtkAllocation allocation;
+PangoLayout *layout;
gchar *valstr;
+gint i;
DB( g_print("\n[gtkchart] calculation\n") );
@@ -599,7 +618,6 @@ gchar *valstr;
chart->w = allocation.width - (CHART_MARGIN*2);
chart->h = allocation.height - (CHART_MARGIN*2);
-
gdkwindow = gtk_widget_get_window(chart->drawarea);
if(!gdkwindow)
{
@@ -609,99 +627,204 @@ gchar *valstr;
else
cr = gdk_cairo_create (gdkwindow);
+ /* Create a PangoLayout, set the font and text */
+ layout = pango_cairo_create_layout (cr);
+
+
// compute title
chart->title_zh = 0;
if(chart->title != NULL)
{
- cairo_set_font_size(cr, CHART_FONT_SIZE_TITLE);
- cairo_font_extents(cr, &fe);
- chart->title_zh = fe.height;
+ chart_set_font_size(chart, layout, CHART_FONT_SIZE_TITLE);
+ pango_layout_set_text (layout, chart->title, -1);
+ pango_layout_get_size (layout, &tw, &th);
+ chart->title_zh = (th / PANGO_SCALE);
+ DB( g_print(" - title: %s w=%d h=%d\n", chart->title, tw, th) );
}
// compute subtitle
chart->subtitle_zh = 0;
if(chart->subtitle != NULL)
{
- cairo_set_font_size(cr, CHART_FONT_SIZE_PERIOD);
- cairo_font_extents(cr, &fe);
- chart->subtitle_zh = fe.height;
+ chart_set_font_size(chart, layout, CHART_FONT_SIZE_SUBTITLE);
+ pango_layout_set_text (layout, chart->subtitle, -1);
+ pango_layout_get_size (layout, &tw, &th);
+ chart->subtitle_zh = (th / PANGO_SCALE);
+ DB( g_print(" - title: %s w=%d h=%d\n", chart->subtitle, tw, th) );
}
-
chart->subtitle_y = chart->t + chart->title_zh;
- cairo_set_font_size(cr, CHART_FONT_SIZE_NORMAL);
- // compute amount scale
+ chart->graph.y = chart->t + chart->title_zh + chart->subtitle_zh;
+ chart->graph.height = chart->h - chart->title_zh - chart->subtitle_zh;
+
+ if(chart->title_zh > 0 || chart->subtitle_zh > 0)
+ {
+ chart->graph.y += CHART_MARGIN;
+ chart->graph.height -= CHART_MARGIN;
+ }
+
+
+ // compute other text
+ chart_set_font_size(chart, layout, CHART_FONT_SIZE_NORMAL);
+
+ // y-axis labels (amounts)
+ chart->scale_w = 0;
+ colchart_compute_range(chart);
+
valstr = chart_print_int(chart, (gint)chart->min);
- cairo_text_extents(cr, valstr, &te);
- chart->scale_w = te.width;
+ pango_layout_set_text (layout, valstr, -1);
+ pango_layout_get_size (layout, &tw, &th);
+ chart->scale_w = (tw / PANGO_SCALE);
+
valstr = chart_print_int(chart, (gint)chart->max);
- cairo_text_extents(cr, valstr, &te);
- chart->scale_w = MAX(chart->scale_w, te.width);
- DB( g_print(" - scale: %g,%g %g,%g\n", chart->l, 0.0, chart->scale_w, 0.0) );
+ pango_layout_set_text (layout, valstr, -1);
+ pango_layout_get_size (layout, &tw, &th);
+ chart->scale_w = MAX(chart->scale_w, (tw / PANGO_SCALE));
+
+ DB( g_print(" - scale: %d,%d %g,%g\n", chart->l, 0, chart->scale_w, 0.0) );
+
+ // todo: compute maxwidth of item labels
+ double label_w = 0;
+ for(i=0;inb_items;i++)
+ {
+ ChartItem *item = &g_array_index(chart->items, ChartItem, i);
+
+ // label width
+ pango_layout_set_text (layout, item->label, -1);
+ pango_layout_get_size (layout, &tw, &th);
+ label_w = MAX(label_w, (tw / PANGO_SCALE));
+ }
+ chart->label_w = label_w;
// compute font height
- cairo_font_extents(cr, &fe);
- chart->font_h = fe.height;
+ chart->font_h = (th / PANGO_SCALE);
// compute graph region
switch(chart->type)
{
case CHART_TYPE_LINE:
case CHART_TYPE_COL:
- chart->graph_x = chart->l + chart->scale_w + 2;
- chart->graph_y = chart->t + chart->title_zh + chart->subtitle_zh;
- chart->graph_width = chart->w - chart->scale_w - 2;
- chart->graph_height = chart->h - chart->title_zh - chart->subtitle_zh;
+ chart->graph.x = chart->l + chart->scale_w + 2;
+ chart->graph.width = chart->w - chart->scale_w - 2;
break;
case CHART_TYPE_PIE:
- chart->graph_x = chart->l;
- chart->graph_y = chart->t + chart->title_zh + chart->subtitle_zh;
- chart->graph_width = chart->w;
- chart->graph_height = chart->h - chart->title_zh - chart->subtitle_zh;
+ chart->graph.x = chart->l;
+ chart->graph.width = chart->w;
break;
}
- if(chart->title_zh > 0 || chart->subtitle_zh > 0)
+ DB( g_print(" - graph : %g,%g %g,%g\n", chart->graph.x, chart->graph.y, chart->graph.width, chart->graph.height) );
+
+
+ if( ((chart->type == CHART_TYPE_LINE) || (chart->type == CHART_TYPE_COL)) && chart->show_xval)
+ chart->graph.height -= (chart->font_h + CHART_SPACING);
+
+ // compute: each legend column width, and legend width
+ if(chart->show_legend)
{
- chart->graph_y += CHART_MARGIN;
- chart->graph_height -= CHART_MARGIN;
- }
+ chart_set_font_size(chart, layout, CHART_FONT_SIZE_SMALL);
+
+ //we compute the rate text here to get the font height
+ pango_layout_set_text (layout, "00.00 %", -1);
+ pango_layout_get_size (layout, &tw, &th);
+
+ chart->legend_font_h = (th / PANGO_SCALE);
+
+ // labels not much than 1/4 of graph
+ gdouble lw = floor(chart->graph.width / 4);
+ chart->legend_label_w = MIN(chart->label_w, lw);
+
+ chart->legend.width = chart->legend_font_h + CHART_SPACING + chart->legend_label_w;
+ chart->legend.height = MIN(floor(chart->nb_items * chart->legend_font_h * CHART_LINE_SPACING), chart->graph.height);
- if(chart->type != CHART_TYPE_PIE && chart->show_xval)
- chart->graph_height -= (chart->font_h + CHART_SPACING);
+ if(chart->show_legend_wide )
+ {
+ chart->legend_value_w = chart->scale_w;
+ chart->legend_rate_w = (tw / PANGO_SCALE);
+ chart->legend.width += CHART_SPACING + chart->legend_value_w + CHART_SPACING + chart->legend_rate_w;
+ }
+
+ //if legend visible, substract
+ chart->graph.width -= (chart->legend.width + CHART_MARGIN);
+
+ chart->legend.x = chart->graph.x + chart->graph.width + CHART_MARGIN;
+ chart->legend.y = chart->graph.y;
+
+ DB( g_print(" - graph : %g %g %g %g\n", chart->graph.x, chart->graph.y, chart->graph.width, chart->graph.height ) );
+ DB( g_print(" - legend: %g %g %g %g\n", chart->legend.x, chart->legend.y, chart->legend.width, chart->legend.height ) );
+ }
+
+ g_object_unref (layout);
cairo_destroy(cr);
cairo_surface_destroy(surf);
-
}
static void colchart_calculation(GtkChart *chart)
{
-gint blkw;
+gint blkw, maxvisi;
- DB( g_print("\n[gtkchart] bar calculation\n") );
+ DB( g_print("\n[column] calculation\n") );
+ /* from fusionchart
+ the bar has a default width of 41
+ min space is 3 and min barw is 8
+ */
+
+ // new computing
+ if( chart->usrbarw > 0.0 )
+ {
+ blkw = chart->usrbarw;
+ chart->barw = blkw - 3;
+ }
+ else
+ {
+ //minvisi = floor(chart->graph.width / (GTK_CHART_MINBARW+3) );
+ maxvisi = floor(chart->graph.width / (GTK_CHART_MAXBARW+3) );
+
+ DB( g_print(" width=%.2f, nb=%d, minvisi=%d, maxvisi=%d\n", chart->graph.width, chart->nb_items, minvisi, maxvisi) );
+
+ if( chart->nb_items <= maxvisi )
+ {
+ chart->barw = GTK_CHART_MAXBARW;
+ blkw = GTK_CHART_MAXBARW + ( chart->graph.width - (chart->nb_items*GTK_CHART_MAXBARW) ) / chart->nb_items;
+ }
+ else
+ {
+ blkw = MAX(GTK_CHART_MINBARW, floor(chart->graph.width / chart->nb_items));
+ chart->barw = blkw - 3;
+ }
+ }
- //if expand : we compute available space
- //chart->barw = MAX(32, (chart->graph_width)/chart->nb_items);
- //chart->barw = 32; // usr setted or defaut to BARW
+ if(chart->dual)
+ chart->barw = chart->barw / 2;
+
+ DB( g_print(" blkw=%d, barw=%2.f\n", blkw, chart->barw) );
- // if fixed
- blkw = chart->barw + 3;
- if( chart->dual )
- blkw = (chart->barw * 2) + 3;
chart->blkw = blkw;
- chart->visible = chart->graph_width / blkw;
+ chart->visible = chart->graph.width / blkw;
chart->visible = MIN(chart->visible, chart->nb_items);
chart->ox = chart->l;
- chart->oy = floor(chart->graph_y + (chart->max/chart->range) * chart->graph_height);
+ chart->oy = chart->b;
+ if(chart->range > 0)
+ chart->oy = floor(chart->graph.y + (chart->max/chart->range) * chart->graph.height);
DB( g_print(" + ox=%f oy=%f\n", chart->ox, chart->oy) );
+ /* todo: hack on every xval */
+ if(chart->label_w > 0 && chart->visible > 0)
+ {
+ if( chart->label_w <= chart->blkw )
+ chart->every_xval = 1;
+ else
+ chart->every_xval = floor( 0.5 + (chart->label_w + CHART_SPACING) / chart->blkw);
+
+ DB( g_print(" vis=%3d/%3d, xlabel_w=%g, blk_w=%g :: everyxval=%d\n", chart->visible, chart->nb_items, chart->label_w, chart->blkw, chart->every_xval) );
+ }
}
@@ -711,180 +834,108 @@ gint blkw;
static void colchart_draw_scale(GtkWidget *widget, gpointer user_data)
{
GtkChart *chart = GTK_CHART(user_data);
+cairo_t *cr;
double x, y;
gdouble curxval;
gint i, first;
+PangoLayout *layout;
+gchar *valstr;
+int tw, th;
- DB( g_print("\n(gtkline) draw scale\n") );
-cairo_t *cr;
-//static const double dashed3[] = {2.0};
+ DB( g_print("\n[column] draw scale\n") );
- //gdkwindow = gtk_widget_get_window(widget);
- //cr = gdk_cairo_create (gdkwindow);
- //cr = gdk_cairo_create (widget->window);
cr = cairo_create (chart->surface);
+ layout = pango_cairo_create_layout (cr);
+ chart_set_font_size(chart, layout, CHART_FONT_SIZE_NORMAL);
+ cairo_set_line_width (cr, 1);
- cairo_set_line_width(cr, 1);
-
/* clip */
//cairo_rectangle(cr, CHART_MARGIN, 0, chart->w, chart->h + CHART_MARGIN);
//cairo_clip(cr);
- /* draw vertical lines + legend */
- if(chart->show_xval)
- {
- x = chart->graph_x + 1.5 + (chart->barw/2);
- y = chart->oy;
- first = gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
-
- for(i=first; i<(first+chart->visible) ;i++)
- {
- if( !(i % chart->every_xval) )
- {
- //cairo_user_set_rgbcol(cr, &global_colors[GREY1]);
- cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 0.05);
-
- cairo_move_to(cr, x, chart->graph_y);
- cairo_line_to(cr, x, chart->b);
- cairo_stroke(cr);
- }
-
- x += chart->blkw;
- }
- }
-
- /* horizontal lines */
-
+ // Y-scale lines + labels (amounts)
curxval = chart->max;
- for(i=0;i<=chart->div;i++)
+ cairo_set_dash(cr, 0, 0, 0);
+ for(i=0 ; i<=chart->div ; i++)
{
-
- //if(i == 0 || i == chart->div) /* top/bottom line */
- //{
- //cairo_set_dash(cr, 0, 0, 0);
- //cairo_user_set_rgbcol(cr, &global_colors[GREY1]);
- cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 0.1);
- //}
- //else /* intermediate line (dotted) */
- //{
- //cairo_set_dash(cr, dashed3, 1, 0);
- //cairo_user_set_rgbcol(cr, &global_colors[GREY1]);
- //}
-
- /* x axis ? */
- if( curxval == 0.0 )
- {
- //cairo_set_dash(cr, 0, 0, 0);
- cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 0.8);
- }
-
- y = 0.5 + floor(chart->graph_y + ((i * chart->unit) / chart->range) * chart->graph_height);
-
- DB( g_print(" + i=%d :: y=%f (%f / %f) * %f\n", i, y, i*chart->unit, chart->range, chart->graph_height) );
-
- cairo_move_to(cr, chart->graph_x, y);
- cairo_line_to(cr, chart->graph_x + chart->graph_width, y);
- cairo_stroke(cr);
+ y = 0.5 + floor (chart->graph.y + ((i * chart->unit) / chart->range) * chart->graph.height);
+ //DB( g_print(" + i=%d :: y=%f (%f / %f) * %f\n", i, y, i*chart->unit, chart->range, chart->graph.height) );
+
+ // curxval = 0.0 is x-axis
+ cairo_user_set_rgbacol (cr, &global_colors[THTEXT], ( curxval == 0.0 ) ? 0.8 : 0.1);
+ cairo_move_to (cr, chart->graph.x, y);
+ cairo_line_to (cr, chart->graph.x + chart->graph.width, y);
+ cairo_stroke (cr);
+
+ cairo_user_set_rgbacol (cr, &global_colors[THTEXT], 0.78);
+ valstr = chart_print_int(chart, (gint)curxval);
+ pango_layout_set_text (layout, valstr, -1);
+ pango_layout_get_size (layout, &tw, &th);
+ cairo_move_to (cr, chart->graph.x - (tw / PANGO_SCALE) - 2, y - ((th / PANGO_SCALE)*0.8) );
+ pango_cairo_show_layout (cr, layout);
curxval -= chart->unit;
}
- cairo_destroy(cr);
-
-}
-
-
-static void colchart_draw_scale_text(GtkWidget *widget, gpointer user_data)
-{
-GtkChart *chart = GTK_CHART(user_data);
-double x, y;
-gdouble curxval;
-gchar *valstr;
-gint i, first;
-
- DB( g_print("----------------------\n(gtkline) draw scale text\n") );
-
-cairo_t *cr;
-cairo_text_extents_t te;
-
- //GdkWindow *gdkwindow;
- //gdkwindow = gtk_widget_get_window(widget);
-
- //cr = gdk_cairo_create (gdkwindow);
- //cr = gdk_cairo_create (widget->window);
- cr = cairo_create (chart->surface);
-
- cairo_set_line_width(cr, 1);
-
- /* clip */
- //cairo_rectangle(cr, CHART_MARGIN, 0, chart->w, chart->h + CHART_MARGIN);
- //cairo_clip(cr);
-
- //cairo_set_operator(cr, CAIRO_OPERATOR_SATURATE);
-
- /* draw x-legend (items) */
- if(chart->show_xval)
+ // X-scale lines + labels (items)
+ if(chart->show_xval && chart->every_xval > 0 )
{
- x = chart->graph_x + 1.5 + (chart->barw/2);
+ x = chart->graph.x + (chart->blkw/2);
y = chart->b - chart->font_h;
- first = (gint)gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
+ first = gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
- for(i=first; i<(first+chart->visible) ;i++)
- {
- ChartItem *item = &g_array_index(chart->items, ChartItem, i);
+ cairo_set_dash(cr, dashed3, 1, 0);
+ for(i=first ; i<(first+chart->visible) ; i++)
+ {
if( !(i % chart->every_xval) )
{
+ ChartItem *item = &g_array_index(chart->items, ChartItem, i);
+
+ cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 0.1);
+ cairo_move_to(cr, x, chart->graph.y);
+ cairo_line_to(cr, x, chart->b - chart->font_h);
+ cairo_stroke(cr);
+
valstr = item->label;
- cairo_text_extents(cr, valstr, &te);
-
- DB( g_print("%s w=%f h=%f\n", valstr, te.width, te.height) );
-
+ pango_layout_set_text (layout, valstr, -1);
+ pango_layout_get_size (layout, &tw, &th);
cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 0.78);
- //cairo_move_to(cr, x - (te.width/2), y - te.y_bearing);
- cairo_move_to(cr, x, y - te.y_bearing);
- cairo_show_text(cr, valstr);
-
- /*cairo_user_set_rgbcol(cr, &global_colors[TEXT]);
- cairo_move_to(cr, x, y);
- cairo_line_to(cr, x, y + te.height);
- cairo_stroke(cr);*/
+ cairo_move_to(cr, x - ((tw / PANGO_SCALE)/2), y);
+ pango_cairo_show_layout (cr, layout);
}
-
x += chart->blkw;
}
}
- /* draw y-legend (amount) */
-
- curxval = chart->max;
- for(i=0;i<=chart->div;i++)
+ /* average */
+ if( chart->show_average )
{
- y = 0.5 + floor(chart->graph_y + ((i * chart->unit) / chart->range) * chart->graph_height);
-
- DB( g_print(" + i=%d :: y=%f (%f / %f) * %f\n", i, y, i*chart->unit, chart->range, chart->graph_height) );
-
- if( curxval != 0.0 )
+ if( chart->average < 0 )
{
- valstr = chart_print_int(chart, (gint)curxval);
- cairo_text_extents(cr, valstr, &te);
-
- //DB( g_print("'%s', %f %f %f %f %f %f\n", valstr, te.x_bearing, te.y_bearing, te.width, te.height, te.x_advance, te.y_advance) );
-
- // draw texts
- cairo_move_to(cr, chart->graph_x - te.x_bearing - te.width - 2, y + (( te.height)/2));
- cairo_user_set_rgbacol (cr, &global_colors[THTEXT], 0.78);
- cairo_show_text(cr, valstr);
-
+ y = 0.5 + chart->oy + (ABS(chart->average)/chart->range) * chart->graph.height;
+ }
+ else
+ {
+ y = 0.5 + chart->oy - (ABS(chart->average)/chart->range) * chart->graph.height;
}
- curxval -= chart->unit;
+ DB( g_print(" draw average: x%d, y%f, w%d\n", chart->l, y, chart->w) );
+
+ cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 1.0);
+ cairo_set_line_width(cr, 1.0);
+ cairo_set_dash (cr, dashed3, 1, 0);
+ cairo_move_to(cr, chart->graph.x, y);
+ cairo_line_to (cr, chart->graph.x + chart->graph.width, y);
+ cairo_stroke(cr);
}
+ g_object_unref (layout);
cairo_destroy(cr);
}
+
/*
** draw all visible bars
*/
@@ -895,26 +946,31 @@ cairo_t *cr;
double x, x2, y2, h;
gint i, first;
- DB( g_print("\n[gtkchart] bar draw bars\n") );
+ DB( g_print("\n[column] draw bars\n") );
- x = chart->graph_x;
+ x = chart->graph.x;
first = (gint)gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
cr = gdk_cairo_create (gtk_widget_get_window(widget));
//cr = cairo_create (chart->surface);
- #if HELPDRAW == 1
+ DB( g_print(" x=%.2f first=%d, blkw=%.2f, barw=%.2f\n", x, first, chart->blkw, chart->barw ) );
+
+ #if DBGDRAW_ITEM == 1
x2 = x + 0.5;
cairo_set_line_width(cr, 1.0);
+ double dashlength;
+ dashlength = 4;
+ cairo_set_dash (cr, &dashlength, 1, 0);
cairo_set_source_rgb(cr, 1.0, 0.0, 1.0); // violet
for(i=first; i<=(first+chart->visible) ;i++)
{
- cairo_move_to(cr, x2, chart->graph_y);
- cairo_line_to(cr, x2, chart->graph_x + chart->graph_height);
-
+ cairo_move_to(cr, x2, chart->graph.y);
+ cairo_line_to(cr, x2, chart->graph.x + chart->graph.height);
x2 += chart->blkw;
}
cairo_stroke(cr);
+ cairo_set_dash (cr, &dashlength, 0, 0);
#endif
for(i=first; i<(first+chart->visible) ;i++)
@@ -925,20 +981,30 @@ gint i, first;
//if(!chart->datas1[i]) goto nextbar;
- color = i % chart->nb_cols;
+ if(!chart->show_mono)
+ color = i % chart->color_scheme.nb_cols;
+ else
+ color = chart->color_scheme.cs_green;
- cairo_user_set_rgbcol_over(cr, &chart->colors[color], i == chart->active);
+ cairo_user_set_rgbcol_over(cr, &chart->color_scheme.colors[color], i == chart->active);
+ x2 = x + (chart->blkw/2) - 1;
+ x2 = !chart->dual ? x2 - (barw/2) : x2 - barw - 1;
+
if(item->serie1)
{
- x2 = x;
- h = floor((item->serie1 / chart->range) * chart->graph_height);
+ h = floor((item->serie1 / chart->range) * chart->graph.height);
y2 = chart->oy - h;
if(item->serie1 < 0.0)
+ {
y2 += 1;
-
- //DB( g_print(" + i=%d :: y2=%f h=%f (%f / %f) * %f\n", i, y2, h, chart->datas1[i], chart->range, chart->graph_height ) );
-
+ if(chart->show_mono)
+ {
+ color = chart->color_scheme.cs_red;
+ cairo_user_set_rgbcol_over(cr, &chart->color_scheme.colors[color], i == chart->active);
+ }
+ }
+ //DB( g_print(" + i=%d :: y2=%f h=%f (%f / %f) * %f\n", i, y2, h, chart->datas1[i], chart->range, chart->graph.height ) );
cairo_rectangle(cr, x2+2, y2, barw, h);
cairo_fill(cr);
@@ -947,9 +1013,8 @@ gint i, first;
if( chart->dual && item->serie2)
{
-
- x2 = x + barw + 1;
- h = floor((item->serie2 / chart->range) * chart->graph_height);
+ x2 = x2 + barw + 1;
+ h = floor((item->serie2 / chart->range) * chart->graph.height);
y2 = chart->oy - h;
cairo_rectangle(cr, x2+2, y2, barw, h);
@@ -979,9 +1044,9 @@ gint index, first, px;
retval = -1;
- if( x <= chart->r && x >= chart->graph_x && y >= chart->graph_y && y <= chart->b )
+ if( x <= chart->r && x >= chart->graph.x && y >= chart->graph.y && y <= chart->b )
{
- px = (x - chart->graph_x);
+ px = (x - chart->graph.x);
//py = (y - chart->oy);
first = gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
index = first + (px / chart->blkw);
@@ -998,7 +1063,7 @@ static void colchart_first_changed( GtkAdjustment *adj, gpointer user_data)
GtkChart *chart = GTK_CHART(user_data);
//gint first;
- DB( g_print("\n[gtkchart] bar first changed\n") );
+ DB( g_print("\n[column] first changed\n") );
//first = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj));
@@ -1013,6 +1078,8 @@ GtkChart *chart = GTK_CHART(user_data);
//gtk_scale_set_digits (GTK_SCALE (vscale), (gint) adj->value);
drawarea_full_redraw (chart->drawarea, chart);
+
+ DB( g_print("gtk_widget_queue_draw\n") );
gtk_widget_queue_draw(chart->drawarea);
}
@@ -1027,7 +1094,7 @@ gint first;
g_return_if_fail (GTK_IS_ADJUSTMENT (adj));
- DB( g_print("\n[gtkchart] sb_set_values\n") );
+ DB( g_print("\n[column] sb_set_values\n") );
first = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj));
@@ -1065,7 +1132,7 @@ static void linechart_draw_plot(cairo_t *cr, double x, double y, double r, GtkCh
cairo_stroke_preserve(cr);
//cairo_set_source_rgb(cr, COLTOCAIRO(0), COLTOCAIRO(119), COLTOCAIRO(204));
- cairo_user_set_rgbcol(cr, &chart->colors[chart->cs_blue]);
+ cairo_user_set_rgbcol(cr, &chart->color_scheme.colors[chart->color_scheme.cs_blue]);
cairo_fill(cr);
}
@@ -1078,9 +1145,9 @@ double x, y, x2, y2, firstx, lastx, linew;
gint first, i;
- DB( g_print("\n(gtkline) line draw lines\n") );
+ DB( g_print("\n[line] draw lines\n") );
- x = chart->graph_x;
+ x = chart->graph.x;
y = chart->oy;
first = (gint)gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
@@ -1092,17 +1159,21 @@ gint first, i;
//cairo_clip(cr);
- #if HELPDRAW == 1
+ #if DBGDRAW_ITEM == 1
x2 = x + 0.5;
cairo_set_line_width(cr, 1.0);
+ double dashlength = 4;
+ cairo_set_dash (cr, &dashlength, 1, 0);
cairo_set_source_rgb(cr, 1.0, 0.0, 1.0); // violet
for(i=first; i<=(first+chart->visible) ;i++)
{
- cairo_move_to(cr, x2, chart->graph_y);
- cairo_line_to(cr, x2, chart->graph_x + chart->graph_height);
- cairo_stroke(cr);
+ cairo_move_to(cr, x2, chart->graph.y);
+ cairo_line_to(cr, x2, chart->graph.x + chart->graph.height);
x2 += chart->blkw;
}
+ cairo_stroke(cr);
+
+ cairo_set_dash (cr, &dashlength, 0, 0);
#endif
//todo: it should be possible to draw line & plot together using surface and composite fill, or sub path ??
@@ -1122,7 +1193,7 @@ gint first, i;
ChartItem *item = &g_array_index(chart->items, ChartItem, i);
x2 = x + (chart->blkw)/2;
- y2 = chart->oy - (item->serie1 / chart->range) * chart->graph_height;
+ y2 = chart->oy - (item->serie1 / chart->range) * chart->graph.height;
if( i == first)
{
firstx = x2;
@@ -1142,17 +1213,17 @@ gint first, i;
x += chart->blkw;
}
- cairo_user_set_rgbcol(cr, &chart->colors[chart->cs_blue]);
+ cairo_user_set_rgbcol(cr, &chart->color_scheme.colors[chart->color_scheme.cs_blue]);
cairo_stroke_preserve(cr);
cairo_line_to(cr, lastx, y);
cairo_line_to(cr, firstx, y);
cairo_close_path(cr);
- cairo_user_set_rgbacol(cr, &chart->colors[chart->cs_blue], 0.15);
+ cairo_user_set_rgbacol(cr, &chart->color_scheme.colors[chart->color_scheme.cs_blue], AREA_ALPHA);
cairo_fill(cr);
- x = chart->graph_x;
+ x = chart->graph.x;
y = chart->oy;
first = (gint)gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
@@ -1162,23 +1233,87 @@ gint first, i;
ChartItem *item = &g_array_index(chart->items, ChartItem, i);
x2 = x + (chart->blkw)/2;
- y2 = chart->oy - (item->serie1 / chart->range) * chart->graph_height;
- linechart_draw_plot(cr, x2, y2, i == chart->active ? linew+1 : linew, chart);
- x += chart->blkw;
+ y2 = chart->oy - (item->serie1 / chart->range) * chart->graph.height;
+
+ //test draw vertical selection line
+ if( i == chart->active )
+ {
+ cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 0.1);
+
+ //cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); //blue
+ cairo_set_line_width(cr, 1.0);
+ cairo_move_to(cr, x2, chart->graph.y);
+ cairo_line_to(cr, x2, chart->b - chart->font_h);
+ cairo_stroke(cr);
+ }
+
+
+ linechart_draw_plot(cr, x2, y2, i == chart->active ? linew+1 : linew, chart);
+
+
+ x += chart->blkw;
+ }
+
+ /* average */
+
+ if( chart->show_average )
+ {
+ if( chart->average < 0 )
+ {
+ y = 0.5 + chart->oy + (ABS(chart->average)/chart->range) * chart->graph.height;
+ }
+ else
+ {
+ y = 0.5 + chart->oy - (ABS(chart->average)/chart->range) * chart->graph.height;
+ }
+
+ y2 = (ABS(chart->min)/chart->range) * chart->graph.height - (y - chart->oy) + 1;
+
+ DB( g_print(" draw average: x%d, y%f, w%d, h%f\n", chart->l, y, chart->w, y2) );
+
+ cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 1.0);
+ cairo_set_line_width(cr, 1.0);
+ cairo_set_dash (cr, dashed3, 1, 0);
+ cairo_move_to(cr, chart->graph.x, y);
+ cairo_line_to (cr, chart->graph.x + chart->graph.width, y);
+ cairo_stroke(cr);
}
+
+
+
+ /* overdrawn */
+ DB( g_print(" min=%.2f range=%.2f\n", chart->min, chart->range) );
-/* overdrawn */
if( chart->show_over )
{
- if(chart->minimum != 0 && chart->minimum >= chart->min)
+ //if(chart->minimum != 0 && chart->minimum >= chart->min)
+ if(chart->minimum >= chart->min)
{
- y = chart->oy - (chart->minimum/chart->range) * chart->graph_height;
- cairo_set_source_rgba(cr, COLTOCAIRO(255), COLTOCAIRO(0), COLTOCAIRO(0), .15);
+ if( chart->minimum < 0 )
+ {
+ y = 0.5 + chart->oy + (ABS(chart->minimum)/chart->range) * chart->graph.height;
+ }
+ else
+ {
+ y = 0.5 + chart->oy - (ABS(chart->minimum)/chart->range) * chart->graph.height;
+ }
- DB( g_print(" draw over: %f, %f, %f, %f\n", chart->l, y, chart->w, chart->b - y) );
+ y2 = (ABS(chart->min)/chart->range) * chart->graph.height - (y - chart->oy) + 1;
- cairo_rectangle(cr, chart->graph_x, y, chart->graph_width, chart->b - y);
+ cairo_set_source_rgba(cr, COLTOCAIRO(255), COLTOCAIRO(0), COLTOCAIRO(0), AREA_ALPHA / 2);
+
+ DB( g_print(" draw over: x%d, y%f, w%d, h%f\n", chart->l, y, chart->w, y2) );
+
+ cairo_rectangle(cr, chart->graph.x, y, chart->graph.width, y2 );
cairo_fill(cr);
+
+ cairo_set_line_width(cr, 1.0);
+ cairo_set_source_rgb(cr, COLTOCAIRO(255), COLTOCAIRO(0), COLTOCAIRO(0));
+
+ cairo_set_dash (cr, dashed3, 1, 0);
+ cairo_move_to(cr, chart->graph.x, y);
+ cairo_line_to (cr, chart->graph.x + chart->graph.width, y);
+ cairo_stroke(cr);
}
}
@@ -1199,11 +1334,13 @@ GtkChart *chart = GTK_CHART(user_data);
gint retval;
gint first, index, px;
+ DB( g_print("\n[line] get active\n") );
+
retval = -1;
- if( x <= chart->r && x >= chart->l )
+ if( x <= chart->r && x >= chart->graph.x && y >= chart->graph.y && y <= chart->b )
{
- px = (x - chart->graph_x);
+ px = (x - chart->graph.x);
//py = (y - chart->oy);
first = gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
index = first + (px / (chart->blkw));
@@ -1216,24 +1353,32 @@ gint first, index, px;
}
-
/* pie section */
static void piechart_calculation(GtkChart *chart)
{
-GtkWidget *drawarea = chart->drawarea;
-GtkAllocation allocation;
+//GtkWidget *drawarea = chart->drawarea;
gint w, h;
- w = chart->graph_width;
- h = chart->graph_height;
+ DB( g_print("\n[pie] calculation\n") );
+
+ w = chart->graph.width;
+ h = chart->graph.height;
chart->rayon = MIN(w, h);
+ chart->mark = 0;
- gtk_widget_get_allocation(drawarea, &allocation);
+ #if CHART_PARAM_PIE_MARK == TRUE
+ gint m = floor(chart->rayon / 100);
+ m = MAX(2, m);
+ chart->rayon -= (m * 2);
+ chart->mark = m;
+ #endif
+
+ chart->ox = chart->graph.x + (w / 2);
+ chart->oy = chart->graph.y + (chart->rayon / 2);
- chart->ox = chart->graph_x + (chart->graph_width / 2);
- chart->oy = chart->graph_y + (chart->rayon / 2);
+ DB( g_print(" center: %g, %g - R=%d, mark=%d\n", chart->ox, chart->oy, chart->rayon, chart->mark) );
}
@@ -1246,6 +1391,8 @@ cairo_t *cr;
if(chart->nb_items <= 0)
return;
+ DB( g_print("\n[pie] draw slices\n") );
+
//cairo drawing
@@ -1265,6 +1412,8 @@ cairo_t *cr;
cr = gdk_cairo_create (gtk_widget_get_window(widget));
//cr = cairo_create (chart->surface);
+ DB( g_print("rayon=%d\n", chart->rayon) );
+
for(i=0; i< chart->nb_items ;i++)
{
ChartItem *item = &g_array_index(chart->items, ChartItem, i);
@@ -1272,7 +1421,7 @@ cairo_t *cr;
a1 = ((360 * (sum / chart->total)) - 90) * (M_PI / 180);
sum += ABS(item->serie1);
a2 = ((360 * (sum / chart->total)) - 90) * (M_PI / 180);
- if(i < chart->nb_items-1) a2 += 0.0175;
+ //if(i < chart->nb_items-1) a2 += 0.0175;
dx = cx;
dy = cy;
@@ -1280,77 +1429,43 @@ cairo_t *cr;
cairo_move_to(cr, dx, dy);
cairo_arc(cr, dx, dy, radius, a1, a2);
- #if PIE_LINE_SLICE == 1
- cairo_set_line_width(cr, 1.0);
+ #if CHART_PARAM_PIE_LINE == TRUE
+ cairo_set_line_width(cr, 2.0);
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
cairo_line_to(cr, cx, cy);
cairo_stroke_preserve(cr);
#endif
- DB( g_print("%d: %.2f%% %.2f %.2f\n", i, sum / chart->total, a1, a2) );
+ DB( g_print("- s%2d: %.2f%% a1=%.2f a2=%.2f\n", i, sum / chart->total, a1, a2) );
//g_print("color : %f %f %f\n", COLTOCAIRO(colors[i].r), COLTOCAIRO(colors[i].g), COLTOCAIRO(colors[i].b));
- color = i % chart->nb_cols;
- cairo_user_set_rgbcol_over(cr, &chart->colors[color], i == chart->active);
+ color = i % chart->color_scheme.nb_cols;
+ cairo_user_set_rgbcol_over(cr, &chart->color_scheme.colors[color], i == chart->active);
cairo_fill(cr);
}
-#if SOFT_LIGHT == 1
- cairo_pattern_t *pat1;
- a1 = 0;
- a2 = 2 * M_PI;
-
- pat1 = cairo_pattern_create_radial( cx, cy, 0, cx, cy, radius);
- cairo_pattern_add_color_stop_rgba(pat1, 0.0, 1.0, 1.0, 1.0, .50);
- cairo_pattern_add_color_stop_rgba(pat1, 0.9, 1.0, 1.0, 1.0, 0.1);
-
- cairo_arc(cr, cx, cy, radius, a1, a2);
- cairo_set_source(cr, pat1);
- cairo_fill(cr);
-#endif
-
-#if GRADIENT == 1
- cairo_pattern_t *pat1;
+#if CHART_PARAM_PIE_DONUT == TRUE
a1 = 0;
a2 = 2 * M_PI;
- double gradius = radius - 8;
-
- // start point, end point
- pat1 = cairo_pattern_create_linear(cx, cy-gradius, cx, cy+gradius);
-
- cairo_pattern_add_color_stop_rgba(pat1, 0.0, 1.0, 1.0, 1.0, .15);
- cairo_pattern_add_color_stop_rgba(pat1, 1.0, 1.0, 1.0, 1.0, 0.0);
-
- //debug
- //cairo_rectangle(cr, cx-radius, cy-radius, radius*2, radius*2);
-
- cairo_arc(cr, cx, cy, gradius, a1, a2);
- cairo_set_source(cr, pat1);
- cairo_fill(cr);
-
-#endif
-#if CHART_PIE_DONUT == 1
- a1 = 0;
- a2 = 2 * M_PI;
- radius = (gint)((chart->rayon/3) * (1 / PHI));
+ //original
+ //radius = (gint)((chart->rayon/3) * (1 / PHI));
+ //5.1
+ //radius = (gint)((chart->rayon/2) * 2 / 3);
+ //ynab
+ //piehole value from 0.4 to 0.6 will look best on most charts
+ radius = (gint)(chart->rayon/2) * CHART_PARAM_PIE_HOLEVALUE;
cairo_arc(cr, cx, cy, radius, a1, a2);
cairo_user_set_rgbcol(cr, &global_colors[THBASE]);
cairo_fill(cr);
-
-
-
#endif
-
-
cairo_destroy(cr);
-
}
@@ -1359,14 +1474,18 @@ static gint piechart_get_active(GtkWidget *widget, gint x, gint y, gpointer user
GtkChart *chart = GTK_CHART(user_data);
gint retval, px, py;
gint index;
-double h;
+double radius, h;
+
+ DB( g_print("\n[pie] get active\n") );
+
+ retval = -1;
px = x - chart->ox;
py = y - chart->oy;
h = sqrt( pow(px,2) + pow(py,2) );
- retval = -1;
+ radius = chart->rayon / 2;
- if(h < (chart->rayon/2))
+ if(h <= radius && h >= (radius * CHART_PARAM_PIE_HOLEVALUE) )
{
double angle, b;
@@ -1401,14 +1520,12 @@ double h;
static gboolean drawarea_full_redraw(GtkWidget *widget, gpointer user_data)
{
GtkChart *chart = GTK_CHART(user_data);
-cairo_text_extents_t te;
-cairo_font_extents_t fe;
cairo_t *cr;
+PangoLayout *layout;
+int tw, th;
- DB( g_print("\n[gtkchart] drawarea full redraw\n") );
+ DB( g_print("------\n[gtkchart] drawarea full redraw\n") );
-
-
cr = cairo_create (chart->surface);
#if MYDEBUG == 1
@@ -1423,110 +1540,205 @@ cairo_scaled_font_t *sf;
ff = cairo_scaled_font_get_font_face(sf);
g_print("cairo sf = '%s'\n", cairo_toy_font_face_get_family(ff) );
-
//cairo_set_font_face(cr, ff);
-
-
-
#endif
-
-
-
/* fillin the back in white */
//cairo_user_set_rgbcol(cr, &global_colors[WHITE]);
cairo_user_set_rgbcol(cr, &global_colors[THBASE]);
cairo_paint(cr);
- /* taken from scrolled window
- gtk_paint_shadow (widget->style, widget->window,
- GTK_STATE_NORMAL, scrolled_window->shadow_type,
- area, widget, "scrolled_window",
- widget->allocation.x + relative_allocation.x,
- widget->allocation.y + relative_allocation.y,
- relative_allocation.width,
- relative_allocation.height);
- */
-
+ if(chart->nb_items == 0)
+ {
+ cairo_destroy(cr);
+ return FALSE;
+ }
/*debug help draws */
-#if HELPDRAW == 1
- cairo_set_line_width(cr, 1.0);
- cairo_set_source_rgb(cr, 0.0, 1.0, 0.0); //green
- cairo_rectangle(cr, chart->l+0.5, chart->t+0.5, chart->w, chart->h);
- cairo_stroke(cr);
+ #if DBGDRAW_RECT == 1
+ //clip area
+ cairo_set_line_width(cr, 1.0);
+ cairo_set_source_rgb(cr, 0.0, 1.0, 0.0); //green
+ cairo_rectangle(cr, chart->l+0.5, chart->t+0.5, chart->w, chart->h);
+ cairo_stroke(cr);
- cairo_set_source_rgb(cr, 1.0, 0.5, 0.0); //orange
- cairo_rectangle(cr, chart->graph_x+0.5, chart->graph_y+0.5, chart->graph_width, chart->graph_height);
- cairo_stroke(cr);
-#endif
+ //graph area
+ cairo_set_source_rgb(cr, 1.0, 0.5, 0.0); //orange
+ cairo_rectangle(cr, chart->graph.x+0.5, chart->graph.y+0.5, chart->graph.width, chart->graph.height);
+ cairo_stroke(cr);
+ #endif
// draw title
- cairo_set_font_size(cr, CHART_FONT_SIZE_TITLE);
- cairo_font_extents(cr, &fe);
- cairo_text_extents(cr, chart->title, &te);
-
-#if HELPDRAW == 1
- double dashlength;
- cairo_set_source_rgb(cr, 0.0, 0.0, 1.0); //blue
- dashlength = 3;
- cairo_set_dash (cr, &dashlength, 1, 0);
- cairo_move_to(cr, chart->l, chart->t);
- cairo_rectangle(cr, chart->l + te.x_bearing, chart->t, te.width, fe.height);
- cairo_stroke(cr);
-#endif
-
- //center title
- //cairo_move_to(cr, chart->l + (chart->w/2) - ((te.width - te.x_bearing) / 2), chart->t - te.y_bearing);
- cairo_move_to(cr, chart->l, chart->t - te.y_bearing);
- //cairo_user_set_rgbcol(cr, &global_colors[BLACK]);
- cairo_user_set_rgbcol(cr, &global_colors[THTEXT]);
- cairo_show_text(cr, chart->title);
-
- cairo_destroy(cr);
-
- if(chart->nb_items == 0)
- return FALSE;
+ if(chart->title)
+ {
+ layout = pango_cairo_create_layout (cr);
+
+ chart_set_font_size(chart, layout, CHART_FONT_SIZE_TITLE);
+ pango_layout_set_text (layout, chart->title, -1);
+ pango_layout_get_size (layout, &tw, &th);
+
+ cairo_user_set_rgbcol(cr, &global_colors[THTEXT]);
+ cairo_move_to(cr, chart->l, chart->t);
+ pango_cairo_show_layout (cr, layout);
+
+ #if DBGDRAW_TEXT == 1
+ double dashlength;
+ cairo_set_source_rgb(cr, 0.0, 0.0, 1.0); //blue
+ dashlength = 3;
+ cairo_set_dash (cr, &dashlength, 1, 0);
+ //cairo_move_to(cr, chart->l, chart->t);
+ cairo_rectangle(cr, chart->l+0.5, chart->t+0.5, (tw / PANGO_SCALE), (th / PANGO_SCALE));
+ cairo_stroke(cr);
+ #endif
+
+ g_object_unref (layout);
+ }
switch(chart->type)
{
case CHART_TYPE_COL:
colchart_draw_scale(widget, chart);
//colchart_draw_bars(widget, chart);
- colchart_draw_scale_text(widget, chart);
break;
case CHART_TYPE_LINE:
colchart_draw_scale(widget, chart);
//linechart_draw_lines(widget, chart);
- colchart_draw_scale_text(widget, chart);
break;
case CHART_TYPE_PIE:
//piechart_draw_slices(widget, chart);
break;
}
+
+ //test legend
+ if(chart->show_legend)
+ {
+ gint i;
+ gchar *valstr;
+ gint x, y;
+ gint radius;
+ gint color;
+
+ DB( g_print("\n[chart] draw legend\n") );
+
+ layout = pango_cairo_create_layout (cr);
+ chart_set_font_size(chart, layout, CHART_FONT_SIZE_SMALL);
+ pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
+
+ x = chart->legend.x;
+ y = chart->legend.y;
+ radius = chart->legend_font_h;
+
+ #if DBGDRAW_RECT == 1
+ double dashlength;
+ cairo_set_source_rgb(cr, 1.0, 0.5, 0.0); //orange
+ dashlength = 3;
+ cairo_set_dash (cr, &dashlength, 1, 0);
+ //cairo_move_to(cr, x, y);
+ cairo_rectangle(cr, chart->legend.x+0.5, chart->legend.y+0.5, chart->legend.width, chart->legend.height);
+ cairo_stroke(cr);
+ #endif
+
+ for(i=0; i< chart->nb_items ;i++)
+ {
+ ChartItem *item = &g_array_index(chart->items, ChartItem, i);
+
+ if(item)
+ {
+ //DB( g_print(" draw %2d '%s' y=%g\n", i, item->label, y) );
+
+ #if DBGDRAW_TEXT == 1
+ double dashlength;
+ cairo_set_source_rgb(cr, 0.0, 0.0, 1.0); //blue
+ dashlength = 3;
+ cairo_set_dash (cr, &dashlength, 1, 0);
+ //cairo_move_to(cr, x, y);
+ cairo_rectangle(cr, x+0.5, y+0.5, chart->legend_font_h + CHART_SPACING + chart->legend_label_w, chart->legend_font_h);
+ cairo_stroke(cr);
+ #endif
+
+ // check if enought height to draw
+ if( chart->nb_items - i > 1 )
+ {
+ if( (y + floor(2 * radius * CHART_LINE_SPACING)) > chart->b )
+ {
+ DB( g_print(" print ...\n\n") );
+ pango_layout_set_text (layout, "...", -1);
+ cairo_move_to(cr, x + radius + CHART_SPACING, y);
+ pango_cairo_show_layout (cr, layout);
+ break;
+ }
+ }
+
+ // 1: palette
+ cairo_arc(cr, x + (radius/2), y + (radius/2), (radius/2), 0, 2 * M_PI);
+ color = i % chart->color_scheme.nb_cols;
+ cairo_user_set_rgbcol(cr, &chart->color_scheme.colors[color]);
+ cairo_fill(cr);
+
+ cairo_user_set_rgbacol(cr, &global_colors[THTEXT], 0.78);
+
+ // 2: label
+ valstr = item->label;
+ pango_layout_set_text (layout, valstr, -1);
+ pango_layout_set_width(layout, chart->legend_label_w * PANGO_SCALE);
+ cairo_move_to(cr, x + chart->legend_font_h + CHART_SPACING, y);
+ pango_cairo_show_layout (cr, layout);
+
+ if( chart->show_legend_wide )
+ {
+ pango_layout_set_width(layout, -1);
+
+ // 3: value
+ valstr = chart_print_double(chart, chart->buffer1, item->serie1);
+ pango_layout_set_text (layout, valstr, -1);
+ pango_layout_get_size (layout, &tw, &th);
+ cairo_move_to(cr, x + chart->legend_font_h + chart->legend_label_w + (CHART_SPACING*3) + chart->legend_value_w - (tw/PANGO_SCALE), y);
+ pango_cairo_show_layout (cr, layout);
+
+ // 4: rate
+ valstr = chart_print_rate(chart, item->rate);
+ pango_layout_set_text (layout, valstr, -1);
+ pango_layout_get_size (layout, &tw, &th);
+ cairo_move_to(cr, x + chart->legend_font_h + chart->legend_label_w + chart->legend_value_w + chart->legend_rate_w + (CHART_SPACING*3) - (tw/PANGO_SCALE), y);
+ pango_cairo_show_layout (cr, layout);
+ }
+
+ //the radius contains the font height here
+ //y += floor(chart->font_h * CHART_LINE_SPACING);
+ y += floor(radius * CHART_LINE_SPACING);
+ }
+ }
+
+ g_object_unref (layout);
+
+ }
+
+ cairo_destroy(cr);
+
return TRUE;
}
static gboolean
-drawarea_configure_event (GtkWidget *widget,
+drawarea_configure_event_callback (GtkWidget *widget,
GdkEventConfigure *event,
gpointer user_data)
{
GtkChart *chart = GTK_CHART(user_data);
GtkAllocation allocation;
-GtkStyle *style;
-GdkColor *color;
+GtkStyleContext *context;
+PangoFontDescription *desc;
+gboolean colfound;
+GdkRGBA color;
DB( g_print("\n[gtkchart] drawarea configure \n") );
- DB( g_print("w=%d h=%d\n", allocation.width, allocation.height) );
-
gtk_widget_get_allocation (widget, &allocation);
- chart_recompute(chart);
+ DB( g_print("w=%d h=%d\n", allocation.width, allocation.height) );
+
if (chart->surface)
cairo_surface_destroy (chart->surface);
@@ -1536,53 +1748,70 @@ GdkColor *color;
allocation.width,
allocation.height);
+ context = gtk_widget_get_style_context (widget);
- // get theme color
- style = gtk_widget_get_style (widget);
- //style = gtk_widget_get_style (chart->treeview);
- //style = gtk_widget_get_default_style();
+ chart_color_global_default();
- //get text color
- color = &style->text[GTK_STATE_NORMAL];
- struct rgbcol *tcol = &global_colors[THTEXT];
- tcol->r = color->red;
- tcol->g = color->green;
- tcol->b = color->blue;
- DB( g_print(" - theme text col: %x %x %x\n", tcol->r, tcol->g, tcol->b) );
-
- // get base color
- color = &style->base[GTK_STATE_NORMAL];
- tcol = &global_colors[THBASE];
- tcol->r = color->red;
- tcol->g = color->green;
- tcol->b = color->blue;
+ // get base color
+ colfound = gtk_style_context_lookup_color(context, "theme_base_color", &color);
+ if(!colfound)
+ colfound = gtk_style_context_lookup_color(context, "base_color", &color);
+
+ if( colfound )
+ {
+ struct rgbcol *tcol = &global_colors[THBASE];
+ tcol->r = color.red * 255;
+ tcol->g = color.green * 255;
+ tcol->b = color.blue * 255;
DB( g_print(" - theme base col: %x %x %x\n", tcol->r, tcol->g, tcol->b) );
+ }
-
- drawarea_full_redraw(widget, user_data);
+ //get text color
+ colfound = gtk_style_context_lookup_color(context, "theme_text_color", &color);
+ if(!colfound)
+ gtk_style_context_lookup_color(context, "text_color", &color);
-
- /* We've handled the configure event, no need for further processing. */
- return TRUE;
-}
+ if( colfound )
+ {
+ struct rgbcol *tcol = &global_colors[THTEXT];
+ tcol->r = color.red * 255;
+ tcol->g = color.green * 255;
+ tcol->b = color.blue * 255;
+ DB( g_print(" - theme text (bg) col: %x %x %x\n", tcol->r, tcol->g, tcol->b) );
+ }
-static void drawarea_sizeallocate_callback(GtkWidget *widget, GtkAllocation *allocation, gpointer user_data)
-{
-GtkChart *chart = GTK_CHART(user_data);
-
- DB( g_print("\n[gtkchart] drawarea sizeallocate\n") );
- DB( g_print("w=%d h=%d\n", allocation->width, allocation->height) );
+ //commented 5.1.5
+ //drawarea_full_redraw(widget, user_data);
- //g_print("\n[gtkchart] drawarea sizeallocate\n") ;
- //g_print("w=%d h=%d\n", allocation->width, allocation->height) ;
+ /* get and copy the font */
+ gtk_style_context_get(context, GTK_STATE_FLAG_NORMAL, "font", &desc, NULL);
+ if(chart->pfd)
+ {
+ pango_font_description_free (chart->pfd);
+ chart->pfd = NULL;
+ }
+ chart->pfd = pango_font_description_copy(desc);
+ chart->pfd_size = pango_font_description_get_size (desc) / PANGO_SCALE;
+ //chart->barw = (6 + chart->pfd_size) * PHI;
+
+ //leak: we should free desc here ?
+ //or no need to copy above ?
+ //pango_font_description_free(desc);
+ DB( g_print("family: %s\n", pango_font_description_get_family(chart->pfd) ) );
+ DB( g_print("size : %d (%d)\n", chart->pfd_size, chart->pfd_size/PANGO_SCALE ) );
+ DB( g_print("isabs : %d\n", pango_font_description_get_size_is_absolute (chart->pfd) ) );
+
if( gtk_widget_get_realized(widget))
{
- chart_recompute(chart);
+ chart_recompute(chart);
+ drawarea_full_redraw(widget, chart);
}
-
+
+ /* We've handled the configure event, no need for further processing. */
+ return TRUE;
}
@@ -1597,28 +1826,18 @@ static void drawarea_realize_callback(GtkWidget *widget, gpointer user_data)
}
-
-static gboolean drawarea_draw_callback( GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
+static gboolean drawarea_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer user_data)
{
GtkChart *chart = GTK_CHART(user_data);
-cairo_t *cr;
- DB( g_print("\n[gtkchart] drawarea expose\n") );
+ if( !gtk_widget_get_realized(widget) || chart->surface == NULL )
+ return FALSE;
- DB( g_print(" type=%d regionempty=%d\n", event->type, cairo_region_is_empty(event->region)) );
-
-
-
- cr = gdk_cairo_create (gtk_widget_get_window (widget));
+ DB( g_print("\n[gtkchart] drawarea draw callback\n") );
cairo_set_source_surface (cr, chart->surface, 0, 0);
- //gdk_cairo_rectangle (cr, &event->area);
cairo_paint (cr);
- /* here draw only line, bar, slices */
- if(chart->nb_items == 0)
- return FALSE;
-
switch(chart->type)
{
case CHART_TYPE_COL:
@@ -1632,10 +1851,6 @@ cairo_t *cr;
break;
}
-
-
- cairo_destroy (cr);
-
return FALSE;
}
@@ -1646,6 +1861,9 @@ GtkChart *chart = GTK_CHART(user_data);
gchar *strval, *strval2, *buffer;
gboolean retval = FALSE;
+ if(chart->surface == NULL)
+ return FALSE;
+
DB( g_print("\n[gtkchart] drawarea querytooltip\n") );
DB( g_print(" x=%d, y=%d kbm=%d\n", x, y, keyboard_mode) );
@@ -1661,17 +1879,17 @@ gboolean retval = FALSE;
strval = chart_print_double(chart, chart->buffer1, item->serie1);
if( !chart->dual )
{
-
+ //#1420495 don't use g_markup_printf_escaped
if( chart->type == CHART_TYPE_PIE )
- buffer = g_markup_printf_escaped("%s\n%s\n%.2f%%", item->label, strval, item->rate);
+ buffer = g_strdup_printf("%s\n%s\n%.2f%%", item->label, strval, item->rate);
else
- buffer = g_markup_printf_escaped("%s\n%s", item->label, strval);
+ buffer = g_strdup_printf("%s\n%s", item->label, strval);
}
else
{
strval2 = chart_print_double(chart, chart->buffer2, item->serie2);
- buffer = g_markup_printf_escaped("%s\n+%s\n%s", item->label, strval2, strval);
+ buffer = g_strdup_printf("%s\n+%s\n%s", item->label, strval2, strval);
}
gtk_tooltip_set_text(tooltip, buffer);
@@ -1692,7 +1910,7 @@ GtkChart *chart = GTK_CHART(user_data);
gboolean retval = TRUE;
gint x, y;
- if(chart->nb_items == 0)
+ if(chart->surface == NULL || chart->nb_items == 0)
return FALSE;
DB( g_print("\n[gtkchart] drawarea motion\n") );
@@ -1704,8 +1922,8 @@ gint x, y;
{
DB( g_print(" is hint\n") );
- //gdk_window_get_device_position(event->window, event->device, &x, &y, NULL);
- gdk_window_get_pointer(event->window, &x, &y, NULL);
+ gdk_window_get_device_position(event->window, event->device, &x, &y, NULL);
+ //gdk_window_get_pointer(event->window, &x, &y, NULL);
//return FALSE;
}
@@ -1722,23 +1940,88 @@ gint x, y;
break;
}
+ //test: eval legend
+ if( chart->show_legend && chart->active == - 1)
+ {
+ if( x >= chart->legend.x && (x <= (chart->legend.x+chart->legend.width ))
+ && y >= chart->legend.y && (y <= (chart->legend.y+chart->legend.height ))
+ )
+ {
+ //use the radius a font height here
+ chart->active = (y - chart->legend.y) / floor(chart->legend_font_h * CHART_LINE_SPACING);
+ }
+
+ if( chart->active > chart->nb_items - 1)
+ {
+ chart->active = -1;
+ }
+ }
+
// rollover redraw ?
DB( g_print(" active: last=%d, curr=%d\n", chart->lastactive, chart->active) );
if(chart->lastactive != chart->active)
{
- DB( g_print(" rollover redraw :: active=%d\n", chart->active) );
- //chart->drawmode = CHART_DRAW_OVERCHANGE;
- //gtk_widget_queue_draw_area(widget, chart->graph_x, chart->graph_y, chart->graph_width, chart->graph_height);
+ GdkRectangle update_rect;
+ gint first;
+
+ DB( g_print(" motion rollover redraw :: active=%d\n", chart->active) );
+
+ first = (gint)gtk_adjustment_get_value(GTK_ADJUSTMENT(chart->adjustment));
+
+ /* pie : always invalidate all graph area */
+ if( chart->type == CHART_TYPE_PIE )
+ {
+ update_rect.x = chart->graph.x;
+ update_rect.y = chart->graph.y;
+ update_rect.width = chart->graph.width;
+ update_rect.height = chart->graph.height;
+
+ /* Now invalidate the affected region of the drawing area. */
+ gdk_window_invalidate_rect (gtk_widget_get_window (widget),
+ &update_rect,
+ FALSE);
+ }
+
+ if(chart->lastactive != -1)
+ {
+ /* column/line : invalidate rollover */
+ if( chart->type == CHART_TYPE_COL || chart->type == CHART_TYPE_LINE )
+ {
+ update_rect.x = chart->graph.x + (chart->lastactive - first) * chart->blkw;
+ update_rect.y = chart->graph.y - 6;
+ update_rect.width = chart->blkw;
+ update_rect.height = chart->graph.height + 12;
+ }
+
+ /* Now invalidate the affected region of the drawing area. */
+ gdk_window_invalidate_rect (gtk_widget_get_window (widget),
+ &update_rect,
+ FALSE);
+ }
- gtk_widget_queue_draw( widget );
+ /* column/line : invalidate current item */
+ if( chart->type == CHART_TYPE_COL || chart->type == CHART_TYPE_LINE )
+ {
+ update_rect.x = chart->graph.x + (chart->active - first) * chart->blkw;
+ update_rect.y = chart->graph.y - 6;
+ update_rect.width = chart->blkw;
+ update_rect.height = chart->graph.height + 12;
+
+ /* Now invalidate the affected region of the drawing area. */
+ gdk_window_invalidate_rect (gtk_widget_get_window (widget),
+ &update_rect,
+ FALSE);
+ }
+
+ //gtk_widget_queue_draw( widget );
//retval = FALSE;
}
DB( g_print(" x=%d, y=%d, time=%d\n", x, y, event->time) );
- DB( g_print(" trigger tooltip query\n") );
- gtk_tooltip_trigger_tooltip_query(gtk_widget_get_display(chart->drawarea));
+ //if(inlegend != TRUE)
+ // gtk_tooltip_trigger_tooltip_query(gtk_widget_get_display(chart->drawarea));
return retval;
}
@@ -1750,55 +2033,70 @@ gint x, y;
void gtk_chart_queue_redraw(GtkChart *chart)
{
- chart_recompute(chart);
- drawarea_full_redraw(chart->drawarea, chart);
- gtk_widget_queue_draw( chart->drawarea );
+ DB( g_print("\n[gtkchart] queue redraw\n") );
+
+ if( gtk_widget_get_realized(chart->drawarea) )
+ {
+ chart_recompute(chart);
+ drawarea_full_redraw(chart->drawarea, chart);
+ DB( g_print("gtk_widget_queue_draw\n") );
+ gtk_widget_queue_draw( chart->drawarea );
+ }
}
/*
** change the model and/or column
*/
-void gtk_chart_set_datas(GtkChart *chart, GtkTreeModel *model, guint column, gchar *title)
+void gtk_chart_set_datas(GtkChart *chart, GtkTreeModel *model, guint column, gchar *title, gchar *subtitle)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set datas\n") );
+
if( GTK_IS_TREE_MODEL(model) )
{
chart_setup_with_model(chart, model, column, column);
if(title != NULL)
chart->title = g_strdup(title);
-
-
+ if(subtitle != NULL)
+ chart->subtitle = g_strdup(subtitle);
gtk_chart_queue_redraw(chart);
}
else
{
- chart_clear(chart, TRUE);
+ chart_clear(chart);
+ if( GTK_IS_LIST_STORE(chart->model) )
+ gtk_list_store_clear (GTK_LIST_STORE(chart->model));
+
}
}
/*
** change the model and/or column
*/
-void gtk_chart_set_dualdatas(GtkChart *chart, GtkTreeModel *model, guint column1, guint column2, gchar *title)
+void gtk_chart_set_dualdatas(GtkChart *chart, GtkTreeModel *model, guint column1, guint column2, gchar *title, gchar *subtitle)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set dualdatas\n") );
+
if( GTK_IS_TREE_MODEL(model) )
{
chart_setup_with_model(chart, model, column1, column2 );
if(title != NULL)
chart->title = g_strdup(title);
-
-
-
+ if(subtitle != NULL)
+ chart->subtitle = g_strdup(subtitle);
+
gtk_chart_queue_redraw(chart);
}
else
{
- chart_clear(chart, TRUE);
+ chart_clear(chart);
+ if( GTK_IS_LIST_STORE(chart->model) )
+ gtk_list_store_clear (GTK_LIST_STORE(chart->model));
}
}
@@ -1821,44 +2119,9 @@ void gtk_chart_set_type(GtkChart * chart, gint type)
/* = = = = = = = = = = parameters = = = = = = = = = = */
-void gtk_chart_set_color_scheme(GtkChart * chart, gint colorscheme)
+void gtk_chart_set_color_scheme(GtkChart * chart, gint index)
{
- chart->cs_blue = 0;
-
- switch(colorscheme)
- {
- default:
- case CHART_COLMAP_HOMEBANK:
- chart->colors = homebank_colors;
- chart->nb_cols = homebank_nbcolors;
- break;
- case CHART_COLMAP_MSMONEY:
- chart->colors = money_colors;
- chart->nb_cols = money_nbcolors;
- chart->cs_blue = 1;
- break;
- case CHART_COLMAP_SAP:
- chart->colors = sap_colors;
- chart->nb_cols = sap_nbcolors;
- break;
- case CHART_COLMAP_QUICKEN:
- chart->colors = quicken_colors;
- chart->nb_cols = quicken_nbcolors;
- chart->cs_blue = 3;
- break;
- case CHART_COLMAP_OFFICE2010:
- chart->colors = office2010_colors;
- chart->nb_cols = office2010_nbcolors;
- break;
- case CHART_COLMAP_OFFICE2013:
- chart->colors = office2013_colors;
- chart->nb_cols = office2013_nbcolors;
- break;
- case CHART_COLMAP_ANALYTICS:
- chart->colors = analytics_colors;
- chart->nb_cols = analytics_nbcolors;
- break;
- }
+ colorscheme_init(&chart->color_scheme, index);
}
@@ -1870,6 +2133,8 @@ void gtk_chart_set_minor_prefs(GtkChart * chart, gdouble rate, gchar *symbol)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set minor prefs\n") );
+
chart->minor_rate = rate;
chart->minor_symbol = symbol;
}
@@ -1879,17 +2144,19 @@ void gtk_chart_set_absolute(GtkChart * chart, gboolean abs)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set absolute\n") );
+
chart->abs = abs;
}
-/*
+
void gtk_chart_set_currency(GtkChart * chart, guint32 kcur)
{
g_return_if_fail (GTK_IS_CHART (chart));
chart->kcur = kcur;
}
-*/
+
/*
** set the overdrawn minimum
@@ -1898,24 +2165,29 @@ void gtk_chart_set_overdrawn(GtkChart * chart, gdouble minimum)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set overdrawn\n") );
+
chart->minimum = minimum;
//if(chart->type == CHART_TYPE_LINE)
// chart_recompute(chart);
}
+
/*
-** set the every_xval
+** obsolete: set the every_xval
*/
-void gtk_chart_set_every_xval(GtkChart * chart, gint gap)
+/*void gtk_chart_set_every_xval(GtkChart * chart, gint gap)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set every_xval\n") );
+
chart->every_xval = gap;
//if(chart->type != CHART_TYPE_PIE)
// chart_recompute(chart);
-}
+}*/
/*
@@ -1925,7 +2197,26 @@ void gtk_chart_set_barw(GtkChart * chart, gdouble barw)
{
g_return_if_fail (GTK_IS_CHART (chart));
- chart->barw = barw;
+ DB( g_print("\n[gtkchart] set barw\n") );
+
+ if( barw >= GTK_CHART_MINBARW && barw <= GTK_CHART_MAXBARW )
+ chart->usrbarw = barw;
+ else
+ chart->usrbarw = 0;
+
+
+ if(chart->type != CHART_TYPE_PIE)
+ gtk_chart_queue_redraw(chart);
+}
+
+/*
+** set the show mono (colors)
+*/
+void gtk_chart_set_showmono(GtkChart * chart, gboolean mono)
+{
+ g_return_if_fail (GTK_IS_CHART (chart));
+
+ chart->show_mono = mono;
if(chart->type != CHART_TYPE_PIE)
gtk_chart_queue_redraw(chart);
@@ -1939,22 +2230,11 @@ void gtk_chart_set_barw(GtkChart * chart, gdouble barw)
*/
void gtk_chart_show_legend(GtkChart * chart, gboolean visible, gboolean showextracol)
{
-GtkTreeViewColumn *column;
-
g_return_if_fail (GTK_IS_CHART (chart));
- if(visible == TRUE)
- gtk_widget_show(chart->scrollwin);
- else
- gtk_widget_hide(chart->scrollwin);
-
- /* manage column visibility */
- column = gtk_tree_view_get_column (GTK_TREE_VIEW(chart->treeview), 1); //amount
- gtk_tree_view_column_set_visible (column, showextracol);
-
- column = gtk_tree_view_get_column (GTK_TREE_VIEW(chart->treeview), 2); //percent
- gtk_tree_view_column_set_visible (column, showextracol);
-
+ chart->show_legend = visible;
+ chart->show_legend_wide = showextracol;
+ gtk_chart_queue_redraw(chart);
}
/*
@@ -1964,12 +2244,30 @@ void gtk_chart_show_xval(GtkChart * chart, gboolean visible)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set show xval\n") );
+
chart->show_xval = visible;
//if(chart->type != CHART_TYPE_PIE)
// chart_recompute(chart);
}
+
+void gtk_chart_show_average(GtkChart * chart, gdouble value, gboolean visible)
+{
+ g_return_if_fail (GTK_IS_CHART (chart));
+
+ DB( g_print("\n[gtkchart] set show average %f\n", value) );
+
+ chart->average = value;
+ chart->show_average = visible;
+
+ //if(chart->type == CHART_TYPE_LINE)
+ // chart_recompute(chart);
+}
+
+
+
/*
** chnage the overdrawn visibility
*/
@@ -1977,6 +2275,8 @@ void gtk_chart_show_overdrawn(GtkChart * chart, gboolean visible)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set show overdrawn\n") );
+
chart->show_over = visible;
//if(chart->type == CHART_TYPE_LINE)
@@ -1991,226 +2291,12 @@ void gtk_chart_show_minor(GtkChart * chart, gboolean minor)
{
g_return_if_fail (GTK_IS_CHART (chart));
+ DB( g_print("\n[gtkchart] set show minor\n") );
+
chart->minor = minor;
if(chart->type != CHART_TYPE_PIE)
gtk_chart_queue_redraw(chart);
- gtk_tree_view_columns_autosize (GTK_TREE_VIEW(chart->treeview));
-}
-
-
-
-
-/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
-
-/* legend list */
-
-static GdkPixbuf *
-//create_color_pixbuf (const char *color)
-create_color_pixbuf (GdkColor *col)
-{
- GdkPixbuf *pixbuf;
- //GdkColor col = color;
-
- int x;
- int num;
- guchar *p;
-
-/*
- if (!gdk_color_parse (color, &col))
- return NULL;
- */
-
-#define squaredim 12
-
- pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
- FALSE, 8, //bits
- squaredim, squaredim); //width,height
-
- //rowstride = gdk_pixbuf_get_rowstride (pixbuf);
- p = gdk_pixbuf_get_pixels (pixbuf);
-
- num = gdk_pixbuf_get_width (pixbuf) *
- gdk_pixbuf_get_height (pixbuf);
-
- for (x = 0; x < num; x++) {
-
- p[0] = col->red;
- p[1] = col->green;
- p[2] = col->blue;
-
- /*
- p[0] = col->red / 65535 * 255;
- p[1] = col->green / 65535 * 255;
- p[2] = col->blue / 65535 * 255;
- */
- p += 3;
- }
-
- return pixbuf;
-}
-
-static void legend_list_cell_data_function(GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
-GdkPixbuf *pixbuf;
-gchar *title;
-
- gtk_tree_model_get(model, iter,
- LST_LEGEND_COLOR, &pixbuf,
- LST_LEGEND_TITLE, &title,
- -1);
-
- switch(GPOINTER_TO_INT(user_data))
- {
- case LST_LEGEND_COLOR:
- g_object_set(renderer, "pixbuf", pixbuf, NULL);
- break;
- case LST_LEGEND_TITLE:
- g_object_set(renderer, "text", title, NULL);
- break;
- }
-
-}
-
-static void
-legend_list_float_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
-{
-GtkChart *chart = user_data;
-gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
-gdouble amount;
-
- gtk_tree_model_get(model, iter,
- LST_LEGEND_AMOUNT, &amount,
- -1);
-
- //hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, value, kcur);
- //todo: manage GLOBALS->minor eq
- mystrfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, amount, chart->minor);
-
- g_object_set(renderer,
- "text", buf,
- NULL);
-
-}
-
-static void legend_list_rate_cell_data_function (GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
-gdouble rate;
-gchar buf[8];
-
- gtk_tree_model_get(model, iter,
- LST_LEGEND_RATE, &rate,
- -1);
-
- g_snprintf(buf, sizeof(buf), "%.02f %%", rate);
- g_object_set(renderer, "text", buf, NULL);
-
-}
-
-
-static GtkWidget *legend_list_new(GtkChart *chart)
-{
-GtkListStore *store;
-GtkWidget *view;
-GtkCellRenderer *renderer;
-GtkTreeViewColumn *column;
-
- store = gtk_list_store_new(NUM_LST_LEGEND,
- G_TYPE_POINTER,
- GDK_TYPE_PIXBUF,
- G_TYPE_STRING,
- G_TYPE_DOUBLE,
- G_TYPE_DOUBLE
- );
-
- //treeview
- view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
- g_object_unref(store);
-
-#if MYDEBUG == 1
-/* GtkStyle *style;
- PangoFontDescription *font_desc;
-
- g_print("legend_list_new font\n");
-
- style = gtk_widget_get_style(GTK_WIDGET(view));
- font_desc = style->font_desc;
-
- g_print("family: %s\n", pango_font_description_get_family(font_desc) );
- g_print("size: %d (%d)\n", pango_font_description_get_size (font_desc), pango_font_description_get_size (font_desc )/PANGO_SCALE );
-*/
-#endif
-
- // change the font size to a smaller one
- PangoFontDescription *font = pango_font_description_new();
- pango_font_description_set_size (font, 8 * PANGO_SCALE);
- gtk_widget_modify_font(GTK_WIDGET(view), font);
- pango_font_description_free( font );
-
- // column 1
- column = gtk_tree_view_column_new();
- renderer = gtk_cell_renderer_pixbuf_new ();
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, legend_list_cell_data_function, GINT_TO_POINTER(LST_LEGEND_COLOR), NULL);
-
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, legend_list_cell_data_function, GINT_TO_POINTER(LST_LEGEND_TITLE), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
-
- // column 2
- column = gtk_tree_view_column_new();
- //gtk_tree_view_column_set_title(column, name);
-
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "xalign", 1.0, NULL);
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
- gtk_tree_view_column_set_cell_data_func(column, renderer, legend_list_float_cell_data_function, chart, NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- //gtk_tree_view_column_set_resizable(column, TRUE);
- //gtk_tree_view_column_set_alignment (column, 0.5);
- //gtk_tree_view_column_set_spacing( column, 16 );
-
- gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_visible (column, FALSE);
-
- // column 3
- column = gtk_tree_view_column_new();
- //gtk_tree_view_column_set_title(column, "%");
- renderer = gtk_cell_renderer_text_new ();
- g_object_set(renderer, "xalign", 1.0, NULL);
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- //gtk_tree_view_column_add_attribute(column, renderer, "text", id);
- gtk_tree_view_column_set_cell_data_func(column, renderer, legend_list_rate_cell_data_function, GINT_TO_POINTER(3), NULL);
- gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- //gtk_tree_view_column_set_alignment (column, 0.5);
- gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
- gtk_tree_view_column_set_visible (column, FALSE);
-
-
- gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_NONE);
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
- //gtk_tree_view_set_reorderable (GTK_TREE_VIEW(view), TRUE);
-
-/*
- GValue value = { 0, };
- g_value_init (&value, G_TYPE_INT);
- g_value_set_int (&value, 20);
- g_object_set_property(view, "vertical-separator", &value);
- g_value_unset (&value);
-*/
-
- return(view);
}