diff --git a/src/gnome-utils/gnc-html-graph-gog.c b/src/gnome-utils/gnc-html-graph-gog.c index 10a5d3f5a0..32252ce53f 100644 --- a/src/gnome-utils/gnc-html-graph-gog.c +++ b/src/gnome-utils/gnc-html-graph-gog.c @@ -33,6 +33,7 @@ #include "gnc-html.h" #include "gnc-engine.h" #include +#include #include #include #ifdef GOFFICE_WITH_CAIRO @@ -48,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -514,8 +516,11 @@ handle_scatter(gnc_html * html, GtkHTMLEmbedded * eb, gpointer unused) GogPlot *plot; GogSeries *series; GOData *sliceData; + GogStyle *style; int datasize; double *xData, *yData; + gchar *marker_str, *color_str; + gboolean fill = FALSE; gtkhtml_pre_3_10_1_bug_workaround(eb); @@ -530,6 +535,9 @@ handle_scatter(gnc_html * html, GtkHTMLEmbedded * eb, gpointer unused) yDataStr = g_hash_table_lookup( eb->params, "y_data" ); yData = read_doubles( yDataStr, datasize ); + + marker_str = g_hash_table_lookup(eb->params, "marker"); + color_str = g_hash_table_lookup(eb->params, "color"); } if (!create_basic_plot_elements("GogXYPlot", &graph, &chart, &plot)) @@ -538,6 +546,7 @@ handle_scatter(gnc_html * html, GtkHTMLEmbedded * eb, gpointer unused) } series = gog_plot_new_series( plot ); + style = gog_styled_object_get_style(GOG_STYLED_OBJECT(series)); sliceData = go_data_vector_val_new( xData, datasize, NULL ); gog_series_set_dim( series, 0, sliceData, NULL ); @@ -547,6 +556,62 @@ handle_scatter(gnc_html * html, GtkHTMLEmbedded * eb, gpointer unused) gog_series_set_dim( series, 1, sliceData, NULL ); go_data_emit_changed (GO_DATA (sliceData)); + /* set marker shape */ + if (marker_str) { + GOMarkerShape shape; + + if (g_str_has_prefix(marker_str, "filled ")) { + fill = TRUE; + marker_str += 7; + } + shape = go_marker_shape_from_str(marker_str); + if (shape != GO_MARKER_NONE) { + style->marker.auto_shape = FALSE; + go_marker_set_shape(style->marker.mark, shape); + } else { + g_warning("cannot parse marker shape [%s]", marker_str); + } + } + + /* set marker and line colors */ + if (color_str) { + GdkColor color; + if (gdk_color_parse(color_str, &color)) { + style->marker.auto_outline_color = FALSE; + go_marker_set_outline_color(style->marker.mark, GDK_TO_UINT(color)); + style->line.auto_color = FALSE; + style->line.color = GDK_TO_UINT(color); + } else { + g_warning("cannot parse color [%s]", color_str); + } + } + + /* set marker fill colors */ + if (fill) { + style->marker.auto_fill_color = style->marker.auto_outline_color; + go_marker_set_fill_color(style->marker.mark, + go_marker_get_outline_color(style->marker.mark)); + } else { + GogStyle *chart_style = + gog_styled_object_get_style(GOG_STYLED_OBJECT(chart)); + + if (chart_style->fill.type == GOG_FILL_STYLE_PATTERN + && chart_style->fill.pattern.pattern == GO_PATTERN_SOLID) { + style->marker.auto_fill_color = FALSE; + go_marker_set_fill_color(style->marker.mark, + chart_style->fill.pattern.back); + } else if (chart_style->fill.type == GOG_FILL_STYLE_PATTERN + && chart_style->fill.pattern.pattern + == GO_PATTERN_FOREGROUND_SOLID) { + style->marker.auto_fill_color = FALSE; + go_marker_set_fill_color(style->marker.mark, + chart_style->fill.pattern.fore); + } else { + g_warning("fill color of markers can only be set like a solid fill " + "pattern of the chart"); + } + } + set_chart_titles_from_hash(chart, eb); set_chart_axis_labels_from_hash(chart, eb); diff --git a/src/report/report-system/html-scatter.scm b/src/report/report-system/html-scatter.scm index ae51af383d..91d2dbe767 100644 --- a/src/report/report-system/html-scatter.scm +++ b/src/report/report-system/html-scatter.scm @@ -34,18 +34,18 @@ y-axis-label ;; a list of x-y-value lists. data - ;; Valid marker names are: + ;; Valid marker names are: ;; "none", "circle", "diamond", "cross", "x", - ;; "square", "asterisk", "filled circle", - ;; "filled square", "filled diamond" + ;; "square", "asterisk" and some more. ;; The full list can be found in - ;; guppi3/src/libguppiplot/guppi-marker.c in - ;; guppi_marker_info_array[] + ;; goffice/goffice/utils/go-marker.c, marker_shapes[] + ;; Marker names prefixed by filled, e.g. "filled square", + ;; are filled in the same color as the outline marker - ;; The color of the marker. Should be a rgba - ;; value as a hex string, as returned by - ;; gnc:color-option->hex-string - markercolor + ;; The color of the markers outline. Should be a hex string, + ;; as returned by gnc:color-option->hex-string, prefixed by + ;; #, like "#ff0000" for red + markercolor ))) (define gnc:html-scatter? @@ -164,10 +164,7 @@ (y-label (gnc:html-scatter-y-axis-label scatter)) (data (gnc:html-scatter-data scatter)) (marker (gnc:html-scatter-marker scatter)) - ;; Workaround to set the alpha channel, since libguppitank - ;; requires a rgba value here. - (markercolor (string-append (gnc:html-scatter-markercolor scatter) - "ff"))) + (markercolor (string-append "#" (gnc:html-scatter-markercolor scatter)))) (if (and (list? data) (not (null? data))) (begin @@ -202,7 +199,7 @@ (if markercolor (begin (push " \n"))) (if (and data (list? data)) (let ((datasize (length data))