Fix multi-comp separation editing

This commit is contained in:
SiboVG 2023-08-26 23:31:23 +01:00
parent 1ed7354337
commit 532e94838f
2 changed files with 38 additions and 26 deletions

View File

@ -4,6 +4,7 @@ import java.awt.Dialog;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
@ -38,11 +39,12 @@ public class SeparationSelectionDialog extends JDialog {
private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class);
private StageSeparationConfiguration newConfiguration;
private boolean isOverrideDefault;
public SeparationSelectionDialog(Window parent, final Rocket rocket, final AxialStage stage) {
public SeparationSelectionDialog(Window parent, final Rocket rocket, final AxialStage stage, FlightConfigurationId id) {
super(parent, trans.get("edtmotorconfdlg.title.Selectseparationconf"), Dialog.ModalityType.APPLICATION_MODAL);
final FlightConfigurationId id = rocket.getSelectedConfiguration().getFlightConfigurationID();
newConfiguration = stage.getSeparationConfigurations().get(id);
if( stage.getSeparationConfigurations().isDefault( newConfiguration )){
newConfiguration = newConfiguration.clone();
@ -59,7 +61,9 @@ public class SeparationSelectionDialog extends JDialog {
panel.add(defaultButton, "span, gapleft para, wrap rel");
String str = trans.get("SeparationSelectionDialog.opt.override");
str = str.replace("{0}", descriptor.format(rocket, id));
final JRadioButton overrideButton = new JRadioButton(str, false);
final JRadioButton overrideButton = new JRadioButton(str);
overrideButton.addItemListener(e -> isOverrideDefault = e.getStateChange() == ItemEvent.SELECTED);
overrideButton.setSelected(false);
panel.add(overrideButton, "span, gapleft para, wrap para");
ButtonGroup buttonGroup = new ButtonGroup();
@ -123,5 +127,14 @@ public class SeparationSelectionDialog extends JDialog {
this.setContentPane(panel);
GUIUtil.setDisposableDialogOptions(this, okButton);
GUIUtil.installEscapeCloseButtonOperation(this, okButton);
}
/**
* Returns true if this dialog was used to override the default configuration.
* @return true if this dialog was used to override the default configuration.
*/
public boolean isOverrideDefault() {
return isOverrideDefault;
}
}

View File

@ -10,7 +10,6 @@ import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
@ -181,9 +180,8 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel<AxialS
return;
}
boolean update = false;
AxialStage initStage = stages.get(0); // Arbitrary choice of stage (all stages should have the same settings due to multi-comp editing)
FlightConfigurationId initFcId = rocket.getSelectedConfiguration().getId(); // The SeparationSelectionDialog should apply its separation settings to the selected configuration
FlightConfigurationId initFcId = fcIds.get(0);
// Store the initial configuration so we can check later whether something changed
StageSeparationConfiguration initialConfig = initStage.getSeparationConfigurations().get(initFcId).copy(initFcId);
@ -191,37 +189,38 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel<AxialS
document.addUndoPosition("Select separation");
// Launch the separation config dialog
JDialog d = new SeparationSelectionDialog(SwingUtilities.getWindowAncestor(this), rocket, initStage);
SeparationSelectionDialog d = new SeparationSelectionDialog(SwingUtilities.getWindowAncestor(this), rocket, initStage, initFcId);
d.setVisible(true);
if (!initialConfig.equals(initStage.getSeparationConfigurations().get(initFcId))) {
update = true;
}
final StageSeparationConfiguration modifiedConfig = initStage.getSeparationConfigurations().get(initFcId);
boolean update = !initialConfig.equals(modifiedConfig);
double separationDelay = initStage.getSeparationConfigurations().get(initFcId).getSeparationDelay();
SeparationEvent separationEvent= initStage.getSeparationConfigurations().get(initFcId).getSeparationEvent();
boolean isOverrideDefault = d.isOverrideDefault();
// Parse all stages and flight configurations to check whether we need to update
for (int i = 0; i < stages.size(); i++) {
for (int j = 0; j < fcIds.size(); j++) {
if ((i == 0) && (j == 0)) break;
for (AxialStage stage : stages) {
for (FlightConfigurationId fcId : fcIds) {
if ((stage == initStage) && (fcId == initFcId))
continue;
final AxialStage stage = stages.get(i);
final FlightConfigurationId fcId = fcIds.get(j);
StageSeparationConfiguration config = stage.getSeparationConfigurations().get(fcId);
initialConfig = config.copy(fcId);
if (stage.getSeparationConfigurations().isDefault(config)) {
config = config.copy(fcId);
// It could be that the current config is the default config, but the user has selected to override it.
if (isOverrideDefault && !stage.getSeparationConfigurations().containsId(fcId)) {
stage.getSeparationConfigurations().set(fcId, stage.getSeparationConfigurations().getDefault().clone());
}
config.setSeparationDelay(separationDelay);
config.setSeparationEvent(separationEvent);
stage.getSeparationConfigurations().set(fcId, config);
StageSeparationConfiguration currentConfig = stage.getSeparationConfigurations().get(fcId);
if (!initialConfig.equals(config)) {
update = true;
if (currentConfig.equals(modifiedConfig)) {
continue;
}
update = true;
currentConfig.setSeparationDelay(separationDelay);
currentConfig.setSeparationEvent(separationEvent);
stage.getSeparationConfigurations().set(fcId, currentConfig);
}
}