[fixes #358] Fix multi-component recovery device deployment

This commit is contained in:
SiboVG 2022-02-18 18:36:55 +01:00
parent 79973e2cfb
commit 9a77baf643
2 changed files with 70 additions and 0 deletions

View File

@ -5,9 +5,11 @@ import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.simulation.FlightEvent;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.ArrayList;
import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.Pair;
import java.util.List;
import java.util.Objects;
public class DeploymentConfiguration implements FlightConfigurableParameter<DeploymentConfiguration> {
@ -88,6 +90,8 @@ public class DeploymentConfiguration implements FlightConfigurableParameter<Depl
private double deployAltitude = 200;
private double deployDelay = 0;
private List<DeploymentConfiguration> configListeners = new ArrayList<>();
public boolean isActivationEvent(FlightEvent e, RocketComponent source) {
return deployEvent.isActivationEvent(this, e, source);
}
@ -97,6 +101,10 @@ public class DeploymentConfiguration implements FlightConfigurableParameter<Depl
}
public void setDeployEvent(DeployEvent deployEvent) {
for (DeploymentConfiguration listener : configListeners) {
listener.setDeployEvent(deployEvent);
}
if (this.deployEvent == deployEvent) {
return;
}
@ -111,6 +119,10 @@ public class DeploymentConfiguration implements FlightConfigurableParameter<Depl
}
public void setDeployAltitude(double deployAltitude) {
for (DeploymentConfiguration listener : configListeners) {
listener.setDeployAltitude(deployAltitude);
}
if (MathUtil.equals(this.deployAltitude, deployAltitude)) {
return;
}
@ -122,6 +134,10 @@ public class DeploymentConfiguration implements FlightConfigurableParameter<Depl
}
public void setDeployDelay(double deployDelay) {
for (DeploymentConfiguration listener : configListeners) {
listener.setDeployDelay(deployDelay);
}
if (MathUtil.equals(this.deployDelay, deployDelay)) {
return;
}
@ -169,4 +185,29 @@ public class DeploymentConfiguration implements FlightConfigurableParameter<Depl
public int hashCode() {
return Objects.hash(deployEvent, deployAltitude, deployDelay);
}
/**
* Add a new config listener that will undergo the same configuration changes as this configuration.
* @param listener new config listener
* @return true if listener was successfully added, false if not
*/
public boolean addConfigListener(DeploymentConfiguration listener) {
if (listener == null) {
return false;
}
configListeners.add(listener);
return true;
}
public void removeConfigListener(DeploymentConfiguration listener) {
configListeners.remove(listener);
}
public void clearConfigListeners() {
configListeners.clear();
}
public List<DeploymentConfiguration> getConfigListeners() {
return configListeners;
}
}

View File

@ -138,4 +138,33 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu
copy.deploymentConfigurations = new FlightConfigurableParameterSet<DeploymentConfiguration>(deploymentConfigurations);
return copy;
}
@Override
public boolean addConfigListener(RocketComponent listener) {
boolean success = super.addConfigListener(listener);
if (listener instanceof RecoveryDevice) {
DeploymentConfiguration thisConfig = getDeploymentConfigurations().getDefault();
DeploymentConfiguration listenerConfig = ((RecoveryDevice) listener).getDeploymentConfigurations().getDefault();
success = success && thisConfig.addConfigListener(listenerConfig);
return success;
}
return false;
}
@Override
public void removeConfigListener(RocketComponent listener) {
super.removeConfigListener(listener);
if (listener instanceof RecoveryDevice) {
DeploymentConfiguration thisConfig = getDeploymentConfigurations().getDefault();
DeploymentConfiguration listenerConfig = ((RecoveryDevice) listener).getDeploymentConfigurations().getDefault();
thisConfig.removeConfigListener(listenerConfig);
}
}
@Override
public void clearConfigListeners() {
super.clearConfigListeners();
DeploymentConfiguration thisConfig = getDeploymentConfigurations().getDefault();
thisConfig.clearConfigListeners();
}
}