From d0eb8a53f32fb39a92c5e33f0b9cf3f9235a607f Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Wed, 29 Nov 2017 11:14:52 +0200 Subject: [PATCH] WorldPie can now be sorted by descending time percentage #377 --- .../java/com/djrapitops/plan/Settings.java | 1 + .../html/graphs/WorldPieCreator.java | 76 +++++++++++++++---- Plan/src/main/resources/config.yml | 2 + 3 files changed, 63 insertions(+), 16 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/Settings.java b/Plan/src/main/java/com/djrapitops/plan/Settings.java index 068e2e7a3..b6c01a339 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Settings.java +++ b/Plan/src/main/java/com/djrapitops/plan/Settings.java @@ -26,6 +26,7 @@ public enum Settings { DEV_MODE("Plugin.Dev"), USE_SERVER_TIME("Customization.UseServerTime"), DISPLAY_SESSIONS_AS_TABLE("Customization.Display.SessionsAsTable"), + ORDER_WORLD_PIE_BY_PERC("Customization.Display.OrderWorldPieByPercentage"), // Integer WEBSERVER_PORT("WebServer.Port"), diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java index 64167cb87..8ff57c52b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java @@ -22,11 +22,23 @@ public class WorldPieCreator { * @return String array, index 0: Series data, 1: drilldown data */ public static String[] createSeriesData(WorldTimes worldTimes) { + List slices = turnToSlices(worldTimes); + + if (Settings.ORDER_WORLD_PIE_BY_PERC.isTrue()) { + slices.sort(new PieSliceComparator()); + } + + String seriesData = buildSeries(slices); + + String drilldownData = createDrilldownData(worldTimes); + + return new String[]{seriesData, drilldownData}; + } + + private static List turnToSlices(WorldTimes worldTimes) { String[] colors = Settings.THEME_GRAPH_WORLD_PIE.toString().split(", "); int colLenght = colors.length; - StringBuilder seriesBuilder = new StringBuilder("["); - int i = 0; // WorldTimes Map (GMTimes.getTotal) Map playtimePerWorld = worldTimes.getWorldTimes().entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getTotal())); @@ -36,19 +48,24 @@ public class WorldPieCreator { List worlds = new ArrayList<>(playtimePerAlias.keySet()); Collections.sort(worlds); - int size = playtimePerAlias.size(); + List slices = new ArrayList<>(); + int i = 0; for (String alias : worlds) { Long value = playtimePerAlias.getOrDefault(alias, 0L); - if (value == 0L) { - i++; - continue; + if (value != 0L) { + slices.add(new PieSlice(alias, value, colors[i % colLenght])); } - seriesBuilder.append("{name:'").append(alias) - .append("',y:").append(value) - .append(",color:").append(colors[i % colLenght]) - .append(",drilldown: '").append(alias).append("'"); + i++; + } + return slices; + } - seriesBuilder.append("}"); + private static String buildSeries(List slices) { + StringBuilder seriesBuilder = new StringBuilder("["); + int i = 0; + int size = slices.size(); + for (PieSlice slice : slices) { + seriesBuilder.append(slice.toString()); if (i < size - 1) { seriesBuilder.append(","); } @@ -56,11 +73,7 @@ public class WorldPieCreator { } seriesBuilder.append("]"); - String seriesData = seriesBuilder.toString(); - - String drilldownData = createDrilldownData(worldTimes); - - return new String[]{seriesData, drilldownData}; + return seriesBuilder.toString(); } private static Map transformToAliases(Map playtimePerWorld) { @@ -168,3 +181,34 @@ public class WorldPieCreator { drilldownBuilder.append("]}"); } } + +class PieSlice { + private final String name; + final long y; + private final String color; + + public PieSlice(String name, long y, String color) { + this.name = name; + this.y = y; + this.color = color; + } + + @Override + public String toString() { + return "{name:'" + name + "'," + + "y:" + y + "," + + "color:" + color + "," + + "drilldown: '" + name + "'}"; + } +} + +/** + * Compares PieSlices to descending Percentage order. + */ +class PieSliceComparator implements Comparator { + + @Override + public int compare(PieSlice o1, PieSlice o2) { + return -Long.compare(o1.y, o2.y); + } +} \ No newline at end of file diff --git a/Plan/src/main/resources/config.yml b/Plan/src/main/resources/config.yml index da8450782..5cd66e7f0 100644 --- a/Plan/src/main/resources/config.yml +++ b/Plan/src/main/resources/config.yml @@ -73,6 +73,8 @@ Customization: UseServerTime: true Display: SessionsAsTable: false + # By Default WorldPie is ordered alphabetically, colors are still determined alphabetically. + OrderWorldPieByPercentage: false MaxSessions: 50 MaxPlayers: 2500 MaxPlayersPlayersPage: 25000