From 252a8a65cbe5e162fbb9033b17faa47b996255a2 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 18 Jun 2021 11:53:16 +0200 Subject: [PATCH] fixed actions boken by function mapping implementation --- pom.xml | 2 +- .../translations/Application.de.translation | 5 +- .../srsoftware/web4rail/actions/Action.java | 2 +- .../web4rail/actions/ActionList.java | 15 ++++++ .../web4rail/actions/SwitchFunction.java | 48 ++++++++++++------- .../web4rail/functions/CustomFunction.java | 46 +++++++++++++++++- .../web4rail/functions/Function.java | 20 +++++--- .../web4rail/moving/Locomotive.java | 4 +- .../de/srsoftware/web4rail/moving/Train.java | 24 ++++++---- 9 files changed, 127 insertions(+), 39 deletions(-) diff --git a/pom.xml b/pom.xml index 0504ba2..dcc8a16 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.5.2 + 1.5.3 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index e3f3287..bb4a249 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -2,14 +2,16 @@ abort : abbrechen Aborting route allocation... : Routen-Reservierung wird abgebrochen... Accessory : Zubehör Action : Aktion +Action fired : Aktion ausgeführt +Action failed : Aktion fehlgeschlagen Actions : Aktionen Actions (On) : Aktionen (Ein) Actions (Off) : Aktionen (Aus) Actions and contacts : Aktionen und Kontakte -Action type : Aktions-Typ Actions in case conditions are fulfilled : Aktionen, wenn Bedingungen erfüllt sind Actions in case conditions are not fulfilled : Aktionen, wenn Bedingungen nicht erfüllt sind Actions will only fire, if all conditions are fullfilled. : Aktionen werden nur ausgeführt, wenn alle Bedingungen erfüllt sind. +Action type : Aktions-Typ ActivateRoute : Route aktivieren add : hinzufügen add command for {} : Kommando für {} hinzufügen @@ -408,6 +410,7 @@ Task name must not be empty : Aufgaben-Name darf nicht leer sein Task type : Aufgabe Text to display on clients : Text, welcher auf den Clients angezeigt werden soll Text to show on display : Text, welcher in der Anzeige dargestellt werden soll +test : testen Tile(s) : Kachel(n) Tile(s) moved. : Kachel(n) verschoben. Timeout : maximale Wartezeit5 diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index 1eabaf6..aecb12d 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -148,7 +148,7 @@ public abstract class Action extends BaseClass { @Override protected Window properties(List
preForm, FormInput formInputs, List
postForm,String...errors) { formInputs.add(t("Edit json"),button(t("export"), Map.of(ACTION, ACTION_SAVE))); - + formInputs.add("",button(t("test"), Map.of(ACTION,ACTION_START))); return super.properties(preForm, formInputs, postForm,errors); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java index 23d46c5..09f5416 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java @@ -19,6 +19,7 @@ import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Window; +import de.srsoftware.web4rail.tiles.Tile; public class ActionList extends Action implements Iterable{ static final Logger LOG = LoggerFactory.getLogger(ActionList.class); @@ -239,6 +240,8 @@ public class ActionList extends Action implements Iterable{ return action.properties(); case ACTION_SAVE: return action.jsonImportExport(params); + case ACTION_START: + return start(action); case ACTION_UPDATE: return action.update(params); } @@ -265,6 +268,18 @@ public class ActionList extends Action implements Iterable{ super.removeChild(child); } + private static Window start(Action action) { + BaseClass ctx = action.parent(); + while (isSet(ctx) && !(ctx instanceof Tile) && isSet(ctx.parent())) ctx = ctx.parent(); + Context startContext = new Context(ctx); + if (ctx instanceof Tile) { + Tile tile = (Tile) ctx; + startContext.train(tile.lockingTrain()); + } + String message = action.fire(startContext) ? t("Action fired") : t("Action failed"); + return action.properties(message); + } + @Override public String toString() { return actions.isEmpty() ? "[no actions]" : actions.toString(); diff --git a/src/main/java/de/srsoftware/web4rail/actions/SwitchFunction.java b/src/main/java/de/srsoftware/web4rail/actions/SwitchFunction.java index 6405331..9d49aed 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SwitchFunction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SwitchFunction.java @@ -1,12 +1,16 @@ package de.srsoftware.web4rail.actions; import java.util.List; +import java.util.Vector; +import org.json.JSONException; import org.json.JSONObject; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Params; +import de.srsoftware.web4rail.functions.CustomFunction; +import de.srsoftware.web4rail.functions.Function; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Radio; import de.srsoftware.web4rail.tags.Select; @@ -20,7 +24,8 @@ public class SwitchFunction extends Action { private static final int ON = 1; private static final int OFF = 0; - private int function = 1,effect=-1; + private int effect=-1; + private String function = "["+t("Select function")+"]"; public SwitchFunction(BaseClass parent) { super(parent); @@ -31,8 +36,7 @@ public class SwitchFunction extends Action { if (isNull(context) || isNull(context.train())) return false; switch (effect) { case TOGGLE: -// context.train().toggleFunction(function); - // TODO + context.train().toggleFunction(function); return true; case ON: context.train().setFunction(function, true); @@ -56,18 +60,31 @@ public class SwitchFunction extends Action { @Override public Action load(JSONObject json) { super.load(json); - if (json.has(EFFECT)) effect = json.getInt(EFFECT); - if (json.has(FUNCTION)) function = json.getInt(FUNCTION); + try { + if (json.has(EFFECT)) effect = json.getInt(EFFECT); + if (json.has(FUNCTION)) function = json.getString(FUNCTION); + } catch(JSONException je) { + LOG.warn("Was not able to load function!",je); + } return this; } @Override protected Window properties(List
preForm, FormInput formInputs, List
postForm,String...errors) { - Select selector = new Select(FUNCTION); - for (int i=1; i<5;i++) { - Tag option = selector.addOption(i,t("F"+i)); - if (function == i) option.attr("selected", "selected"); + Select selector = Function.selector(function); + Vector options = selector.children(); + for (Tag option : options) { // remove unconfigured CustomFunction + if (CustomFunction.class.getSimpleName().equals(option.get("value"))) { + options.remove(option); + break; + } + } + List customFunctions = BaseClass.listElements(CustomFunction.class); + for (CustomFunction cf : customFunctions) { // add configured custom functions + String cfName = cf.name(); + Tag option = selector.addOption(cfName); + if (function.equals(cfName)) option.attr("selected", "selected"); } formInputs.add(t("Function"), selector); @@ -84,22 +101,19 @@ public class SwitchFunction extends Action { public String toString() { switch (effect) { case TOGGLE: - return t("toggle {}","F"+function); + return t("toggle {}",function); case ON: - return t("enable {}","F"+function); + return t("enable {}",function); case OFF: - return t("disable {}","F"+function); + return t("disable {}",function); } return null; } @Override protected Object update(Params params) { - String fn = params.getString(FUNCTION); - if (isSet(fn)) { - function = Integer.parseInt(fn); - if (function < 1 || function > 4) function = 1; - } + String fn = params.getString(Function.SELECTOR); + if (isSet(fn) && !fn.isEmpty()) function = t(fn); String effect = params.getString(EFFECT); if (isSet(effect)) switch (effect) { case "1": diff --git a/src/main/java/de/srsoftware/web4rail/functions/CustomFunction.java b/src/main/java/de/srsoftware/web4rail/functions/CustomFunction.java index 4778885..200d3d8 100644 --- a/src/main/java/de/srsoftware/web4rail/functions/CustomFunction.java +++ b/src/main/java/de/srsoftware/web4rail/functions/CustomFunction.java @@ -1,5 +1,49 @@ package de.srsoftware.web4rail.functions; -public class CustomFunction extends Function { +import org.json.JSONObject; + +import de.srsoftware.web4rail.Params; +import de.srsoftware.web4rail.devices.Decoder; +import de.srsoftware.web4rail.tags.Fieldset; +import de.srsoftware.web4rail.tags.Input; +import de.srsoftware.web4rail.tags.Label; +public class CustomFunction extends Function { + private String customName = super.name(); + + @Override + public Fieldset form(Decoder decoder) { + Fieldset fieldset = super.form(decoder); + String prefix = "functions/"+id()+"/"; + new Input(prefix+NAME, customName) + .addTo(new Label(t("Name"))) + .addTo(fieldset); + return fieldset; + } + + @Override + public JSONObject json() { + JSONObject json = super.json(); + json.put(NAME, customName); + return json; + } + + @Override + public CustomFunction load(JSONObject json) { + super.load(json); + if (json.has(NAME)) customName = json.getString(NAME); + return this; + } + + @Override + public String name() { + return customName; + } + + @Override + public Object update(Params params) { + String newName = params.getString(NAME); + if (isSet(newName) && !newName.isEmpty()) customName = newName; + return super.update(params); + } } diff --git a/src/main/java/de/srsoftware/web4rail/functions/Function.java b/src/main/java/de/srsoftware/web4rail/functions/Function.java index 4c8114f..450a47f 100644 --- a/src/main/java/de/srsoftware/web4rail/functions/Function.java +++ b/src/main/java/de/srsoftware/web4rail/functions/Function.java @@ -15,7 +15,7 @@ import de.srsoftware.web4rail.tags.Select; public abstract class Function extends BaseClass{ - public static final String NEW = "new_function"; + public static final String SELECTOR = "selected_fun"; private static final String PACKAGE = Function.class.getPackageName(); private static final String INDEX = "index"; static final String FORWARD = "forward"; @@ -93,15 +93,21 @@ public abstract class Function extends BaseClass{ return t(type()); } - public static Tag selector() { - Select selector = new Select(NEW); - selector.addOption("", t("Select function")); + public static Select selector() { + return selector(null); + } + + public static Select selector(String preselect) { + Select selector = new Select(SELECTOR); + selector.addOption("", "["+t("Select function")+"]"); for (Class fun : List.of(HeadLight.class,TailLight.class,InteriorLight.class,Coupler.class,CustomFunction.class)) { String className = fun.getSimpleName(); - selector.addOption(className,t(className)); + String name = t(className); + Tag option = selector.addOption(className,name); + if (name.equals(t(preselect))) option.attr("selected", "selected"); } - + selector.children().sort((c1,c2) -> c1.children().toString().compareToIgnoreCase(c2.children().toString())); return selector; } @@ -115,7 +121,7 @@ public abstract class Function extends BaseClass{ return name()+"("+decoderFunction+"="+enabled+")"; } - private String type() { + protected String type() { return getClass().getSimpleName(); } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java index 9027c05..d5c275e 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java @@ -398,8 +398,8 @@ public class Locomotive extends Car implements Constants{ } private Object updateMapping(Params params) { - if (params.containsKey(Function.NEW)) { - String type = params.getString(Function.NEW); + if (params.containsKey(Function.SELECTOR)) { + String type = params.getString(Function.SELECTOR); if (!type.isEmpty()) { Function newFun = Function.create(type); if (isSet(newFun)) functions.add(newFun.register()); diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 7b745ab..f907c60 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -533,7 +533,7 @@ public class Train extends BaseClass implements Comparable { } public boolean functionEnabled(String name) { - return locos().flatMap( + return locos().flatMap( loco -> loco.functions().stream().filter(f -> f.enabled() && f.name().equals(name)) ).findAny().isPresent(); } @@ -1064,18 +1064,24 @@ public class Train extends BaseClass implements Comparable { return list; } - private Object toggleFunction(Params params) { - String name = params.getString(FUNCTION); - String error = isNull(name) ? t("No function name passed to toggleFunction(…)") : null; - boolean enable = !functionEnabled(name); + public String toggleFunction(String name) { + if (isNull(name)) return t("No function name passed to toggleFunction(…)"); + return setFunction(name,!functionEnabled(name)); + } + + public String setFunction(String name,boolean enable) { + if (isNull(name)) return t("No function name passed to toggleFunction(…)"); + LOG.debug("Setting function \"{}\" to {}",name,enable); locos().forEach(loco -> { Function any = null; - for (Function f : loco.functions(name)) { - any = f.setState(enable); - } + for (Function f : loco.functions(name)) any = f.setState(enable); if (isSet(any)) loco.decoder().queue(); }); - return properties(error); + return null; + } + + private Object toggleFunction(Params params) { + return properties(toggleFunction(params.getString(FUNCTION))); } @Override