diff --git a/pom.xml b/pom.xml index 04ce705..08390a2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.11.1 + 0.11.2 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 8cce482..cfdf233 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -15,6 +15,7 @@ Analyze : analysieren Apply : Übernehmen Availability : Verfügbarkeit Block properties : Block-Eigenschaften +{}bound : nach {} Cars\: : Waggons: ConditionalAction : bedingte Aktion Conditions : Bedingungen @@ -30,6 +31,7 @@ DelayedAction : verzögerte Aktion delete : entfernen delete route : Route löschen Destination\: {} from {} : Ziel: {} von {} +Direction : Richtung disabled : deaktiviert EAST : Osten editable train properties : veränderliche Zug-Eigenschaften @@ -53,9 +55,11 @@ Manage cars : Waggons verwalten Manage locos : Lokomotiven verwalten Manage trains : Züge verwalten Maximum train length\: : maximale Zug-Länge +Minimum and maximum times (in Miliseconds) trains with the respective tag have to wait in this block. : Minamle und maximale Block-Haltezeit (in Millisekunden) für Züge mit der entsprchender Markierung. Move tiles : Kacheln verschieben name\: : Name: new locomotive : neue Lok +new tag : neue Markierung new train : neuer Zug No : keine No free routes from {} : keine Route von {} frei @@ -96,10 +100,12 @@ SOUTH : Süden Started {} : {} gestartet StopAllTrains : Alle Züge stoppen StopAuto : Automatikmodus abschalten +Stopsettings : Halte-Einstellungen Straight port\: : Port für gerade STRAIGHT : gerade Switch power off : Strom ausschalten Switch power on : Strom anschalten +Tag : Markierung Tags : Markierungen Toggle : umschalten Toggle power : Stom umschalten diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java index 0a349da..e5e424b 100644 --- a/src/main/java/de/srsoftware/web4rail/BaseClass.java +++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java @@ -1,5 +1,6 @@ package de.srsoftware.web4rail; +import java.util.HashMap; import java.util.Map; import org.json.JSONObject; @@ -20,4 +21,10 @@ public class BaseClass implements Constants{ public static boolean isSet(Object o) { return o != null; } + + public static HashMap merged(Map base, Map overlay) { + HashMap merged = new HashMap<>(base); + overlay.entrySet().stream().forEach(entry -> merged.put(entry.getKey(), entry.getValue())); + return merged; + } } diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java index 04d64ce..9501a71 100644 --- a/src/main/java/de/srsoftware/web4rail/Constants.java +++ b/src/main/java/de/srsoftware/web4rail/Constants.java @@ -28,6 +28,7 @@ public interface Constants { public static final String ACTION_SLOWER10 = "slower10"; public static final String ACTION_START = "start"; public static final String ACTION_STOP = "stop"; + public static final String ACTION_TIMES = "update_times"; public static final String ACTION_TOGGLE_F1 = "f1"; public static final String ACTION_TOGGLE_F2 = "f2"; public static final String ACTION_TOGGLE_F3 = "f3"; diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index c2df283..b74c8b3 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -148,17 +148,19 @@ public class Plan extends BaseClass{ case ACTION_ANALYZE: return analyze(); case ACTION_CLICK: - return click(get(params.get(Tile.ID),true)); + return click(get(params.get(ID),true)); case ACTION_MOVE: - return moveTile(params.get(DIRECTION),params.get(Tile.ID)); + return moveTile(params.get(DIRECTION),params.get(ID)); case ACTION_SAVE: return saveTo(DEFAULT_NAME); + case ACTION_TIMES: + return updateTimes(params); case ACTION_UPDATE: - return update(get(params.get(Tile.ID),true),params); + return update(get(params.get(ID),true),params); } return t("Unknown action: {}",params.get(ACTION)); } - + /** * attaches a new client to the event stream of the plan * @param client @@ -812,6 +814,16 @@ public class Plan extends BaseClass{ private Tile update(Tile tile, HashMap params) throws IOException { return tile == null ? null : tile.update(params); } + + private Object updateTimes(HashMap params) throws IOException { + Tile tile = get(params.get(ID),false); + if (tile instanceof Block) { + Block block = (Block) tile; + place(block.updateTimes(params)); + return tile.propMenu(); + } + return t("updateTimes called on non-block tile!"); + } /** * sends a Ghost train warning to the client diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index 92570f8..5a31b59 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -33,8 +33,9 @@ public abstract class Block extends StretchableTile{ private static final String NAME = "name"; private static final String NO_TAG = "[default]"; private static final String NEW_TAG = "new_tag"; - private static final String TAG = "tag"; + public static final String TAG = "tag"; private static final String WAIT_TIMES = "wait_times"; + private static final String RAISE = "raise"; public String name = "Block"; public boolean turnAllowed = false; @@ -122,6 +123,33 @@ public abstract class Block extends StretchableTile{ public abstract Direction directionA(); public abstract Direction directionB(); + + private Tile drop(String tag) { + for (int i=0; i props = Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_TIMES); + switch (count) { + case 1: + actions.content(""); break; + case 2: + new Button("-",merged(props,Map.of(ACTION_DROP,wt.tag))).addTo(actions); + break; + default: + new Button("↑",merged(props,Map.of(RAISE,wt.tag))).addTo(actions); + new Button("-",merged(props,Map.of(ACTION_DROP,wt.tag))).addTo(actions); } - - WaitTime defaultWT = getWaitTime(NO_TAG); - - row = new Tag("tr"); - new Input(NEW_TAG,"").attr("placeholder", t("new tag")).addTo(new Tag("td")).addTo(row); - new Input("min."+NEW_TAG+"."+dA,defaultWT.get(dA).min).numeric().addTo(new Tag("td")).addTo(row); - new Input("max."+NEW_TAG+"."+dA,defaultWT.get(dA).max).numeric().addTo(new Tag("td")).addTo(row); - new Input("min."+NEW_TAG+"."+dB,defaultWT.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); - new Input("max."+NEW_TAG+"."+dB,defaultWT.get(dB).max).numeric().addTo(new Tag("td")).addTo(row).addTo(table); - - table.addTo(form); + actions.addTo(row).addTo(table); - new Button(t("Apply"),form).addTo(form).addTo(win); - - return win; } + + WaitTime defaultWT = getWaitTime(NO_TAG); + + row = new Tag("tr"); + new Input(NEW_TAG,"").attr("placeholder", t("new tag")).addTo(new Tag("td")).addTo(row); + new Input("min."+NEW_TAG+"."+dA,defaultWT.get(dA).min).numeric().addTo(new Tag("td")).addTo(row); + new Input("max."+NEW_TAG+"."+dA,defaultWT.get(dA).max).numeric().addTo(new Tag("td")).addTo(row); + new Input("min."+NEW_TAG+"."+dB,defaultWT.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); + new Input("max."+NEW_TAG+"."+dB,defaultWT.get(dB).max).numeric().addTo(new Tag("td")).addTo(row).addTo(table); + + table.addTo(form); + + new Button(t("Apply"),form).addTo(form).addTo(win); + return win; + } + + public Tile raise(String tag) { + for (int i=1; i startPoints(); @Override @@ -258,7 +317,20 @@ public abstract class Block extends StretchableTile{ } turnAllowed = params.containsKey(ALLOW_TURN) && params.get(ALLOW_TURN).equals("on"); + return super.update(params); + } + + public Tile updateTimes(HashMap params) throws IOException { + String tag = params.get(ACTION_DROP); + if (isSet(tag)) return drop(tag); + tag = params.get(RAISE); + if (isSet(tag)) return raise(tag); String newTag = params.get(NEW_TAG); + if (isSet(newTag)) { + newTag = newTag.replace(" ", "_").trim(); + if (newTag.isEmpty()) newTag = null; + } + for (Entry entry:params.entrySet()) { String key = entry.getKey(); String val = entry.getValue(); @@ -266,7 +338,8 @@ public abstract class Block extends StretchableTile{ if (key.startsWith("max.") || key.startsWith("min.")) { String[] parts = key.split("\\."); boolean isMin = parts[0].equals("min"); - String tag = parts[1].equals("new_tag") ? newTag : parts[1]; + tag = parts[1].equals("new_tag") ? newTag : parts[1]; + if (isNull(tag)) continue; Direction dir = Direction.valueOf(parts[2]); WaitTime wt = getWaitTime(tag); @@ -280,23 +353,6 @@ public abstract class Block extends StretchableTile{ } } - return super.update(params); - } - - private WaitTime getWaitTime(String tag) { - if (tag == null) return null; - for (WaitTime wt : waitTimes) { - if (wt.tag.equals(tag)) return wt; - } - return null; - } - - public Range getWaitTime(Train train) { - for (WaitTime wt : waitTimes) { - if (train.tags().contains(wt.tag)) { - return wt.get(train.direction()); - } - } - return getWaitTime(NO_TAG).get(train.direction()); + return this; } -} +} \ No newline at end of file diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 06c1b10..cdda81f 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -46,7 +46,6 @@ public abstract class Tile extends BaseClass{ protected static Logger LOG = LoggerFactory.getLogger(Tile.class); private static int DEFAUT_LENGTH = 5; - public static final String ID = "id"; private static final String LENGTH = "length"; private static final String LOCKED = "locked"; private static final String OCCUPIED = "occupied";