summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/jrummikub/view/impl/AbstractStonePanel.java38
-rw-r--r--src/jrummikub/view/impl/HandPanel.java2
-rw-r--r--src/jrummikub/view/impl/StoneCollectionPanel.java2
-rw-r--r--src/jrummikub/view/impl/StonePainter.java57
-rw-r--r--src/jrummikub/view/impl/TablePanel.java2
5 files changed, 86 insertions, 15 deletions
diff --git a/src/jrummikub/view/impl/AbstractStonePanel.java b/src/jrummikub/view/impl/AbstractStonePanel.java
index 7210d1c..fd3862b 100644
--- a/src/jrummikub/view/impl/AbstractStonePanel.java
+++ b/src/jrummikub/view/impl/AbstractStonePanel.java
@@ -3,6 +3,7 @@ package jrummikub.view.impl;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Rectangle2D;
import java.util.Collections;
@@ -30,6 +31,7 @@ abstract class AbstractStonePanel extends JPanel implements IStonePanel,
private Event2<Stone, Boolean> setClickEvent = new Event2<Stone, Boolean>();
private Iterable<Pair<Stone, Position>> stones = Collections.emptySet();
+ private Stone hoveredStone = null;
/**
* @return the stone painter
@@ -52,7 +54,7 @@ abstract class AbstractStonePanel extends JPanel implements IStonePanel,
* the grid scale
*/
public AbstractStonePanel(float scale) {
- super(false); // Unset double buffered
+ super(true); // Set double buffered
stonePainter = new StonePainter(scale);
@@ -81,9 +83,43 @@ abstract class AbstractStonePanel extends JPanel implements IStonePanel,
event.emit(stone, e.isControlDown());
}
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ setHoveredStone(null);
+ }
+ });
+
+ addMouseMotionListener(new MouseMotionAdapter() {
+ @Override
+ public void mouseMoved(MouseEvent e) {
+ Insets insets = getInsets();
+ Pair<Integer, Integer> trans = getTranslation();
+ Position pos = stonePainter.calculatePosition(e.getX() - insets.left
+ - trans.getFirst(), e.getY() - insets.top - trans.getSecond());
+
+ setHoveredStone(getStoneAt(pos));
+ }
});
}
+ private void setHoveredStone(Stone stone) {
+ Stone oldStone = hoveredStone;
+ hoveredStone = stone;
+
+ if (oldStone != hoveredStone)
+ repaint();
+ }
+
+ /**
+ * Returns the stone the mouse pointer is hovering over
+ *
+ * @return the hovered stone
+ */
+ protected Stone getHoveredStone() {
+ return hoveredStone;
+ }
+
/**
* *Overwrite this method* to signal if special zone was clicked
*
diff --git a/src/jrummikub/view/impl/HandPanel.java b/src/jrummikub/view/impl/HandPanel.java
index ab4caec..38a8440 100644
--- a/src/jrummikub/view/impl/HandPanel.java
+++ b/src/jrummikub/view/impl/HandPanel.java
@@ -100,7 +100,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()), entry.getFirst() == getHoveredStone());
}
}
diff --git a/src/jrummikub/view/impl/StoneCollectionPanel.java b/src/jrummikub/view/impl/StoneCollectionPanel.java
index e4a9c94..5064b56 100644
--- a/src/jrummikub/view/impl/StoneCollectionPanel.java
+++ b/src/jrummikub/view/impl/StoneCollectionPanel.java
@@ -110,7 +110,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), false, stone == getHoveredStone());
xpos++;
}
}
diff --git a/src/jrummikub/view/impl/StonePainter.java b/src/jrummikub/view/impl/StonePainter.java
index 68ab72c..bfa61ea 100644
--- a/src/jrummikub/view/impl/StonePainter.java
+++ b/src/jrummikub/view/impl/StonePainter.java
@@ -31,12 +31,14 @@ class StonePainter {
private static final float CIRCLE_WIDTH = 0.45f;
private static final Color BACKGROUND_COLOR = new Color(0.9f, 0.9f, 0.6f);
- private static final Color SELECTED_COLOR = BACKGROUND_COLOR.darker();
private static final float BRIGHTER_SCALE = 1.15f;
+ private static final float HOVER_RATIO = 0.7f;
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;
/**
* The width of one pixel in the scale of 1.0
@@ -55,8 +57,16 @@ class StonePainter {
private static Color brighter(Color color) {
int r = (int) (color.getRed() * BRIGHTER_SCALE);
- int g = (int) (color.getRed() * BRIGHTER_SCALE);
- int b = (int) (color.getRed() * BRIGHTER_SCALE);
+ int g = (int) (color.getGreen() * BRIGHTER_SCALE);
+ int b = (int) (color.getBlue() * BRIGHTER_SCALE);
+
+ return new Color(r > 255 ? 255 : r, g > 255 ? 255 : g, b > 255 ? 255 : b);
+ }
+
+ private static Color hover(Color color) {
+ int r = (int) (color.getRed() * HOVER_RATIO + 255 * (1-HOVER_RATIO));
+ int g = (int) (color.getGreen() * HOVER_RATIO + 255 * (1-HOVER_RATIO));
+ int b = (int) (color.getBlue() * HOVER_RATIO + 255 * (1-HOVER_RATIO));
return new Color(r > 255 ? 255 : r, g > 255 ? 255 : g, b > 255 ? 255 : b);
}
@@ -156,16 +166,25 @@ class StonePainter {
private void prepaint() {
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>>();
Color defaultBackground = BACKGROUND_COLOR;
- Color selectedBackground = SELECTED_COLOR;
+ Color selectedBackground = BACKGROUND_COLOR.darker();
+ Color hoveredBackground = hover(defaultBackground);
+ Color hoveredSelectedBackground = hover(selectedBackground);
for (StoneColor color : StoneColor.values()) {
Color defaultFg = getColor(color);
Color selectedFg = defaultFg.darker();
+ Color hoveredFg = hover(defaultFg);
+ Color hoveredSelectedFg = hover(selectedFg);
defaultStones.put(color, prepaintColor(defaultFg, defaultBackground));
selectedStones.put(color, prepaintColor(selectedFg, selectedBackground));
+ hoveredStones.put(color, prepaintColor(hoveredFg, hoveredBackground));
+ hoveredSelectedStones.put(color,
+ prepaintColor(hoveredSelectedFg, hoveredSelectedBackground));
}
}
@@ -303,21 +322,37 @@ class StonePainter {
* the position of the stone
* @param selected
* if selected is true the stone will be painted darker
+ * @param hovered
+ * if hovered is true the stone will be painted brighter
*/
- public void paintStone(Graphics2D g, Stone stone, Position p, boolean selected) {
+ public void paintStone(Graphics2D g, Stone stone, Position p,
+ boolean selected, boolean hovered) {
// Color background = selected ? SELECTED_COLOR : BACKGROUND_COLOR;
int width = getStoneWidth();
int height = getStoneHeight();
int x = (int) (p.getX() * width), y = (int) (p.getY() * height);
+ Map<StoneColor, Map<Integer, BufferedImage>> stoneMap;
+
+ if (selected) {
+ if (hovered) {
+ stoneMap = hoveredSelectedStones;
+ } else {
+ stoneMap = selectedStones;
+ }
+ } else {
+ if (hovered) {
+ stoneMap = hoveredStones;
+ } else {
+ stoneMap = defaultStones;
+ }
+ }
+
if (stone.isJoker()) {
- g.drawImage(
- (selected ? selectedStones : defaultStones).get(stone.getColor())
- .get(0), x, y, null);
+ g.drawImage(stoneMap.get(stone.getColor()).get(0), x, y, null);
} else {
- g.drawImage(
- (selected ? selectedStones : defaultStones).get(stone.getColor())
- .get(stone.getValue()), x, y, null);
+ g.drawImage(stoneMap.get(stone.getColor()).get(stone.getValue()), x, y,
+ null);
}
}
}
diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java
index c118613..f34765e 100644
--- a/src/jrummikub/view/impl/TablePanel.java
+++ b/src/jrummikub/view/impl/TablePanel.java
@@ -255,7 +255,7 @@ class TablePanel extends AbstractStonePanel implements ITablePanel {
for (Stone stone : stoneSet) {
getStonePainter().paintStone(g, stone, new Position(x, pos.getY()),
- selectedStones.contains(stone));
+ selectedStones.contains(stone), stone == getHoveredStone());
x++;
}