]> git.scottworley.com Git - batteryviewer/commitdiff
Don't draw connecting lines across large gaps
authorScott Worley <scottworley@scottworley.com>
Fri, 24 Feb 2023 04:37:21 +0000 (20:37 -0800)
committerScott Worley <scottworley@scottworley.com>
Fri, 24 Feb 2023 04:37:21 +0000 (20:37 -0800)
chart.c

diff --git a/chart.c b/chart.c
index 835c63dc2c6a310e96ffa0b5da7dfdf2fca2145a..1fa76c542656f611eb2974fb1323f7d174cd8090 100644 (file)
--- a/chart.c
+++ b/chart.c
@@ -24,6 +24,8 @@ struct BVChartPoint {
 G_DEFINE_TYPE_WITH_CODE(BVChart, bv_chart, GTK_TYPE_DRAWING_AREA,
                         G_ADD_PRIVATE(BVChart))
 
 G_DEFINE_TYPE_WITH_CODE(BVChart, bv_chart, GTK_TYPE_DRAWING_AREA,
                         G_ADD_PRIVATE(BVChart))
 
+typedef void (*cairo_draw_func)(cairo_t *cr, double x, double y);
+
 static gboolean bv_chart_draw(GtkWidget *widget, cairo_t *cr) {
   BVChart *chart = BV_CHART(widget);
   BVChartPrivate *priv = bv_chart_get_instance_private(chart);
 static gboolean bv_chart_draw(GtkWidget *widget, cairo_t *cr) {
   BVChart *chart = BV_CHART(widget);
   BVChartPrivate *priv = bv_chart_get_instance_private(chart);
@@ -41,15 +43,17 @@ static gboolean bv_chart_draw(GtkWidget *widget, cairo_t *cr) {
   float xscale = (allocation.width - 2 * margin) / (priv->maxx - priv->minx);
   float yscale = (allocation.height - 2 * margin) / (priv->miny - priv->maxy);
   cairo_set_source_rgb(cr, 0.0, 0.0, 1.0);
   float xscale = (allocation.width - 2 * margin) / (priv->maxx - priv->minx);
   float yscale = (allocation.height - 2 * margin) / (priv->miny - priv->maxy);
   cairo_set_source_rgb(cr, 0.0, 0.0, 1.0);
-  struct BVChartPoint *start =
-      &g_array_index(priv->points, struct BVChartPoint, 0);
-  cairo_move_to(cr, xscale * (start->x - priv->minx) + margin,
-                yscale * (start->y - priv->maxy) + margin);
-  for (guint i = 1; i < priv->points->len; i++) {
+  float gap_threshold = 3.0;
+  float prevx = 0.0;
+  for (guint i = 0; i < priv->points->len; i++) {
     struct BVChartPoint *p =
         &g_array_index(priv->points, struct BVChartPoint, i);
     struct BVChartPoint *p =
         &g_array_index(priv->points, struct BVChartPoint, i);
-    cairo_line_to(cr, xscale * (p->x - priv->minx) + margin,
-                  yscale * (p->y - priv->maxy) + margin);
+    gboolean is_gap = p->x - prevx > gap_threshold;
+    cairo_draw_func f = is_gap ? cairo_move_to : cairo_line_to;
+    float screen_x = xscale * (p->x - priv->minx) + margin;
+    float screen_y = yscale * (p->y - priv->maxy) + margin;
+    f(cr, screen_x, screen_y);
+    prevx = p->x;
   }
   cairo_stroke(cr);
 
   }
   cairo_stroke(cr);