diff --git a/crates/chart/src/render.rs b/crates/chart/src/render.rs index 63d30d9..d36e2ab 100644 --- a/crates/chart/src/render.rs +++ b/crates/chart/src/render.rs @@ -254,7 +254,7 @@ fn draw_kind(ctx: &mut Ctx, chart: &Chart, data: &ChartData, area: Bx) { Doughnut => pie(ctx, chart, data, area, 0.5, false), Sunburst => pie(ctx, chart, data, area, 0.2, true), Treemap => treemap(ctx, chart, data, area), - Funnel => funnel(ctx, data, area), + Funnel => funnel(ctx, chart, data, area), Radar => radar(ctx, chart, data, area), _ => { let area = axis_titles(ctx, chart, area); @@ -1301,7 +1301,7 @@ fn waterfall(ctx: &mut Ctx, chart: &Chart, data: &ChartData, area: Bx) { // ---------------------------------------------------------------- funnel -fn funnel(ctx: &mut Ctx, data: &ChartData, area: Bx) { +fn funnel(ctx: &mut Ctx, chart: &Chart, data: &ChartData, area: Bx) { let Some(s) = data.series.first() else { return }; let n = data.categories.len().max(s.values.len()).min(MAX_CATS); if n == 0 { @@ -1331,9 +1331,11 @@ fn funnel(ctx: &mut Ctx, data: &ChartData, area: Bx) { } if show { let yc = y + bh / 2.0; - let t = f.format(s.values.get(j).copied().flatten().unwrap_or(0.0), None); - let color = if ctx.tw(&t, LABEL_SIZE) + 4.0 <= bw { on(s.color) } else { TEXT }; - ctx.text(plot.cx(), yc, &t, LABEL_SIZE, color, HAlign::Center, VAlign::Middle); + if chart.data_labels { + let t = f.format(s.values.get(j).copied().flatten().unwrap_or(0.0), None); + let color = if ctx.tw(&t, LABEL_SIZE) + 4.0 <= bw { on(s.color) } else { TEXT }; + ctx.text(plot.cx(), yc, &t, LABEL_SIZE, color, HAlign::Center, VAlign::Middle); + } let l = ctx.fit(labels.get(j).map(String::as_str).unwrap_or(""), LABEL_SIZE, lw - 8.0); ctx.text(plot.x - 6.0, yc, &l, LABEL_SIZE, TEXT, HAlign::Right, VAlign::Middle); } diff --git a/crates/chart/src/tests.rs b/crates/chart/src/tests.rs index a942677..f4a12ff 100644 --- a/crates/chart/src/tests.rs +++ b/crates/chart/src/tests.rs @@ -902,3 +902,25 @@ fn union_series_references() { c.series[0].values = format!("{}Sheet1!$B$1,Sheet1!$B$2{}", "(".repeat(5000), ")".repeat(5000)); let _ = resolve(&wb, 0, &c); } + +#[test] +fn funnel_value_labels_follow_the_data_labels_flag() { + let data = ChartData { + categories: vec!["a".into(), "b".into(), "c".into()], + series: vec![series("S", &[11111.0, 22222.0, 33333.0], [20, 96, 130, 255], ChartKind::Funnel)], + }; + let mut c = chart(ChartKind::Funnel); + c.data_labels = false; + let off = render(&c, &data, 500.0, 350.0, &ApproxMeasure); + c.data_labels = true; + let on = render(&c, &data, 500.0, 350.0, &ApproxMeasure); + let values = ["$11,111", "$22,222", "$33,333"]; + for v in values { + assert!(texts(&on).contains(&v), "{v} missing with labels on"); + assert!(!texts(&off).contains(&v), "{v} drawn with labels off"); + } + for cat in ["a", "b", "c"] { + assert!(texts(&off).contains(&cat)); + assert!(texts(&on).contains(&cat)); + } +}