diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2011-06-19 00:14:27 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2011-06-19 00:14:27 +0200 |
commit | 479384d6bfeea0c225af829cbc1cac730d87c844 (patch) | |
tree | f9a1ef3b2e87c9179d482443a11e98581e660939 /src/jrummikub/view | |
parent | e8549b95dff600aa173384a8f7bdbf0871ba9d47 (diff) | |
download | JRummikub-479384d6bfeea0c225af829cbc1cac730d87c844.tar JRummikub-479384d6bfeea0c225af829cbc1cac730d87c844.zip |
Correctly show invalid sets
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@471 72836036-5685-4462-b002-a69064685172
Diffstat (limited to 'src/jrummikub/view')
-rw-r--r-- | src/jrummikub/view/IView.java | 42 | ||||
-rw-r--r-- | src/jrummikub/view/impl/HandPanel.java | 3 | ||||
-rw-r--r-- | src/jrummikub/view/impl/StoneCollectionPanel.java | 3 | ||||
-rw-r--r-- | src/jrummikub/view/impl/StonePainter.java | 79 | ||||
-rw-r--r-- | src/jrummikub/view/impl/TablePanel.java | 14 | ||||
-rw-r--r-- | src/jrummikub/view/impl/View.java | 5 |
6 files changed, 90 insertions, 56 deletions
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<StoneSet> 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<Stone, Position> 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<StoneColor, Map<Integer, BufferedImage>> defaultStones; - private Map<StoneColor, Map<Integer, BufferedImage>> selectedStones; - private Map<StoneColor, Map<Integer, BufferedImage>> hoveredStones; - private Map<StoneColor, Map<Integer, BufferedImage>> hoveredSelectedStones; + private Map<StoneState, Map<StoneColor, Map<Integer, BufferedImage>>> defaultStones; + private Map<StoneState, Map<StoneColor, Map<Integer, BufferedImage>>> 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<StoneColor, Map<Integer, BufferedImage>> 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<StoneColor, Map<Integer, BufferedImage>>(); - selectedStones = new HashMap<StoneColor, Map<Integer, BufferedImage>>(); - hoveredStones = new HashMap<StoneColor, Map<Integer, BufferedImage>>(); - hoveredSelectedStones = new HashMap<StoneColor, Map<Integer, BufferedImage>>(); - - for (StoneColor color : StoneColor.values()) { - defaultStones.put(color, new HashMap<Integer, BufferedImage>()); - selectedStones.put(color, new HashMap<Integer, BufferedImage>()); - hoveredStones.put(color, new HashMap<Integer, BufferedImage>()); - hoveredSelectedStones.put(color, new HashMap<Integer, BufferedImage>()); + defaultStones = new HashMap<StoneState, Map<StoneColor, Map<Integer, BufferedImage>>>(); + hoveredStones = new HashMap<StoneState, Map<StoneColor, Map<Integer, BufferedImage>>>(); + + for (StoneState state : StoneState.values()) { + Map<StoneColor, Map<Integer, BufferedImage>> defaultStateStones = new HashMap<StoneColor, Map<Integer, BufferedImage>>(); + Map<StoneColor, Map<Integer, BufferedImage>> hoveredStateStones = new HashMap<StoneColor, Map<Integer, BufferedImage>>(); + + defaultStones.put(state, defaultStateStones); + hoveredStones.put(state, hoveredStateStones); + + for (StoneColor color : StoneColor.values()) { + defaultStateStones.put(color, new HashMap<Integer, BufferedImage>()); + hoveredStateStones.put(color, new HashMap<Integer, BufferedImage>()); + } } } @@ -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<Pair<StoneSet, Position>> stoneSets = Collections.emptySet(); private List<Pair<StoneSet, Position>> pauseStoneSets; + private Collection<StoneSet> invalidStoneSets = Collections.emptyList(); + private Collection<Stone> selectedStones = Collections.emptyList(); private Event1<StoneSet> leftConnectorClickEvent = new Event1<StoneSet>(); @@ -112,6 +115,11 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { repaint(); } + void setInvalidStoneSets(Collection<StoneSet> sets) { + invalidStoneSets = sets; + repaint(); + } + void createPauseStoneSets() { pauseStoneSets = new ArrayList<Pair<StoneSet, Position>>(); @@ -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 @@ -365,6 +365,11 @@ public class View extends JFrame implements IView { } @Override + public void setInvalidStoneSets(Collection<StoneSet> sets) { + table.setInvalidStoneSets(sets); + } + + @Override public void showSettingsPanel(boolean show) { if (show) { settingsPanel.resetTabbedPane(); |