Mercurial > hg > ristipolku
view game/IDMButton.java @ 188:4568c8016377
Apply scale to IDMContainers also, not only to child widgets.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 20 Mar 2017 12:17:04 +0200 |
parents | c9b743e32567 |
children | 189cd8fe2304 |
line wrap: on
line source
/* * Ristipolku IDM button widget * (C) Copyright 2011 Matti 'ccr' Hämäläinen <ccr@tnsp.org> */ package game; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.awt.geom.*; import javax.imageio.*; import java.io.*; public class IDMButton extends IDMWidget { enum State { FOCUSED, PRESSED, NORMAL } State state; BufferedImage imgOrigUnpressed, imgOrigPressed; BufferedImage imgUnpressed, imgPressed; Font font; FontMetrics metrics; String text; boolean active; public IDMButton(IDMPoint pos, String prefix, int keyCode, Font font, String text) { super(pos); loadImages(prefix); setSize(imgOrigUnpressed.getWidth(), imgOrigUnpressed.getHeight()); setScale(1, 1); this.font = font; this.keyCode = keyCode; this.text = text; state = State.NORMAL; active = false; } public IDMButton(IDMPoint pos, int keyCode, Font font, String text) { this(pos, "button1", keyCode, font, text); } public IDMButton(float x, float y, String prefix, int keyCode, Font font, String text) { this(new IDMPoint(x, y), prefix, keyCode, font, text); } public IDMButton(float x, float y, int keyCode, Font font, String text) { this(new IDMPoint(x, y), keyCode, font, text); } public void loadImages(String prefix) { try { ResourceLoader res = new ResourceLoader("graphics/"+ prefix +"_up.png"); imgOrigUnpressed = ImageIO.read(res.getStream()); res = new ResourceLoader("graphics/"+ prefix +"_down.png"); imgOrigPressed = ImageIO.read(res.getStream()); } catch (IOException e) { System.out.print(e.getMessage()); } } public BufferedImage scaleImage(BufferedImage src) { BufferedImage dst = new BufferedImage(getScaledWidth(), getScaledHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D gimg = dst.createGraphics(); gimg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); gimg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); gimg.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); gimg.drawImage(src, 0, 0, getScaledWidth(), getScaledHeight(), null); return dst; } public void setScale(IDMPoint scale) { super.setScale(scale); imgPressed = scaleImage(imgOrigPressed); imgUnpressed = scaleImage(imgOrigUnpressed); } public void paint(Graphics2D g) { BufferedImage img; int xoffs, yoffs; if (state == State.PRESSED) { img = imgPressed; xoffs = (int) (3.5f * scale.x); yoffs = (int) (3.5f * scale.y); } else { xoffs = yoffs = 0; img = imgUnpressed; } if (metrics == null) metrics = g.getFontMetrics(font); int textWidth = metrics.stringWidth(text); g.drawImage(img, getScaledX() + xoffs, getScaledY() + yoffs, null); g.setFont(font); g.setPaint(Color.black); g.drawString(text, getScaledX() + xoffs + (getScaledWidth() - textWidth) / 2, getScaledY() + yoffs + getScaledHeight() / 2); } public boolean mousePressed(MouseEvent e) { state = State.PRESSED; active = true; return true; } public boolean mouseReleased(MouseEvent e) { boolean oldActive = active; super.mouseReleased(e); state = State.NORMAL; active = false; return oldActive; } public boolean mouseEntered(MouseEvent e) { if (active) { state = State.PRESSED; return true; } else return false; } public boolean mouseExited(MouseEvent e) { if (active) { state = State.NORMAL; return true; } else return false; } }