From 9bfe0d56ddaab6bfd3c9b087314c078f62d071df Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 4 Dec 2020 14:14:32 +0100 Subject: [PATCH] re-implemented moving of tiles --- pom.xml | 2 +- resources/css/style.css | 4 +- .../de/srsoftware/web4rail/BaseClass.java | 4 + .../java/de/srsoftware/web4rail/Plan.java | 97 ++++--------------- .../de/srsoftware/web4rail/tiles/BlockH.java | 2 +- .../de/srsoftware/web4rail/tiles/BlockV.java | 2 +- .../de/srsoftware/web4rail/tiles/Shadow.java | 4 +- .../srsoftware/web4rail/tiles/StraightH.java | 2 +- .../srsoftware/web4rail/tiles/StraightV.java | 2 +- .../web4rail/tiles/StretchableTile.java | 64 +++++++++++- .../web4rail/tiles/TextDisplay.java | 2 +- .../de/srsoftware/web4rail/tiles/Tile.java | 25 +++-- 12 files changed, 109 insertions(+), 101 deletions(-) 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
postForm) { formInputs.add(stretchType(),new Input(STRETCH_LENGTH, stretch).numeric().addTo(new Tag("span")).content(NBSP+t("Tile(s)"))); return super.properties(preForm, formInputs, postForm); } + @Override + public BaseClass remove() { + super.remove(); + removeShadows(); + return this; + } + + private void removeShadows() { + while (!shadows.isEmpty()) { + Tile tile = BaseClass.get(shadows.remove(0)); + if (tile instanceof Shadow) tile.remove(); + } + } + + public int stretch() { + return stretch; + } + private void stretch(String value) { try { stretch(Integer.parseInt(value)); @@ -49,10 +101,14 @@ public abstract class StretchableTile extends Tile { } } - public void stretch(int len) { - this.stretch = Math.max(1, len); + public void stretch(int newStretch) { + newStretch = Math.max(1, newStretch); + if (newStretch != stretch) { + stretch = newStretch; + placeShadows(); + } } - + protected abstract String stretchType(); @Override diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java b/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java index 3d16fe4..06332b7 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TextDisplay.java @@ -81,6 +81,6 @@ public class TextDisplay extends StretchableTile { @Override public int width() { - return stretch; + return stretch(); } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 3e6b8b9..85d8176 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -56,7 +56,6 @@ public abstract class Tile extends BaseClass implements Comparable{ protected Direction oneWay = null; protected Route route = null; private TreeSet routes = new TreeSet<>(); - protected TreeSet shadows = new TreeSet<>(); protected Train train = null; public Integer x = null; public Integer y = null; @@ -65,10 +64,6 @@ public abstract class Tile extends BaseClass implements Comparable{ this.routes.add(route); } - public void addShadow(Shadow shadow) { - shadows.add(shadow); - } - protected Vector classes(){ Vector classes = new Vector(); classes.add("tile"); @@ -113,8 +108,9 @@ public abstract class Tile extends BaseClass implements Comparable{ private static void inflate(String clazz, JSONObject json, Plan plan) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, IOException { clazz = Tile.class.getName().replace(".Tile", "."+clazz); Tile tile = (Tile) Tile.class.getClassLoader().loadClass(clazz).getDeclaredConstructor().newInstance(); - tile.load(json).parent(plan); - plan.set(tile.x, tile.y, tile); + tile.load(json).register(); + if (tile instanceof StretchableTile) ((StretchableTile)tile).placeShadows(); + plan.place(tile); } public boolean isFreeFor(Train newTrain) { @@ -382,14 +378,12 @@ public abstract class Tile extends BaseClass implements Comparable{ public BaseClass remove() { super.remove(); while (!routes.isEmpty()) routes.first().remove(); - while (!shadows.isEmpty()) shadows.first().remove(); return this; } @Override public void removeChild(BaseClass child) { routes.remove(child); - if (child instanceof Shadow) shadows.remove(child); if (child == train) train = null; if (child == route) route = null; plan.place(this); @@ -421,4 +415,17 @@ public abstract class Tile extends BaseClass implements Comparable{ public int width() { return 1; } + + public boolean move(int dx, int dy) { + int destX = x+(dx > 0 ? width() : dx); + int destY = y+(dy > 0 ? height() : dy); + if (destX < 0 || destY < 0) return false; + + Tile tileAtDestination = plan.get(id(destX, destY),true); + if (isSet(tileAtDestination) && !tileAtDestination.move(dx, dy)) return false; + plan.drop(this); + position(x+dx, y+dy); + plan.place(this); + return true; + } }