package com.shootoff.gui;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Map;
import java.util.Optional;
import com.shootoff.camera.shot.ArenaShot;
import com.shootoff.camera.shot.DisplayShot;
import com.shootoff.config.Configuration;
import com.shootoff.gui.pane.ProjectorArenaPane;
import com.shootoff.gui.targets.MirroredTarget;
import com.shootoff.gui.targets.TargetView;
import com.shootoff.targets.Target;
import com.shootoff.targets.io.TargetIO.TargetComponents;
import javafx.collections.ObservableList;
import javafx.geometry.Bounds;
import javafx.geometry.Dimension2D;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.image.Image;
public class MirroredCanvasManager extends CanvasManager {
private final Configuration config;
private MirroredCanvasManager mirroredManager;
public MirroredCanvasManager(Group canvasGroup, Resetter resetter, String cameraName,
ObservableList<ShotEntry> shotEntries, ProjectorArenaPane arenaPane) {
super(canvasGroup, resetter, cameraName, shotEntries);
config = Configuration.getConfig();
this.arenaPane = Optional.of(arenaPane);
}
public void setMirroredManager(MirroredCanvasManager mirroredManager) {
this.mirroredManager = mirroredManager;
}
@Override
public Optional<Target> addTarget(File targetFile, boolean playAnimations) {
return mirroredManager.mirrorAddTarget(targetFile, playAnimations);
}
public Optional<Target> mirrorAddTarget(File targetFile, boolean playAnimations) {
return super.addTarget(targetFile, playAnimations);
}
@Override
public Optional<Target> addTarget(File targetFile) {
return mirroredManager.mirrorAddTarget(targetFile);
}
public Optional<Target> mirrorAddTarget(File targetFile) {
return super.addTarget(targetFile);
}
@Override
public Target addTarget(File targetFile, Group targetGroup, Map<String, String> targetTags, boolean userDeletable) {
final Optional<TargetComponents> targetComponents = super.loadTarget(targetFile, false);
if (targetComponents.isPresent()) {
final TargetComponents tc = targetComponents.get();
return mirroredManager.mirrorAddTarget(targetFile, tc.getTargetGroup(), tc.getTargetTags(), userDeletable);
}
return null;
}
public Target mirrorAddTarget(File targetFile, Group targetGroup, Map<String, String> targetTags,
boolean userDeletable) {
return super.addTarget(targetFile, targetGroup, targetTags, userDeletable);
}
@Override
public Target addTarget(Target newTarget) {
final MirroredTarget target;
if (newTarget instanceof MirroredTarget) {
target = (MirroredTarget) newTarget;
} else {
target = new MirroredTarget(newTarget.getTargetFile(), ((TargetView) newTarget).getTargetGroup(),
newTarget.getAllTags(), config, this, ((TargetView) newTarget).isUserDeletable());
}
final Optional<TargetComponents> targetComponents = super.loadTarget(newTarget.getTargetFile(), false);
if (targetComponents.isPresent()) {
final TargetComponents tc = targetComponents.get();
final MirroredTarget t = new MirroredTarget(newTarget.getTargetFile(), tc.getTargetGroup(),
tc.getTargetTags(), config, mirroredManager, ((TargetView) newTarget).isUserDeletable());
final Dimension2D targetDimension = target.getDimension();
t.mirrorSetDimensions(targetDimension.getWidth(), targetDimension.getHeight());
final Point2D targetPosition = target.getPosition();
t.mirrorSetPosition(targetPosition.getX(), targetPosition.getY());
mirroredManager.mirrorAddTarget(t);
target.setMirroredTarget(t);
t.setMirroredTarget(target);
arenaPane.get().targetAdded(target);
}
return super.addTarget(target);
}
public Target mirrorAddTarget(Target newTarget) {
return super.addTarget(newTarget);
}
@Override
public void removeTarget(Target target) {
if (!(target instanceof MirroredTarget)) {
throw new AssertionError(
"Expected a target passed to removeTarget on the arena pane to be a MirroredTarget");
}
mirroredManager.mirrorRemoveTarget(((MirroredTarget) target).getMirroredTarget());
super.removeTarget(target);
arenaPane.get().targetRemoved(target);
}
public void mirrorRemoveTarget(Target target) {
super.removeTarget(target);
}
@Override
public void clearTargets() {
mirroredManager.mirrorClearTargets();
super.clearTargets();
}
public void mirrorClearTargets() {
super.clearTargets();
}
@Override
public void setBackgroundFit(double width, double height) {
mirroredManager.mirrorSetBackgroundFit(width, height);
super.setBackgroundFit(width, height);
}
public void mirrorSetBackgroundFit(double width, double height) {
super.setBackgroundFit(width, height);
}
@Override
public void updateBackground(BufferedImage frame, Optional<Bounds> projectionBounds) {
mirroredManager.mirrorUpdateBackground(frame, projectionBounds);
super.updateBackground(frame, projectionBounds);
}
public void mirrorUpdateBackground(BufferedImage frame, Optional<Bounds> projectionBounds) {
super.updateBackground(frame, projectionBounds);
}
@Override
public void updateBackground(Image img) {
mirroredManager.mirrorUpdateBackground(img);
super.updateBackground(img);
}
public void mirrorUpdateBackground(Image img) {
super.updateBackground(img);
}
@Override
public void addShot(DisplayShot shot, boolean isMirroredShot) {
final DisplayShot mirroredShot = new DisplayShot(shot, shot.getMarker());
shot.setMirroredShot(mirroredShot);
mirroredShot.setMirroredShot(shot);
mirroredManager.mirrorAddShot(mirroredShot);
super.addShot(shot, isMirroredShot);
}
public void mirrorAddShot(DisplayShot shot) {
super.addShot(shot, true);
}
@Override
public boolean addArenaShot(ArenaShot shot, Optional<String> videoString, boolean isMirroredShot) {
mirroredManager.mirrorAddArenaShot(new ArenaShot(shot), videoString);
return super.addArenaShot(shot, videoString, isMirroredShot);
}
public boolean mirrorAddArenaShot(ArenaShot shot, Optional<String> videoString) {
return super.addArenaShot(shot, videoString, true);
}
@Override
public void clearShots() {
mirroredManager.mirrorClearShots();
super.clearShots();
}
public void mirrorClearShots() {
super.clearShots();
}
@Override
public void reset() {
mirroredManager.mirrorReset();
super.reset();
}
public void mirrorReset() {
super.reset();
}
}