Skip to content

Commit

Permalink
removed shared datasets and changed legend item to be drawn at a late…
Browse files Browse the repository at this point in the history
…r time
  • Loading branch information
ennerf committed Aug 14, 2023
1 parent e41985d commit c5c8b77
Show file tree
Hide file tree
Showing 26 changed files with 313 additions and 293 deletions.
29 changes: 15 additions & 14 deletions chartfx-chart/src/main/java/io/fair_acc/chartfx/Chart.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.stream.Collectors;

import io.fair_acc.chartfx.renderer.spi.AbstractRenderer;
import io.fair_acc.chartfx.ui.css.DataSetNode;
import io.fair_acc.chartfx.renderer.spi.ErrorDataSetRenderer;
import io.fair_acc.chartfx.ui.css.StyleGroup;
import io.fair_acc.chartfx.ui.css.StyleUtil;
import io.fair_acc.chartfx.ui.layout.TitleLabel;
Expand Down Expand Up @@ -92,7 +92,7 @@ public abstract class Chart extends Region implements EventSource {
/**
* When true any data changes will be animated.
*/
private final BooleanProperty animated = new SimpleBooleanProperty(this, "animated", true);
private final BooleanProperty animated = new SimpleBooleanProperty(this, "animated", false);
// TODO: Check whether 'this' or chart contents need to be added
/**
* Animator for animating stuff on the chart
Expand All @@ -102,7 +102,6 @@ public abstract class Chart extends Region implements EventSource {
protected final ObservableList<Axis> axesList = FXCollections.observableList(new NoDuplicatesList<>());
private final Map<ChartPlugin, Group> pluginGroups = new HashMap<>();
private final ObservableList<ChartPlugin> plugins = FXCollections.observableList(new LinkedList<>());
private final ObservableList<DataSet> datasets = FXCollections.observableArrayList();
protected final ObservableList<DataSet> allDataSets = FXCollections.observableArrayList();
private final ObservableList<Renderer> renderers = FXCollections.observableArrayList();

Expand Down Expand Up @@ -339,10 +338,13 @@ public final Pane getCanvasForeground() {
}

/**
* @return datasets attached to the chart and drawn by all renderers
* @return datasets of the first renderer. Creates a renderer if needed.
*/
public ObservableList<DataSet> getDatasets() {
return datasets;
if (getRenderers().isEmpty()) {
getRenderers().add(new ErrorDataSetRenderer());
}
return getRenderers().get(0).getDatasets();
}

public Axis getFirstAxis(final Orientation orientation) {
Expand Down Expand Up @@ -557,6 +559,10 @@ protected void runPostLayout() {
axis.drawAxis();
}

// Redraw legend icons
// TODO: only update if the style actually changed
legend.get().drawLegend();

// Redraw the main canvas
redrawCanvas();

Expand Down Expand Up @@ -632,9 +638,6 @@ private void updateStandaloneRendererAxes() {
}

private void forEachDataSet(Consumer<DataSet> action) {
for (DataSet dataset : datasets) {
action.accept(dataset);
}
for (Renderer renderer : renderers) {
for (DataSet dataset : renderer.getDatasets()) {
action.accept(dataset);
Expand Down Expand Up @@ -799,16 +802,14 @@ protected void datasetsChanged(final ListChangeListener.Change<? extends DataSet
}

// set global indices
int i = datasets.size();
int indexOffset = 0;
for (Renderer renderer : renderers) {
for (DataSetNode datasetNode : renderer.getDatasetNodes()) {
datasetNode.setGlobalIndex(i++);
}
renderer.setIndexOffset(indexOffset);
indexOffset += renderer.getDatasetNodes().size();
}

// Rebuild legend (modifies SceneGraph and needs to be done before styling)
fireInvalidated(ChartBits.ChartLayout, ChartBits.ChartDataSets, ChartBits.ChartLegend);
updateLegend();
}

/**
Expand Down Expand Up @@ -912,7 +913,7 @@ protected void updateLegend(final List<DataSet> dataSets, final List<Renderer> r
if (legend == null) {
return;
}
legend.updateLegend(dataSets, renderers);
legend.updateLegend(renderers);
}

protected void updatePluginsArea() {
Expand Down
38 changes: 19 additions & 19 deletions chartfx-chart/src/main/java/io/fair_acc/chartfx/XYChart.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package io.fair_acc.chartfx;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import io.fair_acc.chartfx.axes.spi.AxisRange;
import io.fair_acc.chartfx.ui.css.DataSetNode;
import io.fair_acc.chartfx.utils.PropUtil;
import io.fair_acc.dataset.events.ChartBits;
import javafx.beans.property.BooleanProperty;
Expand Down Expand Up @@ -94,10 +96,7 @@ public XYChart(final Axis... axes) {
gridRenderer.getVerticalMinorGrid().changeCounterProperty(),
gridRenderer.drawOnTopProperty());

this.setAnimated(false);
getRenderers().addListener(this::rendererChanged);

getRenderers().add(new ErrorDataSetRenderer());
}

/**
Expand All @@ -110,14 +109,12 @@ public ObservableList<DataSet> getAllDatasets() {
}

allDataSets.clear();
allDataSets.addAll(getDatasets());
for (Renderer renderer : getRenderers()) {
if(renderer instanceof LabelledMarkerRenderer){
continue;
}
allDataSets.addAll(renderer.getDatasets());
}

return allDataSets;
}

Expand Down Expand Up @@ -206,9 +203,12 @@ public void updateAxisRange() {

// Check that all registered data sets have proper ranges defined. The datasets
// are already locked, so we can use parallel stream without extra synchronization.
getAllDatasets().stream()
.filter(DataSet::isVisible)
.filter(ds -> ds.getBitState().isDirty())
getRenderers().stream()
.flatMap(renderer -> renderer.getDatasetNodes().stream())
.filter(DataSetNode::isVisible)
.map(DataSetNode::getDataSet)
.filter(ds -> ds.getBitState().isDirty(ChartBits.DataSetData, ChartBits.DataSetRange))
.distinct()
.forEach(dataset -> dataset.getAxisDescriptions().parallelStream()
.filter(axisD -> !axisD.isDefined() || axisD.getBitState().isDirty())
.forEach(axisDescription -> dataset.recomputeLimits(axisDescription.getDimIndex())));
Expand Down Expand Up @@ -272,14 +272,13 @@ protected void checkRendererForRequiredAxes(final Renderer renderer) {
getAxes().addAll(renderer.getAxes().stream().limit(2).filter(a -> (a.getSide() != null && !getAxes().contains(a))).collect(Collectors.toList()));
}

protected List<DataSet> getDataSetForAxis(final Axis axis) {
final List<DataSet> retVal = new ArrayList<>();
if (axis == null) {
return retVal;
}
retVal.addAll(getDatasets());
getRenderers().forEach(renderer -> renderer.getAxes().stream().filter(axis::equals).forEach(rendererAxis -> retVal.addAll(renderer.getDatasets())));
return retVal;
protected List<DataSetNode> getDataSetForAxis(final Axis axis) {
final List<DataSetNode> list = new ArrayList<>();
getRenderers().stream()
.filter(renderer -> renderer.getAxes().contains(axis))
.map(Renderer::getDatasetNodes)
.forEach(list::addAll);
return list;
}

@Override
Expand Down Expand Up @@ -328,7 +327,7 @@ protected void redrawCanvas() {
}
}

protected static void updateNumericAxis(final Axis axis, final List<DataSet> dataSets) {
protected static void updateNumericAxis(final Axis axis, final List<DataSetNode> dataSets) {
if (dataSets == null || dataSets.isEmpty()) {
return;
}
Expand All @@ -339,8 +338,9 @@ protected static void updateNumericAxis(final Axis axis, final List<DataSet> dat
// Determine the range of all datasets for this axis
final AxisRange dsRange = new AxisRange();
dsRange.clear();
dataSets.stream().filter(DataSet::isVisible).forEach(dataset -> {
if (dataset.getDimension() > 2 && (side == Side.RIGHT || side == Side.TOP)) {
dataSets.stream().filter(DataSetNode::isVisible).map(DataSetNode::getDataSet)
.forEach(dataset -> {
if (dataset.getDimension() > 2 && (side == Side.RIGHT || side == Side.TOP)) {
if (!dataset.getAxisDescription(DataSet.DIM_Z).isDefined()) {
dataset.recomputeLimits(DataSet.DIM_Z);
}
Expand Down
19 changes: 9 additions & 10 deletions chartfx-chart/src/main/java/io/fair_acc/chartfx/legend/Legend.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import io.fair_acc.chartfx.renderer.Renderer;
import io.fair_acc.chartfx.ui.geometry.Side;
import io.fair_acc.dataset.DataSet;
import javafx.scene.Node;

public interface Legend {
Expand All @@ -21,21 +20,21 @@ public interface Legend {

/**
* This is called whenever a series is added or removed and the legend needs to be updated
*
* @param dataSets list of data sets to be displayed
*
* @param renderers corresponding renderers
*/
default void updateLegend(List<DataSet> dataSets, List<Renderer> renderers) {
// TODO: we currently force an update because the diff checker could link the visibility clicks to the wrong ds
updateLegend(dataSets, renderers, true);
default void updateLegend(List<Renderer> renderers) {
updateLegend(renderers, false);
}

/**
* This is called whenever a series is added or removed and the legend needs to be updated
*
* @param dataSets list of data sets to be displayed
* @param renderers corresponding renderers
*
* @param renderers corresponding renderers
* @param forceUpdate {@code true} force update
*/
void updateLegend(List<DataSet> dataSets, List<Renderer> renderers, boolean forceUpdate);
void updateLegend(List<Renderer> renderers, boolean forceUpdate);

void drawLegend();

}
Loading

0 comments on commit c5c8b77

Please sign in to comment.