From 8f9a4d0463dbafa179b332bb6d3e621418467803 Mon Sep 17 00:00:00 2001 From: Florian Enner Date: Wed, 27 Sep 2023 18:09:49 +0200 Subject: [PATCH] added category axis update --- .../main/java/io/fair_acc/chartfx/XYChart.java | 17 +++++++++++++++++ .../io/fair_acc/chartfx/renderer/Renderer.java | 11 +++++++++++ .../renderer/spi/AbstractRendererXY.java | 17 +++++++++++++++++ .../renderer/spi/AbstractRendererXYZ.java | 5 +++++ 4 files changed, 50 insertions(+) diff --git a/chartfx-chart/src/main/java/io/fair_acc/chartfx/XYChart.java b/chartfx-chart/src/main/java/io/fair_acc/chartfx/XYChart.java index 8b1eddb94..f1720c474 100644 --- a/chartfx-chart/src/main/java/io/fair_acc/chartfx/XYChart.java +++ b/chartfx-chart/src/main/java/io/fair_acc/chartfx/XYChart.java @@ -1,5 +1,6 @@ package io.fair_acc.chartfx; +import io.fair_acc.chartfx.axes.spi.CategoryAxis; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; @@ -228,7 +229,23 @@ public void updateAxisRange() { if (changed && (axis.isAutoRanging() || axis.isAutoGrowRanging())) { axis.invalidateRange(); } + + // Feature for backwards compatibility: Category axes that do not have + // their categories set copy the categories of the first dataset of the + // first renderer that is using this axis. + if (axis instanceof CategoryAxis catAxis) { + for (Renderer renderer : getRenderers()) { + if (renderer.isUsingAxis(axis)) { + if (!renderer.getDatasets().isEmpty()) { + catAxis.updateCategories(renderer.getDatasets().get(0)); + } + break; + } + } + } + } + } private final AxisRange axisRange = new AxisRange(); diff --git a/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/Renderer.java b/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/Renderer.java index d50c2edea..3b8fa64a4 100644 --- a/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/Renderer.java +++ b/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/Renderer.java @@ -95,6 +95,17 @@ default void updateAxes() { // empty by default } + /** + * Checks whether a renderer is actively using a given axis. The + * result is only valid after updateAxes has been called. + *

+ * @param axis axis to be checked + * @return true if the renderer is actively using the given axis + */ + default boolean isUsingAxis(Axis axis) { + return getAxes().contains(axis); + } + /** * Updates the range for the specified axis. * Does nothing if the axis is not used. diff --git a/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/spi/AbstractRendererXY.java b/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/spi/AbstractRendererXY.java index 7fe661c24..30c9864bb 100644 --- a/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/spi/AbstractRendererXY.java +++ b/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/spi/AbstractRendererXY.java @@ -2,6 +2,7 @@ import java.security.InvalidParameterException; +import io.fair_acc.chartfx.axes.spi.CategoryAxis; import javafx.geometry.Orientation; import javafx.scene.canvas.GraphicsContext; @@ -85,6 +86,22 @@ public void updateAxes() { if (yAxis == null) { yAxis = chart.getYAxis(); } + + // Update category axes (TODO: remove this API?) + if (!getDatasets().isEmpty()) { + var ds = getDatasets().get(0); + if (xAxis instanceof CategoryAxis xCat) { + xCat.updateCategories(ds); + } + if (yAxis instanceof CategoryAxis yCat) { + yCat.updateCategories(ds); + } + } + } + + @Override + public boolean isUsingAxis(Axis axis) { + return axis == xAxis || axis == yAxis; } protected Axis ensureAxisInChart(Axis axis) { diff --git a/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/spi/AbstractRendererXYZ.java b/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/spi/AbstractRendererXYZ.java index 7bb1787e7..9f50e7a34 100644 --- a/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/spi/AbstractRendererXYZ.java +++ b/chartfx-chart/src/main/java/io/fair_acc/chartfx/renderer/spi/AbstractRendererXYZ.java @@ -37,6 +37,11 @@ public void updateAxes() { } } + @Override + public boolean isUsingAxis(Axis axis) { + return super.isUsingAxis(axis) || axis == zAxis; + } + @Override public void updateAxisRange(Axis axis, AxisRange range) { super.updateAxisRange(axis, range);