From 479384d6bfeea0c225af829cbc1cac730d87c844 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 19 Jun 2011 00:14:27 +0200 Subject: Correctly show invalid sets git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@471 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/view/IView.java | 42 ++++++------ src/jrummikub/view/impl/HandPanel.java | 3 +- src/jrummikub/view/impl/StoneCollectionPanel.java | 3 +- src/jrummikub/view/impl/StonePainter.java | 79 +++++++++++++---------- src/jrummikub/view/impl/TablePanel.java | 14 +++- src/jrummikub/view/impl/View.java | 5 ++ 6 files changed, 90 insertions(+), 56 deletions(-) (limited to 'src/jrummikub/view') diff --git a/src/jrummikub/view/IView.java b/src/jrummikub/view/IView.java index b84e366..b127377 100644 --- a/src/jrummikub/view/IView.java +++ b/src/jrummikub/view/IView.java @@ -5,6 +5,7 @@ import java.io.File; import java.util.Collection; import jrummikub.model.Stone; +import jrummikub.model.StoneSet; import jrummikub.util.IEvent; import jrummikub.util.IEvent1; @@ -236,23 +237,6 @@ public interface IView { */ public void showGameListPanel(boolean show); - /** - * Different types of bottom panels - */ - public enum BottomPanelType { - /** */ - START_GAME_PANEL, - /** */ - START_TURN_PANEL, - /** */ - INVALID_TURN_PANEL, - /** */ - HUMAN_HAND_PANEL, - /** */ - COMPUTER_HAND_PANEL, - /** */ - WIN_PANEL - } /** * Is set if a player tried to lay out less than initial meld threshold @@ -260,18 +244,36 @@ public interface IView { * @param points * initial meld threshold */ - void setInitialMeldError(int points); + public void setInitialMeldError(int points); /** * Show stone collection * * @param enable */ - void setStoneCollectionHidden(boolean enable); + public void setStoneCollectionHidden(boolean enable); /** * Is set if the player tried to modify the table without laying out first */ - void setInitialMeldFirstError(); + public void setInitialMeldFirstError(); + public void setInvalidStoneSets(Collection sets); + /** + * Different types of bottom panels + */ + public enum BottomPanelType { + /** */ + START_GAME_PANEL, + /** */ + START_TURN_PANEL, + /** */ + INVALID_TURN_PANEL, + /** */ + HUMAN_HAND_PANEL, + /** */ + COMPUTER_HAND_PANEL, + /** */ + WIN_PANEL + } } diff --git a/src/jrummikub/view/impl/HandPanel.java b/src/jrummikub/view/impl/HandPanel.java index 75d424a..823ca12 100644 --- a/src/jrummikub/view/impl/HandPanel.java +++ b/src/jrummikub/view/impl/HandPanel.java @@ -20,6 +20,7 @@ import jrummikub.model.Position; import jrummikub.model.Stone; import jrummikub.util.Pair; import jrummikub.view.IHandPanel; +import jrummikub.view.impl.StonePainter.StoneState; /** * Implementation of the board @@ -118,7 +119,7 @@ class HandPanel extends AbstractStonePanel implements IHandPanel { for (Pair entry : getStones()) { getStonePainter().paintStone(g, entry.getFirst(), entry.getSecond(), - selectedStones.contains(entry.getFirst()), + selectedStones.contains(entry.getFirst()) ? StoneState.SELECTED : StoneState.NORMAL, entry.getFirst() == getHoveredStone()); } } diff --git a/src/jrummikub/view/impl/StoneCollectionPanel.java b/src/jrummikub/view/impl/StoneCollectionPanel.java index 5b08f51..1bb21a9 100644 --- a/src/jrummikub/view/impl/StoneCollectionPanel.java +++ b/src/jrummikub/view/impl/StoneCollectionPanel.java @@ -20,6 +20,7 @@ import jrummikub.util.Event1; import jrummikub.util.IEvent1; import jrummikub.util.Pair; import jrummikub.view.IStoneCollectionPanel; +import jrummikub.view.impl.StonePainter.StoneState; /** * Implementation of the stone collection (selection) @@ -148,7 +149,7 @@ class StoneCollectionPanel extends AbstractStonePanel implements float xpos = 0; for (Stone stone : selectedStones) { - getStonePainter().paintStone(g, stone, new Position(xpos, 0), false, + getStonePainter().paintStone(g, stone, new Position(xpos, 0), StoneState.NORMAL, stone == getHoveredStone()); xpos++; } diff --git a/src/jrummikub/view/impl/StonePainter.java b/src/jrummikub/view/impl/StonePainter.java index 298f9ac..143ef86 100644 --- a/src/jrummikub/view/impl/StonePainter.java +++ b/src/jrummikub/view/impl/StonePainter.java @@ -23,6 +23,10 @@ import jrummikub.model.StoneColor; * coordinates */ class StonePainter { + enum StoneState { + NORMAL, SELECTED, INVALID + } + private static final double ASPECT_RATIO = 0.75f; private static final double DEFAULT_WIDTH = 40; private static final double TEXT_POS = 0.275f; @@ -34,11 +38,10 @@ class StonePainter { private static final double BRIGHTER_SCALE = 1.15f; private static final double HOVER_RATIO = 0.7f; + private static final double REDDEN_RATIO = 0.3f; - private Map> defaultStones; - private Map> selectedStones; - private Map> hoveredStones; - private Map> hoveredSelectedStones; + private Map>> defaultStones; + private Map>> hoveredStones; /** * The width of one pixel in the scale of 1.0 @@ -71,6 +74,14 @@ class StonePainter { return new Color(r > 255 ? 255 : r, g > 255 ? 255 : g, b > 255 ? 255 : b); } + private static Color redden(Color color) { + int r = (int) (color.getRed() * REDDEN_RATIO + 255 * (1 - REDDEN_RATIO)); + int g = (int) (color.getGreen() * REDDEN_RATIO + 128 * (1 - REDDEN_RATIO)); + int b = (int) (color.getBlue() * REDDEN_RATIO + 128 * (1 - REDDEN_RATIO)); + + return new Color(r > 255 ? 255 : r, g > 255 ? 255 : g, b > 255 ? 255 : b); + } + public static Color getColor(StoneColor color) { switch (color) { case BLACK: @@ -160,21 +171,13 @@ class StonePainter { } private BufferedImage getStoneImage(StoneColor color, int value, - boolean selected, boolean hovered) { + StoneState state, boolean hovered) { Map> stoneMap; - if (selected) { - if (hovered) { - stoneMap = hoveredSelectedStones; - } else { - stoneMap = selectedStones; - } + if (hovered) { + stoneMap = hoveredStones.get(state); } else { - if (hovered) { - stoneMap = hoveredStones; - } else { - stoneMap = defaultStones; - } + stoneMap = defaultStones.get(state); } BufferedImage image = stoneMap.get(color).get(value); @@ -182,10 +185,15 @@ class StonePainter { if (image == null) { Color background = BACKGROUND_COLOR; Color foreground = getColor(color); - if (selected) { + + if (state == StoneState.SELECTED) { background = background.darker(); foreground = foreground.darker(); + } else if (state == StoneState.INVALID) { + background = redden(background); + foreground = redden(foreground); } + if (hovered) { background = hover(background); foreground = hover(foreground); @@ -200,16 +208,20 @@ class StonePainter { } private void resetPrepaint() { - defaultStones = new HashMap>(); - selectedStones = new HashMap>(); - hoveredStones = new HashMap>(); - hoveredSelectedStones = new HashMap>(); - - for (StoneColor color : StoneColor.values()) { - defaultStones.put(color, new HashMap()); - selectedStones.put(color, new HashMap()); - hoveredStones.put(color, new HashMap()); - hoveredSelectedStones.put(color, new HashMap()); + defaultStones = new HashMap>>(); + hoveredStones = new HashMap>>(); + + for (StoneState state : StoneState.values()) { + Map> defaultStateStones = new HashMap>(); + Map> hoveredStateStones = new HashMap>(); + + defaultStones.put(state, defaultStateStones); + hoveredStones.put(state, hoveredStateStones); + + for (StoneColor color : StoneColor.values()) { + defaultStateStones.put(color, new HashMap()); + hoveredStateStones.put(color, new HashMap()); + } } } @@ -348,25 +360,26 @@ class StonePainter { * the stone to paint * @param p * the position of the stone - * @param selected - * if selected is true the stone will be painted darker + * @param state + * if the stone is selected the stone will be painted darker, if it + * is invalid it will be painted in red * @param hovered * if hovered is true the stone will be painted brighter */ public void paintStone(Graphics2D g, Stone stone, Position p, - boolean selected, boolean hovered) { + StoneState state, boolean hovered) { int width = getStoneWidth(); int height = getStoneHeight(); int x = (int) Math.round(p.getX() * width), y = (int) Math.round(p.getY() * height); if (stone.isJoker()) { - g.drawImage(getStoneImage(stone.getColor(), 0, selected, hovered), x, y, + g.drawImage(getStoneImage(stone.getColor(), 0, state, hovered), x, y, null); } else { g.drawImage( - getStoneImage(stone.getColor(), stone.getValue(), selected, hovered), - x, y, null); + getStoneImage(stone.getColor(), stone.getValue(), state, hovered), x, + y, null); } } } diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java index 1e8a2b6..4b7ab9f 100644 --- a/src/jrummikub/view/impl/TablePanel.java +++ b/src/jrummikub/view/impl/TablePanel.java @@ -28,6 +28,7 @@ import jrummikub.util.IListener1; import jrummikub.util.Pair; import jrummikub.view.IStoneCollectionPanel; import jrummikub.view.ITablePanel; +import jrummikub.view.impl.StonePainter.StoneState; /** * The implementation of the table @@ -54,6 +55,8 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { private Iterable> stoneSets = Collections.emptySet(); private List> pauseStoneSets; + private Collection invalidStoneSets = Collections.emptyList(); + private Collection selectedStones = Collections.emptyList(); private Event1 leftConnectorClickEvent = new Event1(); @@ -112,6 +115,11 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { repaint(); } + void setInvalidStoneSets(Collection sets) { + invalidStoneSets = sets; + repaint(); + } + void createPauseStoneSets() { pauseStoneSets = new ArrayList>(); @@ -312,8 +320,12 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { (int) (width * CONNECTOR_WIDTH), height))); for (Stone stone : stoneSet) { + StoneState state = invalidStoneSets.contains(stoneSet) ? StoneState.INVALID + : selectedStones.contains(stone) ? StoneState.SELECTED + : StoneState.NORMAL; + getStonePainter().paintStone(g, stone, new Position(x, pos.getY()), - selectedStones.contains(stone), stone == getHoveredStone()); + state, stone == getHoveredStone()); x++; } diff --git a/src/jrummikub/view/impl/View.java b/src/jrummikub/view/impl/View.java index 83ca40b..5ede7b3 100644 --- a/src/jrummikub/view/impl/View.java +++ b/src/jrummikub/view/impl/View.java @@ -364,6 +364,11 @@ public class View extends JFrame implements IView { playerPanel.getHandPanel().setSelectedStones(stones); } + @Override + public void setInvalidStoneSets(Collection sets) { + table.setInvalidStoneSets(sets); + } + @Override public void showSettingsPanel(boolean show) { if (show) { -- cgit v1.2.3