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.elements.render.ImageRenderer;
import de.lessvoid.nifty.render.NiftyImage;
import de.lessvoid.nifty.render.NiftyRenderEngine;
import de.lessvoid.nifty.render.image.ImageMode;
import de.lessvoid.nifty.render.image.ImageModeFactory;
import de.lessvoid.nifty.render.image.ImageModeHelper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.logging.Logger;
/**
* This can be applied to an image element. This will change the original image of the
* element to the image given in the "active" attribute. When the effect gets deactivated
* the image is being restored to the image given with the "inactive" attribute.
*
* @author void
*/
public class ChangeImage implements EffectImpl {
@Nonnull
private static final Logger log = Logger.getLogger(ChangeImage.class.getName());
@Nonnull
private Element element;
@Nullable
private NiftyImage activeImage;
@Nullable
private NiftyImage inactiveImage;
@Override
public void activate(
@Nonnull final Nifty nifty,
@Nonnull final Element element,
@Nonnull final EffectProperties parameter) {
this.element = element;
this.activeImage = loadImage("active", nifty, parameter);
this.inactiveImage = loadImage("inactive", nifty, parameter);
}
@Override
public void execute(
@Nonnull final Element element,
final float normalizedTime,
@Nullable final Falloff falloff,
@Nonnull final NiftyRenderEngine r) {
changeElementImage(activeImage);
}
@Override
public void deactivate() {
changeElementImage(inactiveImage);
if (activeImage != null) {
activeImage.dispose();
}
if (inactiveImage != null) {
inactiveImage.dispose();
}
}
@Nullable
private NiftyImage loadImage(
@Nonnull final String name,
@Nonnull final Nifty nifty,
@Nonnull final EffectProperties parameter) {
NiftyImage image = createImage(name, nifty, parameter);
if (image == null) {
return null;
}
setImageMode(image, name, parameter);
return image;
}
@Nullable
private NiftyImage createImage(
@Nonnull final String name,
@Nonnull final Nifty nifty,
@Nonnull final EffectProperties parameter) {
return nifty.createImage(parameter.getProperty(name), false);
}
private void setImageMode(
@Nonnull final NiftyImage image,
@Nonnull final String name,
@Nonnull final EffectProperties parameter) {
String areaProviderProperty = getAreaProviderProperty(name, parameter);
String renderStrategyProperty = getRenderStrategyProperty(name, parameter);
if ((areaProviderProperty != null) || (renderStrategyProperty != null)) {
image.setImageMode(createImageMode(areaProviderProperty, renderStrategyProperty));
}
}
@Nullable
private String getAreaProviderProperty(@Nonnull final String name, @Nonnull final EffectProperties parameter) {
return ImageModeHelper.getAreaProviderProperty(getImageModeProperty(name, parameter));
}
@Nullable
private String getRenderStrategyProperty(@Nonnull final String name, @Nonnull final EffectProperties parameter) {
return ImageModeHelper.getRenderStrategyProperty(getImageModeProperty(name, parameter));
}
@Nullable
private String getImageModeProperty(@Nonnull final String name, @Nonnull final EffectProperties parameter) {
String imageModeProperty = null;
if ("active".equals(name)) {
imageModeProperty = parameter.getProperty("imageModeActive", null);
} else if ("inactive".equals(name)) {
imageModeProperty = parameter.getProperty("imageModeInactive", null);
}
if (imageModeProperty == null) {
imageModeProperty = parameter.getProperty("imageMode", null);
}
return imageModeProperty;
}
@Nonnull
private ImageMode createImageMode(
@Nullable final String areaProviderProperty,
@Nullable final String renderStrategyProperty) {
return ImageModeFactory.getSharedInstance().createImageMode(areaProviderProperty, renderStrategyProperty);
}
private void changeElementImage(@Nullable final NiftyImage image) {
ImageRenderer imageRenderer = element.getRenderer(ImageRenderer.class);
if (imageRenderer == null) {
log.warning("this effect can only be applied to images!");
return;
}
imageRenderer.setImage(image);
}
}