[fixes #358] Fix multi-component stage editing
This commit is contained in:
parent
33b19ecc04
commit
79973e2cfb
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,8 @@ import net.sf.openrocket.simulation.FlightEvent;
|
|||||||
import net.sf.openrocket.startup.Application;
|
import net.sf.openrocket.startup.Application;
|
||||||
import net.sf.openrocket.util.MathUtil;
|
import net.sf.openrocket.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class StageSeparationConfiguration implements FlightConfigurableParameter<StageSeparationConfiguration> {
|
public class StageSeparationConfiguration implements FlightConfigurableParameter<StageSeparationConfiguration> {
|
||||||
@ -99,11 +101,17 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter
|
|||||||
private SeparationEvent separationEvent = SeparationEvent.UPPER_IGNITION;
|
private SeparationEvent separationEvent = SeparationEvent.UPPER_IGNITION;
|
||||||
private double separationDelay = 0;
|
private double separationDelay = 0;
|
||||||
|
|
||||||
|
private final List<StageSeparationConfiguration> configListeners = new LinkedList<>();
|
||||||
|
|
||||||
public SeparationEvent getSeparationEvent() {
|
public SeparationEvent getSeparationEvent() {
|
||||||
return separationEvent;
|
return separationEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSeparationEvent(SeparationEvent separationEvent) {
|
public void setSeparationEvent(SeparationEvent separationEvent) {
|
||||||
|
for (StageSeparationConfiguration listener : configListeners) {
|
||||||
|
listener.setSeparationEvent(separationEvent);
|
||||||
|
}
|
||||||
|
|
||||||
if (separationEvent == null) {
|
if (separationEvent == null) {
|
||||||
throw new NullPointerException("separationEvent is null");
|
throw new NullPointerException("separationEvent is null");
|
||||||
}
|
}
|
||||||
@ -119,6 +127,10 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setSeparationDelay(double separationDelay) {
|
public void setSeparationDelay(double separationDelay) {
|
||||||
|
for (StageSeparationConfiguration listener : configListeners) {
|
||||||
|
listener.setSeparationDelay(separationDelay);
|
||||||
|
}
|
||||||
|
|
||||||
if (MathUtil.equals(this.separationDelay, separationDelay)) {
|
if (MathUtil.equals(this.separationDelay, separationDelay)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -169,4 +181,29 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter
|
|||||||
public void update(){
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,13 +43,7 @@ public class AxialStageConfig extends ComponentAssemblyConfig {
|
|||||||
// Select separation event
|
// Select separation event
|
||||||
panel.add(new StyledLabel(trans.get("StageConfig.separation.lbl.title") + " " + CommonStrings.dagger, Style.BOLD), "spanx, wrap rel");
|
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.getSeparationConfiguration();
|
||||||
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 );
|
|
||||||
}
|
|
||||||
|
|
||||||
JComboBox<?> combo = new JComboBox<StageSeparationConfiguration.SeparationEvent>(
|
JComboBox<?> combo = new JComboBox<StageSeparationConfiguration.SeparationEvent>(
|
||||||
new EnumModel<StageSeparationConfiguration.SeparationEvent>( sepConfig, "SeparationEvent", SeparationEvent.values()));
|
new EnumModel<StageSeparationConfiguration.SeparationEvent>( sepConfig, "SeparationEvent", SeparationEvent.values()));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user