[fixes #358] Fix multi-component stage editing

This commit is contained in:
SiboVG 2022-02-18 18:28:55 +01:00
parent 33b19ecc04
commit 79973e2cfb
3 changed files with 79 additions and 9 deletions

View File

@ -192,5 +192,44 @@ public class AxialStage extends ComponentAssembly implements FlightConfigurableC
}
public StageSeparationConfiguration getSeparationConfiguration() {
FlightConfiguration flConfig = getRocket().getSelectedConfiguration();
StageSeparationConfiguration sepConfig = getSeparationConfigurations().get(flConfig.getId());
// to ensure the configuration is distinct, and we're not modifying the default
if ((sepConfig == getSeparationConfigurations().getDefault())
&& (flConfig.getId() != FlightConfigurationId.DEFAULT_VALUE_FCID)) {
sepConfig = new StageSeparationConfiguration();
getSeparationConfigurations().set(flConfig.getId(), sepConfig);
}
return sepConfig;
}
@Override
public boolean addConfigListener(RocketComponent listener) {
boolean success = super.addConfigListener(listener);
if (listener instanceof AxialStage) {
StageSeparationConfiguration thisConfig = getSeparationConfiguration();
StageSeparationConfiguration listenerConfig = ((AxialStage) listener).getSeparationConfiguration();
success = success && thisConfig.addConfigListener(listenerConfig);
return success;
}
return false;
}
@Override
public void removeConfigListener(RocketComponent listener) {
super.removeConfigListener(listener);
if (listener instanceof AxialStage) {
StageSeparationConfiguration thisConfig = getSeparationConfiguration();
StageSeparationConfiguration listenerConfig = ((AxialStage) listener).getSeparationConfiguration();
thisConfig.removeConfigListener(listenerConfig);
}
}
@Override
public void clearConfigListeners() {
super.clearConfigListeners();
StageSeparationConfiguration thisConfig = getSeparationConfiguration();
thisConfig.clearConfigListeners();
}
}

View File

@ -5,6 +5,8 @@ import net.sf.openrocket.simulation.FlightEvent;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.MathUtil;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
public class StageSeparationConfiguration implements FlightConfigurableParameter<StageSeparationConfiguration> {
@ -98,12 +100,18 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter
private SeparationEvent separationEvent = SeparationEvent.UPPER_IGNITION;
private double separationDelay = 0;
private final List<StageSeparationConfiguration> configListeners = new LinkedList<>();
public SeparationEvent getSeparationEvent() {
return separationEvent;
}
public void setSeparationEvent(SeparationEvent separationEvent) {
for (StageSeparationConfiguration listener : configListeners) {
listener.setSeparationEvent(separationEvent);
}
if (separationEvent == null) {
throw new NullPointerException("separationEvent is null");
}
@ -119,6 +127,10 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter
}
public void setSeparationDelay(double separationDelay) {
for (StageSeparationConfiguration listener : configListeners) {
listener.setSeparationDelay(separationDelay);
}
if (MathUtil.equals(this.separationDelay, separationDelay)) {
return;
}
@ -168,5 +180,30 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter
@Override
public void update(){
}
/**
* 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(StageSeparationConfiguration listener) {
if (listener == null) {
return false;
}
configListeners.add(listener);
return true;
}
public void removeConfigListener(StageSeparationConfiguration listener) {
configListeners.remove(listener);
}
public void clearConfigListeners() {
configListeners.clear();
}
public List<StageSeparationConfiguration> getConfigListeners() {
return configListeners;
}
}

View File

@ -42,14 +42,8 @@ public class AxialStageConfig extends ComponentAssemblyConfig {
// Select separation event
panel.add(new StyledLabel(trans.get("StageConfig.separation.lbl.title") + " " + CommonStrings.dagger, Style.BOLD), "spanx, wrap rel");
FlightConfiguration flConfig = stage.getRocket().getSelectedConfiguration();
StageSeparationConfiguration sepConfig = stage.getSeparationConfigurations().get(flConfig.getId());
// to ensure the configuration is distinct, and we're not modifying the default
if( sepConfig == stage.getSeparationConfigurations().getDefault() ){
sepConfig = new StageSeparationConfiguration();
stage.getSeparationConfigurations().set( flConfig.getId(), sepConfig );
}
StageSeparationConfiguration sepConfig = stage.getSeparationConfiguration();
JComboBox<?> combo = new JComboBox<StageSeparationConfiguration.SeparationEvent>(
new EnumModel<StageSeparationConfiguration.SeparationEvent>( sepConfig, "SeparationEvent", SeparationEvent.values()));