package magic.ui.widget.duel.animation;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import javax.swing.SwingUtilities;
import magic.data.GeneralConfig;
import magic.ui.duel.viewerinfo.GameViewerInfo;
import magic.ui.theme.Theme;
import magic.ui.utility.MagicStyle;
import org.pushingpixels.trident.Timeline;
import org.pushingpixels.trident.TimelineScenario;
import org.pushingpixels.trident.callback.TimelineCallback;
class NewTurnAnimation extends MagicAnimation {
private final Timeline timelines[] = new Timeline[1];
private TimelineScenario scenario;
private final GameLayoutInfo layoutInfo;
private final GameViewerInfo gameInfo;
public NewTurnAnimation(GameViewerInfo newGameInfo, GameLayoutInfo layoutInfo) {
this.layoutInfo = layoutInfo;
this.gameInfo = newGameInfo;
}
@Override
protected void render(Graphics g) {
final Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(MagicStyle.getTheme().getColor(Theme.COLOR_TITLE_BACKGROUND));
final Rectangle rect = layoutInfo.getTurnPanelLayout();
g2d.fillRect(rect.x, rect.y, rect.width, rect.height);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setColor(Color.WHITE);
final Font f = g2d.getFont().deriveFont(28f);
g2d.setFont(f);
final String s = "Turn " + gameInfo.getTurn();
int w = g2d.getFontMetrics(f).stringWidth(s);
int h = g2d.getFontMetrics(f).getAscent(); // .getHeight();
int x = (rect.width / 2) - (w / 2);
g2d.drawString(s, x, rect.y + h + ((rect.height - h) / 2));
// final Rectangle2D test = g2d.getFontMetrics(f).getStringBounds(s, g);
// g2d.drawRect(x, rect.y + ((rect.height - h) / 2), (int)test.getWidth(), (int)test.getHeight());
g2d.dispose();
}
@Override
protected void play() {
assert SwingUtilities.isEventDispatchThread();
isRunning.set(true);
setupTimelineScenario();
scenario.play();
}
private Timeline getPauseTimeline(final int duration) {
final Timeline timeline = new Timeline(this);
timeline.setDuration(duration);
timeline.addCallback(new TimelineCallback() {
@Override
public void onTimelineStateChanged(Timeline.TimelineState oldState, Timeline.TimelineState newState, float durationFraction, float timelinePosition) {
if (newState == Timeline.TimelineState.PLAYING_FORWARD) {
getCanvas().repaint();
}
}
@Override
public void onTimelinePulse(float durationFraction, float timelinePosition) {
// do nothing.
}
});
return timeline;
}
private void setupTimelineScenario() {
timelines[0] = getPauseTimeline(GeneralConfig.getInstance().getNewTurnAlertDuration());
scenario = new TimelineScenario.Sequence();
for (Timeline timeline : timelines) {
scenario.addScenarioActor(timeline);
}
scenario.addCallback(() -> {
SwingUtilities.invokeLater(() -> {
getCanvas().setVisible(false);
});
isRunning.set(false);
});
}
private void cancelAnimation() {
if (scenario != null && scenario.getState() == TimelineScenario.TimelineScenarioState.PLAYING) {
scenario.cancel();
}
}
@Override
protected void cancel() {
cancelAnimation();
}
@Override
protected void doCancelAction() {
cancelAnimation();
}
}