diff --git a/pom.xml b/pom.xml
index c844a15..da81541 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.2.16
+ 1.2.17
Web4Rail
jar
Java Model Railway Control
diff --git a/resources/css/style.css b/resources/css/style.css
index b34d286..9b56984 100644
--- a/resources/css/style.css
+++ b/resources/css/style.css
@@ -109,7 +109,9 @@ svg circle{
text-align: center;
}
-.Shadow,
+.Shadow{
+ z-index: 100;
+}
.menu .list{
display: none;
}
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index a3eba5b..60a2618 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -397,6 +397,10 @@ public abstract class BaseClass implements Constants{
protected static String t(String txt, Object...fills) {
return Translation.get(Application.class, txt, fills);
}
+
+ public BaseClass unregister() {
+ return registry.remove(this.id());
+ }
protected Object update(HashMap params) {
LOG.debug("update: {}",params);
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 4b8cc20..a38f8ed 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -15,7 +15,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Stack;
import java.util.Vector;
import org.json.JSONArray;
@@ -63,6 +62,7 @@ import de.srsoftware.web4rail.tiles.SignalS;
import de.srsoftware.web4rail.tiles.SignalW;
import de.srsoftware.web4rail.tiles.StraightH;
import de.srsoftware.web4rail.tiles.StraightV;
+import de.srsoftware.web4rail.tiles.StretchableTile;
import de.srsoftware.web4rail.tiles.TextDisplay;
import de.srsoftware.web4rail.tiles.Tile;
import de.srsoftware.web4rail.tiles.Turnout.State;
@@ -238,9 +238,8 @@ public class Plan extends BaseClass{
}
return null;
}
- //if (configJson != null) tile.configure(new JSONObject(configJson));
- set(x, y, tile);
- tile.parent(this);
+ if (tile instanceof StretchableTile) ((StretchableTile)tile).placeShadows();
+ place(tile.position(x, y));
return t("Added {}",tile.getClass().getSimpleName());
}
@@ -503,13 +502,13 @@ public class Plan extends BaseClass{
private String moveTile(String direction, Id tileId) throws NumberFormatException, IOException {
switch (direction) {
case "south":
- return moveTile(get(tileId,false),Direction.SOUTH);
+ return moveTile(get(tileId,true),Direction.SOUTH);
case "north":
- return moveTile(get(tileId,false),Direction.NORTH);
+ return moveTile(get(tileId,true),Direction.NORTH);
case "east":
- return moveTile(get(tileId,false),Direction.EAST);
+ return moveTile(get(tileId,true),Direction.EAST);
case "west":
- return moveTile(get(tileId,false),Direction.WEST);
+ return moveTile(get(tileId,true),Direction.WEST);
}
throw new InvalidParameterException(t("\"{}\" is not a known direction!"));
}
@@ -527,49 +526,27 @@ public class Plan extends BaseClass{
LOG.debug("moveTile({},{},{})",direction,tile.x,tile.y);
switch (direction) {
case EAST:
- moved = moveTile(tile,+1,0);
+ moved = tile.move(+1,0);
break;
case WEST:
- moved = moveTile(tile,-1,0);
+ moved = tile.move(-1,0);
break;
case NORTH:
- moved = moveTile(tile,0,-1);
+ moved = tile.move(0,-1);
break;
case SOUTH:
- moved = moveTile(tile,0,+1);
+ moved = tile.move(0,+1);
break;
}
}
return t(moved ? "Tile(s) moved.":"No tile(s) moved.");
}
- /**
- * processes move-tile instructions sent from the client (subroutine)
- * @param tile
- * @param xstep
- * @param ystep
- * @return
- * @throws IOException
- */
- private boolean moveTile(Tile tile,int xstep,int ystep) throws IOException {
- LOG.error("moveTile({} +{}/+{})",tile,xstep,ystep);
- Stack stack = new Stack();
- while (tile != null) {
- LOG.debug("scheduling tile for movement: {}",tile);
- stack.add(tile);
- tile = get(Tile.id(tile.x+xstep, tile.y+ystep),false);
- }
- while (!stack.isEmpty()) {
- tile = stack.pop();
- if (!(tile instanceof Shadow)) {
- LOG.debug("altering position of {}",tile);
- tile.remove();
- set(tile.x+xstep,tile.y+ystep,tile);
- }
- }
- return false;
+ public void drop(Tile tile) {
+ tile.unregister();
+ stream("remove "+tile.id());
}
-
+
/**
* adds a new tile to the plan on the client side
* @param tile
@@ -578,6 +555,8 @@ public class Plan extends BaseClass{
*/
public Tile place(Tile tile) {
try {
+ tile.parent(this);
+ tile.register();
stream("place "+tile.tag(null));
} catch (IOException e) {
e.printStackTrace();
@@ -659,22 +638,7 @@ public class Plan extends BaseClass{
@Override
protected void removeChild(BaseClass child) {
- if (child instanceof Tile) {
- Tile tile = (Tile) child;
- stream("remove "+tile.id());
- for (int i=1; i shadows = new Vector();
+
+ public void add(Shadow shadow) {
+ shadows.add(shadow.id());
+ }
@Override
public JSONObject config() {
@@ -35,12 +42,57 @@ public abstract class StretchableTile extends Tile {
return super.load(json);
}
+ @Override
+ public boolean move(int dx, int dy) {
+ for (int destX=1; destX 0 ? height() : dy;
+ Tile tileAtDest = plan.get(Tile.id(x+destX, y+destY), true);
+ if (isNull(tileAtDest) || tileAtDest == this) continue;
+ if (!tileAtDest.move(dx, dy)) return false;
+ }
+
+ for (int destY=1; destY 0 ? width() : dx;
+ Tile tileAtDest = plan.get(Tile.id(x+destX, y+destY), true);
+ if (isNull(tileAtDest) || tileAtDest == this) continue;
+ if (!tileAtDest.move(dx, dy)) return false;
+ }
+
+ boolean moved = super.move(dx, dy);
+ if (moved) placeShadows();
+ return moved;
+ }
+
+ public void placeShadows() {
+ removeShadows();
+ for (int dx=1; dx preForm, FormInput formInputs, List