package com.faforever.client.hub; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.layout.Pane; import javafx.util.StringConverter; import java.time.Duration; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class ConcurrentUsersController { private class DummyData { Long time; Integer value; public DummyData(Long time, Integer value) { this.time = time; this.value = value; } } private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); @FXML Pane concurrentUsersRoot; @FXML XYChart<Long, Integer> chart; @FXML NumberAxis yAxis; @FXML NumberAxis xAxis; @FXML void initialize() { xAxis.setForceZeroInRange(false); xAxis.setTickLabelFormatter(new StringConverter<Number>() { @Override public String toString(Number object) { ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.ofEpochSecond(object.longValue() / 1000), ZoneId.systemDefault()); return DATE_FORMATTER.format(zonedDateTime); } @Override public Number fromString(String string) { return null; } }); plotStatistics(); } @SuppressWarnings("unchecked") private void plotStatistics() { // FIXME so far, dummy data Duration duration = Duration.ofDays(2); long now = System.currentTimeMillis(); long startTime = now - duration.toMillis(); List<DummyData> dummyData = new ArrayList<>(); for (int minute = 0; minute < duration.toMinutes(); minute++) { dummyData.add(new DummyData(startTime + minute * 60 * 1000, (int) (Math.sin((float) minute / duration.toMinutes() * 12) * 300 + 800))); } xAxis.setLowerBound(startTime); xAxis.setUpperBound(now); XYChart.Series<Long, Integer> series = new XYChart.Series<>(); List<XYChart.Data<Long, Integer>> values = dummyData.stream().map(data -> new XYChart.Data<>(data.time, data.value)).collect(Collectors.toList()); series.getData().setAll(FXCollections.observableList(values)); chart.getData().setAll(series); } public Node getRoot() { return concurrentUsersRoot; } }