package de.lessvoid.nifty.effects.impl;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.effects.EffectImpl;
import de.lessvoid.nifty.effects.EffectProperties;
import de.lessvoid.nifty.effects.Falloff;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.render.NiftyRenderEngine;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.nifty.tools.TargetElementResolver;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.logging.Logger;
/**
* Move - move stuff around.
*
* @author void
*/
public class Move implements EffectImpl {
private static final Logger log = Logger.getLogger(Move.class.getName());
private static final String LEFT = "left";
private static final String RIGHT = "right";
private static final String TOP = "top";
private static final String BOTTOM = "bottom";
private String direction;
private long offset = 0;
private long startOffset = 0;
private int offsetDir = 0;
private float offsetY;
private float startOffsetY;
private int startOffsetX;
private float offsetX;
private boolean withTarget = false;
private boolean fromOffset = false;
private boolean toOffset = false;
@Override
public void activate(
@Nonnull final Nifty nifty,
@Nonnull final Element element,
@Nonnull final EffectProperties parameter) {
String mode = parameter.getProperty("mode");
direction = parameter.getProperty("direction");
if (LEFT.equals(direction)) {
offset = element.getX() + element.getWidth();
} else if (RIGHT.equals(direction)) {
offset = nifty.getRenderEngine().getWidth() - element.getX();
} else if (TOP.equals(direction)) {
offset = element.getY() + element.getHeight();
} else if (BOTTOM.equals(direction)) {
offset = nifty.getRenderEngine().getHeight() - element.getY();
} else {
offset = 0;
}
if ("out".equals(mode)) {
startOffset = 0;
offsetDir = -1;
withTarget = false;
} else if ("in".equals(mode)) {
startOffset = offset;
offsetDir = 1;
withTarget = false;
} else if ("fromPosition".equals(mode)) {
withTarget = true;
} else if ("toPosition".equals(mode)) {
withTarget = true;
} else if ("fromOffset".equals(mode)) {
fromOffset = true;
startOffsetX = Integer.valueOf(parameter.getProperty("offsetX", "0"));
startOffsetY = Integer.valueOf(parameter.getProperty("offsetY", "0"));
offsetX = startOffsetX * -1;
offsetY = startOffsetY * -1;
} else if ("toOffset".equals(mode)) {
toOffset = true;
startOffsetX = 0;
startOffsetY = 0;
offsetX = Integer.valueOf(parameter.getProperty("offsetX", "0"));
offsetY = Integer.valueOf(parameter.getProperty("offsetY", "0"));
}
String target = parameter.getProperty("targetElement");
Screen screen = nifty.getCurrentScreen();
if (target != null && screen != null) {
TargetElementResolver resolver = new TargetElementResolver(screen, element);
Element targetElement = resolver.resolve(target);
if (targetElement == null) {
log.warning("move effect for element [" + element.getId() + "] was unable to find target element [" + target
+ "] at screen [" + screen.getScreenId() + "]");
return;
}
if ("fromPosition".equals(mode)) {
startOffsetX = targetElement.getX() - element.getX();
startOffsetY = targetElement.getY() - element.getY();
offsetX = -(targetElement.getX() - element.getX());
offsetY = -(targetElement.getY() - element.getY());
} else if ("toPosition".equals(mode)) {
startOffsetX = 0;
startOffsetY = 0;
offsetX = (targetElement.getX() - element.getX());
offsetY = (targetElement.getY() - element.getY());
}
}
}
@Override
public void execute(
@Nonnull final Element element,
final float normalizedTime,
@Nullable final Falloff falloff,
@Nonnull final NiftyRenderEngine r) {
if (fromOffset || toOffset) {
float moveToX = startOffsetX + normalizedTime * offsetX;
float moveToY = startOffsetY + normalizedTime * offsetY;
r.moveTo(moveToX, moveToY);
} else if (withTarget) {
float moveToX = startOffsetX + normalizedTime * offsetX;
float moveToY = startOffsetY + normalizedTime * offsetY;
r.moveTo(moveToX, moveToY);
} else {
if (LEFT.equals(direction)) {
r.moveTo(-startOffset + offsetDir * normalizedTime * offset, 0);
} else if (RIGHT.equals(direction)) {
r.moveTo(startOffset - offsetDir * normalizedTime * offset, 0);
} else if (TOP.equals(direction)) {
r.moveTo(0, -startOffset + offsetDir * normalizedTime * offset);
} else if (BOTTOM.equals(direction)) {
r.moveTo(0, startOffset - offsetDir * normalizedTime * offset);
}
}
}
@Override
public void deactivate() {
}
}