diff --git a/core/src/main/java/com/volmit/iris/core/gui/MapLegendPanel.java b/core/src/main/java/com/volmit/iris/core/gui/MapLegendPanel.java index e3e8b10f8..945a22ae3 100644 --- a/core/src/main/java/com/volmit/iris/core/gui/MapLegendPanel.java +++ b/core/src/main/java/com/volmit/iris/core/gui/MapLegendPanel.java @@ -37,8 +37,10 @@ import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.function.Consumer; /** @@ -56,7 +58,14 @@ final class MapLegendPanel extends JPanel { private final JLabel title = new JLabel(); private final DefaultListModel rows = new DefaultListModel<>(); - private final JList list = new JList<>(rows); + private final JList list = new JList<>(rows) { + // Long names shorten with an ellipsis instead of pushing the percentages out of sight. + @Override + public boolean getScrollableTracksViewportWidth() { + return true; + } + }; + private final Set sharedNames = new HashSet<>(); private MapStyle.Highlight highlight; MapLegendPanel(Consumer onRowClicked) { @@ -97,6 +106,7 @@ final class MapLegendPanel extends JPanel { void show(String subjectTitle, List shares, MapStyle.Highlight nextHighlight) { title.setText(subjectTitle.toUpperCase(Locale.ROOT)); highlight = nextHighlight; + rememberSharedNames(shares); if (!sameRows(shares)) { rows.clear(); rows.addAll(shares); @@ -104,6 +114,22 @@ final class MapLegendPanel extends JPanel { list.repaint(); } + // Two biomes can share a display name; those rows show their key so they can be told apart. + private void rememberSharedNames(List shares) { + Set seen = new HashSet<>(); + sharedNames.clear(); + for (MapCensus.Share share : shares) { + if (!seen.add(share.label().name())) { + sharedNames.add(share.label().name()); + } + } + } + + private String rowText(MapCensus.Share share) { + String name = share.label().name(); + return sharedNames.contains(name) ? name + " (" + share.label().key() + ")" : name; + } + private boolean sameRows(List shares) { if (rows.size() != shares.size()) { return false; @@ -157,7 +183,7 @@ final class MapLegendPanel extends JPanel { @Override public Component getListCellRendererComponent(JList owner, Object value, int index, boolean selected, boolean focused) { MapCensus.Share share = (MapCensus.Share) value; - super.getListCellRendererComponent(owner, share.label().name(), index, isHighlighted(share), false); + super.getListCellRendererComponent(owner, rowText(share), index, isHighlighted(share), false); setFont(StudioTheme.font()); setBorder(StudioTheme.emptyBorder(0, ROW_PADDING + SWATCH_SIZE + SWATCH_GAP, 0, ROW_PADDING + PERCENT_WIDTH)); setToolTipText(share.label().key()); diff --git a/core/src/main/java/com/volmit/iris/core/gui/components/MapTile.java b/core/src/main/java/com/volmit/iris/core/gui/components/MapTile.java index dc5d65a3d..df50b56bd 100644 --- a/core/src/main/java/com/volmit/iris/core/gui/components/MapTile.java +++ b/core/src/main/java/com/volmit/iris/core/gui/components/MapTile.java @@ -41,6 +41,8 @@ public final class MapTile { private static final double DIM_AMOUNT = 0.72D; private static final double DIM_DESATURATION = 0.6D; private static final int HIGHLIGHT_EDGE = 0xFFFFFF; + // A solid outline turns biomes that are scattered pixel by pixel into white noise, so the edge only tints. + private static final double HIGHLIGHT_EDGE_STRENGTH = 0.55D; private static final int REGION_BORDER = 0x101114; private static final double REGION_BORDER_STRENGTH = 0.6D; @@ -168,7 +170,7 @@ public final class MapTile { || grid[gridIndex(pixelX - 1, pixelZ)] != highlighted || grid[gridIndex(pixelX, pixelZ + 1)] != highlighted || grid[gridIndex(pixelX, pixelZ - 1)] != highlighted; - return edge ? HIGHLIGHT_EDGE : color; + return edge ? blend(color, HIGHLIGHT_EDGE, HIGHLIGHT_EDGE_STRENGTH) : color; } private boolean isRegionEdge(int pixelX, int pixelZ) {