view game/IDMButton.java @ 192:8dbaa093c562

Improve debug message handling.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 23 Apr 2019 13:00:25 +0300
parents 189cd8fe2304
children b88440f4431a
line wrap: on
line source

/*
 * Ristipolku IDM button widget
 * (C) Copyright 2011-2017 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)
        {
            G.debug(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;
    }
}