package com.clearlyspam23.GLE.basic.layers.tile.edit.commands; import java.awt.geom.Point2D; import java.util.HashSet; import java.util.Set; import org.piccolo2d.PCamera; import org.piccolo2d.PNode; import org.piccolo2d.event.PDragSequenceEventHandler; import org.piccolo2d.event.PInputEvent; import org.piccolo2d.util.PPickPath; import com.clearlyspam23.GLE.basic.layers.tile.edit.TileLayerEditManager; import com.clearlyspam23.GLE.basic.layers.tile.gui.TileLayerPNode; import com.clearlyspam23.GLE.basic.layers.tile.gui.TilePNode; public abstract class TileDragCommand extends PDragSequenceEventHandler { protected TileLayerEditManager data; private TileLayerPNode currentNode; protected Set<TilePNode> visited = new HashSet<TilePNode>(); private boolean shouldRun; public TileDragCommand(TileLayerEditManager data){ this.data = data; } @Override protected void startDrag(PInputEvent event){ super.startDrag(event); if(event.isLeftMouseButton()){ shouldRun = onStart(event); tryPlaceImage(event.getCanvasPosition(), event.getCamera()); } } @Override protected void endDrag(PInputEvent event){ super.endDrag(event); if(event.isLeftMouseButton()){ currentNode = null; onFinish(event); visited.clear(); } } protected abstract void setTile(TilePNode tile, PCamera cam); protected abstract void onFinish(PInputEvent event); protected abstract boolean onStart(PInputEvent event); @Override protected boolean shouldStartDragInteraction(PInputEvent event) { if (super.shouldStartDragInteraction(event)) { return event.isLeftMouseButton(); } return false; } protected void tryPlaceImage(Point2D pos, PCamera cam) { PNode p = getPickedNode(pos, cam); if(shouldRun&&p instanceof TilePNode){ TilePNode tile = (TilePNode)p; if(currentNode == null) currentNode = (TileLayerPNode) tile.getParent(); if(!visited.contains(tile)&¤tNode.equals(tile.getParent())){ visited.add(tile); setTile(tile, cam); } } } protected void drag(PInputEvent event) { super.drag(event); tryPlaceImage(event.getCanvasPosition(), event.getCamera()); } private PNode getPickedNode(Point2D pos, PCamera cam){ final PPickPath p = cam.pick(pos.getX(), pos.getY(), 1); if(p==null) return null; return p.getPickedNode(); } }