Browse Source

new feature on clicking tiles: actions of tile now skipped, when shift is pressed during click

lookup-tables
Stephan Richter 5 years ago
parent
commit
b41ae2b314
  1. 2
      pom.xml
  2. 11
      resources/js/plan.js
  3. 2
      resources/logback.xml
  4. 4
      resources/translations/Application.de.translation
  5. 6
      src/main/java/de/srsoftware/web4rail/Plan.java
  6. 2
      src/main/java/de/srsoftware/web4rail/actions/Action.java
  7. 93
      src/main/java/de/srsoftware/web4rail/actions/SetRelay.java
  8. 131
      src/main/java/de/srsoftware/web4rail/actions/SetRelayOrSwitch.java
  9. 18
      src/main/java/de/srsoftware/web4rail/conditions/SwitchIsOn.java
  10. 6
      src/main/java/de/srsoftware/web4rail/tiles/Block.java
  11. 4
      src/main/java/de/srsoftware/web4rail/tiles/Bridge.java
  12. 6
      src/main/java/de/srsoftware/web4rail/tiles/Contact.java
  13. 6
      src/main/java/de/srsoftware/web4rail/tiles/Decoupler.java
  14. 23
      src/main/java/de/srsoftware/web4rail/tiles/Relay.java
  15. 32
      src/main/java/de/srsoftware/web4rail/tiles/Switch.java
  16. 3
      src/main/java/de/srsoftware/web4rail/tiles/Tile.java
  17. 6
      src/main/java/de/srsoftware/web4rail/tiles/Turnout.java
  18. 12
      src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java
  19. 12
      src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java

2
pom.xml

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.srsoftware</groupId> <groupId>de.srsoftware</groupId>
<artifactId>web4rail</artifactId> <artifactId>web4rail</artifactId>
<version>1.3.36</version> <version>1.3.37</version>
<name>Web4Rail</name> <name>Web4Rail</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<description>Java Model Railway Control</description> <description>Java Model Railway Control</description>

11
resources/js/plan.js

@ -67,7 +67,8 @@ function clickLegend(ev){
$('#'+lastTab).show(); $('#'+lastTab).show();
} }
function clickTile(x,y){ function clickTile(x,y,shift){
console.log("clickTile("+x+","+y+")");
var id = x+"-"+y; var id = x+"-"+y;
var tiles = $('#'+id); var tiles = $('#'+id);
if (tiles.length > 0) { if (tiles.length > 0) {
@ -82,7 +83,9 @@ function clickTile(x,y){
$(PLAN).css('cursor',''); $(PLAN).css('cursor','');
return false; return false;
} }
request({realm:'plan',action:'click',id:id}); var json = {realm:'plan',action:'click',id:id};
if (shift) json.shift=1;
request(json);
} }
return false; return false;
} }
@ -191,7 +194,7 @@ function place(data){
} }
function planClick(ev){ function planClick(ev){
//console.log('planClick:',ev); console.log('planClick:',ev);
var plan=$('#scroll').get(0); var plan=$('#scroll').get(0);
var x = Math.floor((plan.scrollLeft+ev.clientX)/SQUARE); var x = Math.floor((plan.scrollLeft+ev.clientX)/SQUARE);
var y = Math.floor((plan.scrollTop+ev.clientY)/SQUARE); var y = Math.floor((plan.scrollTop+ev.clientY)/SQUARE);
@ -199,7 +202,7 @@ function planClick(ev){
switch (mode){ switch (mode){
case undefined: case undefined:
case null: case null:
return clickTile(x,y); return clickTile(x,y,ev.shiftKey);
case ADD: case ADD:
return addTile(x,y); return addTile(x,y);
case MOVE: case MOVE:

2
resources/logback.xml

@ -5,7 +5,7 @@
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
</encoder> </encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level> <level>DEBUG</level>
</filter> </filter>
</appender> </appender>

4
resources/translations/Application.de.translation

@ -79,7 +79,7 @@ Click here to select display! : Hier klicken, um Anzeige auszuwählen!
Click here to select train! : Hier klicken, um Zug auszuwählen! Click here to select train! : Hier klicken, um Zug auszuwählen!
Click here to setup contact : Hier klicken, um Kontakt auszuwählen Click here to setup contact : Hier klicken, um Kontakt auszuwählen
Click here to setup decoupler : Hier klicken, um Entkuppler einzurichten Click here to setup decoupler : Hier klicken, um Entkuppler einzurichten
click here to setup relay : Hier klicken, um Relais einzurichten click here to setup relay or switch : Hier klicken, um Relais oder Schalter einzurichten
click here to setup signal : Hier klicken, um Signal einzurichten click here to setup signal : Hier klicken, um Signal einzurichten
Click here to setup tag : Hier klicken, um Markierung anzugeben Click here to setup tag : Hier klicken, um Markierung anzugeben
click here to setup turnout : Hier klicken, um Weiche einzurichten click here to setup turnout : Hier klicken, um Weiche einzurichten
@ -291,7 +291,7 @@ Set {} as context : {} als Kontext setzen
SetContextTrain : Zug für Folgeaktionen festlegen SetContextTrain : Zug für Folgeaktionen festlegen
Set direction of train to {} : Setze Richtung des Zugs auf {} Set direction of train to {} : Setze Richtung des Zugs auf {}
SetDisplayText : Anzeige-Text setzen SetDisplayText : Anzeige-Text setzen
SetRelay : Relais schalten SetRelayOrSwitch : Relais oder Schalter schalten
SetSignal : Signal stellen SetSignal : Signal stellen
SetSignalsToStop : Signale auf Halt stellen SetSignalsToStop : Signale auf Halt stellen
SetSpeed : Geschwindigkeit ändern SetSpeed : Geschwindigkeit ändern

6
src/main/java/de/srsoftware/web4rail/Plan.java

@ -188,7 +188,7 @@ public class Plan extends BaseClass{
case ACTION_AUTO: case ACTION_AUTO:
return simplifyRouteName(params); return simplifyRouteName(params);
case ACTION_CLICK: case ACTION_CLICK:
return click(get(Id.from(params),true)); return click(get(Id.from(params),true),params.get("shift"));
case ACTION_CONNECT: case ACTION_CONNECT:
Tile tile = get(Id.from(params), false); Tile tile = get(Id.from(params), false);
if (tile instanceof Bridge) return ((Bridge)tile).requestConnect(); if (tile instanceof Bridge) return ((Bridge)tile).requestConnect();
@ -321,9 +321,9 @@ public class Plan extends BaseClass{
* @return * @return
* @throws IOException * @throws IOException
*/ */
private Object click(Tile tile) throws IOException { private Object click(Tile tile,String shift) throws IOException {
if (tile == null) return null; if (tile == null) return null;
return tile.click(); return tile.click("1".equals(shift));
} }
/** /**

2
src/main/java/de/srsoftware/web4rail/actions/Action.java

@ -61,7 +61,7 @@ public abstract class Action extends BaseClass {
SetContextTrain.class, SetContextTrain.class,
SetDisplayText.class, SetDisplayText.class,
SetPower.class, SetPower.class,
SetRelay.class, SetRelayOrSwitch.class,
SetSignal.class, SetSignal.class,
SetSpeed.class, SetSpeed.class,
SetTurnout.class, SetTurnout.class,

93
src/main/java/de/srsoftware/web4rail/actions/SetRelay.java

@ -1,93 +0,0 @@
package de.srsoftware.web4rail.actions;
import java.util.HashMap;
import java.util.List;
import org.json.JSONObject;
import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.tags.Fieldset;
import de.srsoftware.web4rail.tags.Select;
import de.srsoftware.web4rail.tags.Window;
import de.srsoftware.web4rail.tiles.Relay;
public class SetRelay extends Action {
public SetRelay(BaseClass parent) {
super(parent);
}
private Relay relay = null;
private boolean state = false;
@Override
public boolean fire(Context context) {
if (isNull(relay)) return false;
relay.state(state);
return true;
}
@Override
public JSONObject json() {
JSONObject json = super.json();
if (isSet(relay)) {
json.put(RELAY, relay.id());
json.put(Relay.STATE, state);
}
return json;
}
@Override
public Action load(JSONObject json) {
super.load(json);
if (json.has(RELAY)) {
String relayId = json.getString(RELAY);
relay = BaseClass.get(new Id(relayId));
if (isNull(relay)) Application.threadPool.execute(new Thread() { // if relay not loaded, yet: wait one sec and try again
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {}
relay = BaseClass.get(new Id(relayId));
};
});
}
if (json.has(Relay.STATE)) state = json.getBoolean(Relay.STATE);
return this;
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
formInputs.add(t("Select relay"),Relay.selector(relay,null));
Select state = new Select(Relay.STATE);
state.addOption(true,isNull(relay)?Relay.DEFAULT_LABEL_A:relay.stateLabelA);
state.addOption(false,isNull(relay)?Relay.DEFAULT_LABEL_B:relay.stateLabelB);
formInputs.add(t("Select state"),state);
return super.properties(preForm, formInputs, postForm);
}
@Override
protected void removeChild(BaseClass child) {
if (child == relay) relay = null;
super.removeChild(child);
}
public String toString() {
if (isNull(relay)) return "["+t("click here to setup relay")+"]";
return t("Set {} to {}",relay,state?relay.stateLabelA:relay.stateLabelB);
};
@Override
protected Object update(HashMap<String, String> params) {
LOG.debug("update: {}",params);
Id relayId = new Id(params.get(Relay.class.getSimpleName()));
relay = BaseClass.get(relayId);
String st = params.get(Relay.STATE);
if (isSet(st)) state = st.equals("true");
return context().properties();
}
}

131
src/main/java/de/srsoftware/web4rail/actions/SetRelayOrSwitch.java

@ -0,0 +1,131 @@
package de.srsoftware.web4rail.actions;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.tags.Fieldset;
import de.srsoftware.web4rail.tags.Select;
import de.srsoftware.web4rail.tags.Window;
import de.srsoftware.web4rail.tiles.Relay;
import de.srsoftware.web4rail.tiles.Switch;
import de.srsoftware.web4rail.tiles.Tile;
public class SetRelayOrSwitch extends Action {
private static final String SWITCH = "switch";
public SetRelayOrSwitch(BaseClass parent) {
super(parent);
}
private Tile relayOrSwitch = null;
private boolean state = false;
@Override
public boolean fire(Context context) {
if (isNull(relayOrSwitch)) return false;
if (relayOrSwitch instanceof Relay) ((Relay)relayOrSwitch).state(state);
if (relayOrSwitch instanceof Switch) ((Switch)relayOrSwitch).state(state);
return true;
}
@Override
public JSONObject json() {
JSONObject json = super.json();
if (relayOrSwitch instanceof Relay) {
json.put(RELAY, relayOrSwitch.id());
json.put(STATE, state);
}
if (relayOrSwitch instanceof Switch) {
json.put(SWITCH, relayOrSwitch.id());
json.put(STATE, state);
}
return json;
}
@Override
public Action load(JSONObject json) {
super.load(json);
if (json.has(RELAY)) {
String relayId = json.getString(RELAY);
relayOrSwitch = BaseClass.get(new Id(relayId));
if (isNull(relayOrSwitch)) Application.threadPool.execute(new Thread() { // if relay not loaded, yet: wait one sec and try again
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {}
relayOrSwitch = BaseClass.get(new Id(relayId));
};
});
}
if (json.has(SWITCH)) {
String relayId = json.getString(SWITCH);
relayOrSwitch = BaseClass.get(new Id(relayId));
if (isNull(relayOrSwitch)) Application.threadPool.execute(new Thread() { // if relay not loaded, yet: wait one sec and try again
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {}
relayOrSwitch = BaseClass.get(new Id(relayId));
};
});
}
if (json.has(STATE)) state = json.getBoolean(STATE);
return this;
}
@Override
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
Tag span = new Tag("span");
if (isSet(relayOrSwitch)) span.content(relayOrSwitch+NBSP);
button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,Relay.class.getSimpleName())).addTo(span);
formInputs.add(t("Select relay"),span);
Select state = new Select(Relay.STATE);
if (relayOrSwitch instanceof Relay) {
Relay relay = (Relay) relayOrSwitch;
state.addOption(true,relay.stateLabelA);
state.addOption(false,relay.stateLabelB);
}
if (relayOrSwitch instanceof Switch) {
state.addOption(true,t("On"));
state.addOption(false,t("Off"));
}
formInputs.add(t("Select state"),state);
return super.properties(preForm, formInputs, postForm);
}
@Override
protected void removeChild(BaseClass child) {
if (child == relayOrSwitch) relayOrSwitch = null;
super.removeChild(child);
}
public String toString() {
if (isNull(relayOrSwitch)) return "["+t("click here to setup relay or switch")+"]";
if (relayOrSwitch instanceof Relay) {
Relay relay = (Relay) relayOrSwitch;
return t("Set {} to {}",relayOrSwitch,state?relay.stateLabelA:relay.stateLabelB);
}
return t("Set {} to {}",relayOrSwitch,state?t("On"):t("Off"));
};
@Override
protected Object update(HashMap<String, String> params) {
LOG.debug("update: {}",params);
String tileId = params.get(Relay.class.getSimpleName());
Tile tile = isSet(tileId) ? BaseClass.get(new Id(tileId)) : relayOrSwitch;
if (tile instanceof Relay || tile instanceof Switch) {
relayOrSwitch = tile;
}
String st = params.get(Relay.STATE);
if (isSet(st)) state = st.equals("true");
return context().properties();
}
}

18
src/main/java/de/srsoftware/web4rail/conditions/SwitchIsOn.java

@ -5,6 +5,7 @@ import java.util.List;
import org.json.JSONObject; import org.json.JSONObject;
import de.srsoftware.web4rail.Application;
import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Fieldset;
import de.srsoftware.web4rail.tags.Window; import de.srsoftware.web4rail.tags.Window;
@ -32,7 +33,22 @@ public class SwitchIsOn extends Condition {
public Condition load(JSONObject json) { public Condition load(JSONObject json) {
super.load(json); super.load(json);
if (json.has(SWITCH)) swtch = BaseClass.get(new Id(json.getString(SWITCH))); if (json.has(SWITCH)) {
swtch = BaseClass.get(new Id(json.getString(SWITCH)));
if (isNull(swtch)) {
Application.threadPool.execute(new Thread() {
@Override
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {
}
swtch = BaseClass.get(new Id(json.getString(SWITCH)));
}
});
}
}
return this; return this;
} }

6
src/main/java/de/srsoftware/web4rail/tiles/Block.java

@ -152,9 +152,9 @@ public abstract class Block extends StretchableTile{
} }
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
if (isSet(train) && train.currentBlock() == this) return train.properties(); if (isSet(train) && !shift) return train.properties();
return super.click(); return super.click(false);
} }
public int compareTo(Block other) { public int compareTo(Block other) {

4
src/main/java/de/srsoftware/web4rail/tiles/Bridge.java

@ -21,9 +21,9 @@ public abstract class Bridge extends Tile {
protected Bridge counterpart = null; protected Bridge counterpart = null;
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
if (pendingConnection != null) return connect(); if (pendingConnection != null) return connect();
return super.click(); return super.click(shift);
} }
private Object connect() { private Object connect() {

6
src/main/java/de/srsoftware/web4rail/tiles/Contact.java

@ -116,9 +116,9 @@ public class Contact extends Tile{
} }
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
trigger(200); if (!shift) trigger(200);
return super.click(); return super.click(shift);
} }
public static Contact get(int addr) { public static Contact get(int addr) {

6
src/main/java/de/srsoftware/web4rail/tiles/Decoupler.java

@ -34,9 +34,9 @@ public abstract class Decoupler extends Tile implements Device{
} }
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
Object o = super.click(); Object o = super.click(shift);
engage(); if (!shift) engage();
return o; return o;
} }

23
src/main/java/de/srsoftware/web4rail/tiles/Relay.java

@ -1,17 +1,14 @@
package de.srsoftware.web4rail.tiles; package de.srsoftware.web4rail.tiles;
import java.io.IOException; import java.io.IOException;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Vector;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import org.json.JSONObject; import org.json.JSONObject;
import de.srsoftware.tools.Tag; import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Command; import de.srsoftware.web4rail.Command;
import de.srsoftware.web4rail.Command.Reply; import de.srsoftware.web4rail.Command.Reply;
import de.srsoftware.web4rail.Device; import de.srsoftware.web4rail.Device;
@ -19,11 +16,9 @@ import de.srsoftware.web4rail.Protocol;
import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Fieldset;
import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Radio; import de.srsoftware.web4rail.tags.Radio;
import de.srsoftware.web4rail.tags.Select;
import de.srsoftware.web4rail.tags.Window; import de.srsoftware.web4rail.tags.Window;
public class Relay extends Tile implements Device{ public class Relay extends Tile implements Device{
public static final String STATE = "state";
private static final String PORT_A = "port_a"; private static final String PORT_A = "port_a";
private static final String PORT_B = "port_b"; private static final String PORT_B = "port_b";
protected static final String STRAIGHT = "straight"; protected static final String STRAIGHT = "straight";
@ -51,9 +46,9 @@ public class Relay extends Tile implements Device{
} }
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
Object o = super.click(); Object o = super.click(shift);
state(!state); if (!shift) state(!state);
return o; return o;
} }
@ -159,18 +154,6 @@ public class Relay extends Tile implements Device{
return 'P'; return 'P';
} }
} }
public static Select selector(Relay preselected, Collection<Relay> exclude) {
if (isNull(exclude)) exclude = new Vector<Relay>();
Select select = new Select(Relay.class.getSimpleName());
new Tag("option").attr("value","0").content(t("unset")).addTo(select);
for (Relay relay : BaseClass.listElements(Relay.class)) {
if (exclude.contains(relay)) continue;
Tag opt = select.addOption(relay.id(), relay);
if (relay == preselected) opt.attr("selected", "selected");
}
return select;
}
public Relay setLabel(boolean state, String tx) { public Relay setLabel(boolean state, String tx) {
if (state) { if (state) {

32
src/main/java/de/srsoftware/web4rail/tiles/Switch.java

@ -40,20 +40,9 @@ public class Switch extends Tile{
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
state = !state; if (!shift) state(!state);
Application.threadPool.execute(new Runnable() { return super.click(shift);
@Override
public void run() {
Context context = new Context(Switch.this);
if (state) {
actionsOn.fire(context);
} else actionsOff.fire(context);
}
});
stream();
return super.click();
} }
@Override @Override
@ -172,6 +161,21 @@ public class Switch extends Tile{
return state; return state;
} }
public void state(boolean newState) {
state = newState;
Application.threadPool.execute(new Runnable() {
@Override
public void run() {
Context context = new Context(Switch.this);
if (state) {
actionsOn.fire(context);
} else actionsOff.fire(context);
}
});
stream();
}
public void stream() { public void stream() {
try { try {
Tag tag = tag(null); Tag tag = tag(null);

3
src/main/java/de/srsoftware/web4rail/tiles/Tile.java

@ -76,8 +76,9 @@ public abstract class Tile extends BaseClass implements Comparable<Tile>{
return classes; return classes;
} }
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
LOG.debug("{}.click()",getClass().getSimpleName()); LOG.debug("{}.click()",getClass().getSimpleName());
if (isSet(train) && shift) return train.properties();
return properties(); return properties();
} }

6
src/main/java/de/srsoftware/web4rail/tiles/Turnout.java

@ -49,10 +49,10 @@ public abstract class Turnout extends Tile implements Device{
} }
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
LOG.debug(getClass().getSimpleName()+".click()"); LOG.debug(getClass().getSimpleName()+".click()");
init(); if (!shift) init();
return super.click(); return super.click(shift);
} }
protected abstract String commandFor(State newState); protected abstract String commandFor(State newState);

12
src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java

@ -13,11 +13,13 @@ public abstract class TurnoutL extends Turnout {
private static final String LEFT = "left"; private static final String LEFT = "left";
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
Object o = super.click(); Object o = super.click(shift);
if (route != null) { if (!shift) {
plan.stream(t("{} is locked by {}!",this,route)); if (route != null) {
} else state(state == State.STRAIGHT ? State.LEFT : State.STRAIGHT); plan.stream(t("{} is locked by {}!",this,route));
} else state(state == State.STRAIGHT ? State.LEFT : State.STRAIGHT);
}
return o; return o;
} }

12
src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java

@ -13,11 +13,13 @@ public abstract class TurnoutR extends Turnout {
private static final String RIGHT = "right"; private static final String RIGHT = "right";
@Override @Override
public Object click() throws IOException { public Object click(boolean shift) throws IOException {
Object o = super.click(); Object o = super.click(shift);
if (route != null) { if (!shift) {
plan.stream(t("{} is locked by {}!",this,route)); if (route != null) {
} else state(state == State.STRAIGHT ? State.RIGHT : State.STRAIGHT); plan.stream(t("{} is locked by {}!",this,route));
} else state(state == State.STRAIGHT ? State.RIGHT : State.STRAIGHT);
}
return o; return o;
} }

Loading…
Cancel
Save