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";