From de32314569c91ddfed51f207a3c7129dd935d46a Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 16 Jan 2023 00:10:09 +0100 Subject: [PATCH] [#1973] Don't mark all simulations out-of-date on flight config change --- .../sf/openrocket/document/Simulation.java | 19 ++-- .../rocketcomponent/FlightConfiguration.java | 15 +-- .../sf/openrocket/rocketcomponent/Rocket.java | 92 +++++++++++++++---- .../simulation/SimulationStatus.java | 3 +- .../gui/main/FlightConfigurationPanel.java | 25 +++-- .../FlightConfigurablePanel.java | 5 +- .../MotorConfigurationPanel.java | 8 +- .../RecoveryConfigurationPanel.java | 4 +- .../SeparationConfigurationPanel.java | 4 +- 9 files changed, 122 insertions(+), 53 deletions(-) diff --git a/core/src/net/sf/openrocket/document/Simulation.java b/core/src/net/sf/openrocket/document/Simulation.java index 95a93af50..eed9ca6a8 100644 --- a/core/src/net/sf/openrocket/document/Simulation.java +++ b/core/src/net/sf/openrocket/document/Simulation.java @@ -75,7 +75,7 @@ public class Simulation implements ChangeSource, Cloneable { private String name = ""; - private Status status = Status.NOT_SIMULATED; + private Status status; /** The conditions to use */ // TODO: HIGH: Change to use actual conditions class?? @@ -98,7 +98,7 @@ public class Simulation implements ChangeSource, Cloneable { private SimulationOptions simulatedConditions = null; private String simulatedConfigurationDescription = null; private FlightData simulatedData = null; - private int simulatedRocketID = -1; + private int simulatedConfigurationID = -1; /** @@ -147,7 +147,8 @@ public class Simulation implements ChangeSource, Cloneable { this.options = options; - this.setFlightConfigurationId( rocket.getSelectedConfiguration().getFlightConfigurationID()); + final FlightConfiguration config = rocket.getSelectedConfiguration(); + this.setFlightConfigurationId(config.getFlightConfigurationID()); options.addChangeListener(new ConditionListener()); @@ -160,7 +161,7 @@ public class Simulation implements ChangeSource, Cloneable { simulatedData = data; if (this.status == Status.LOADED) { simulatedConditions = options.clone(); - simulatedRocketID = rocket.getModID(); + simulatedConfigurationID = config.getModID(); } } @@ -308,8 +309,10 @@ public class Simulation implements ChangeSource, Cloneable { */ public Status getStatus() { mutex.verify(); + final FlightConfiguration config = rocket.getFlightConfiguration(this.getId()).clone(); + if (isStatusUpToDate(status)) { - if (rocket.getFunctionalModID() != simulatedRocketID || !options.equals(simulatedConditions)) { + if (config.getModID() != simulatedConfigurationID || !options.equals(simulatedConditions)) { status = Status.OUTDATED; } } @@ -320,8 +323,6 @@ public class Simulation implements ChangeSource, Cloneable { status = Status.CANT_RUN; return status; } - - FlightConfiguration config = rocket.getFlightConfiguration( this.getId()).clone(); //Make sure this simulation has motors. if ( ! config.hasMotors() ){ @@ -392,7 +393,7 @@ public class Simulation implements ChangeSource, Cloneable { // Set simulated info after simulation simulatedConditions = options.clone(); simulatedConfigurationDescription = descriptor.format( this.rocket, getId()); - simulatedRocketID = rocket.getFunctionalModID(); + simulatedConfigurationID = getActiveConfiguration().getModID(); status = Status.UPTODATE; fireChangeEvent(); @@ -492,7 +493,7 @@ public class Simulation implements ChangeSource, Cloneable { copy.simulatedConditions = null; copy.simulatedConfigurationDescription = null; copy.simulatedData = null; - copy.simulatedRocketID = -1; + copy.simulatedConfigurationID = -1; return copy; diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java index ec1546236..2521f102b 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java @@ -525,6 +525,13 @@ public class FlightConfiguration implements FlightConfigurableParameter stagesBackup = new HashMap<>(this.stages); @@ -890,13 +897,7 @@ public class FlightConfiguration implements FlightConfigurableParameter iterator = this.iterator(true); while (iterator.hasNext()) { RocketComponent next = iterator.next(); next.componentChanged(cce); } - updateConfigurations(); + updateConfigurations(ids); notifyAllListeners(cce); - + } finally { mutex.unlock("fireComponentChangeEvent"); } } + @Override + protected void fireComponentChangeEvent(ComponentChangeEvent cce) { + fireComponentChangeEvent(cce, null); + } + @Override public void update(){ updateStageNumbers(); @@ -537,11 +555,51 @@ public class Rocket extends ComponentAssembly { trackStage(stage); } } - - private void updateConfigurations(){ - for( FlightConfiguration config : configSet ){ - config.update(); + + /** + * Update the modIDs of the supplied flight configurations. + * @param ids IDs of the flight configurations to update, or null to update all. + */ + private void updateConfigurationsModID(FlightConfigurationId[] ids) { + if (ids == null) { + for (FlightConfiguration config : configSet) { + config.updateModID(); + } + return; } + for (FlightConfiguration config : configSet) { + for (FlightConfigurationId id : ids) { + if (config.getId().equals(id)) { + config.updateModID(); + break; + } + } + } + } + + /** + * Update the flight configurations. + * @param ids IDs of the flight configurations to update, or null to update all. + */ + private void updateConfigurations(FlightConfigurationId[] ids) { + if (ids == null) { + for (FlightConfiguration config : configSet) { + config.update(); + } + return; + } + for (FlightConfiguration config : configSet) { + for (FlightConfigurationId id : ids) { + if (config.getId().equals(id)) { + config.update(); + break; + } + } + } + } + + private void updateConfigurations() { + updateConfigurations(null); } @@ -678,8 +736,8 @@ public class Rocket extends ComponentAssembly { } // Get current configuration: - this.configSet.reset( fcid); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + this.configSet.reset(fcid); + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } diff --git a/core/src/net/sf/openrocket/simulation/SimulationStatus.java b/core/src/net/sf/openrocket/simulation/SimulationStatus.java index f3457b532..4cb132312 100644 --- a/core/src/net/sf/openrocket/simulation/SimulationStatus.java +++ b/core/src/net/sf/openrocket/simulation/SimulationStatus.java @@ -33,8 +33,7 @@ import net.sf.openrocket.util.WorldCoordinate; */ public class SimulationStatus implements Monitorable { - private static final Logger log = LoggerFactory.getLogger(SimulationStatus.class); - + private SimulationConditions simulationConditions; private FlightConfiguration configuration; private FlightDataBranch flightData; diff --git a/swing/src/net/sf/openrocket/gui/main/FlightConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/FlightConfigurationPanel.java index d8fa0a279..edec986cc 100644 --- a/swing/src/net/sf/openrocket/gui/main/FlightConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/FlightConfigurationPanel.java @@ -2,6 +2,7 @@ package net.sf.openrocket.gui.main; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; +import java.util.Collections; import java.util.EventObject; import java.util.LinkedHashMap; import java.util.List; @@ -156,8 +157,9 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe * @param duplicate if True, then duplicate configuration operation, if False then create a new configuration */ private void newOrDuplicateConfigAction(boolean duplicate) { - addOrDuplicateConfiguration(duplicate); - configurationChanged(ComponentChangeEvent.MOTOR_CHANGE); + Map newConfigs = addOrDuplicateConfiguration(duplicate); + FlightConfigurationId[] ids = newConfigs.keySet().toArray(new FlightConfigurationId[0]); + configurationChanged(ComponentChangeEvent.MOTOR_CHANGE, ids); stateChanged(null); if (!duplicate) { switch (tabs.getSelectedIndex()) { @@ -179,14 +181,16 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe * either create or duplicate configuration * set new configuration as current * create simulation for new configuration + * + * @return the new/duplicated configurations */ - private void addOrDuplicateConfiguration(boolean duplicate) { + private Map addOrDuplicateConfiguration(boolean duplicate) { final Map newConfigs = new LinkedHashMap<>(); // create or duplicate configuration if (duplicate) { List oldIds = getSelectedConfigurationIds(); - if (oldIds == null || oldIds.size() == 0) return; + if (oldIds == null || oldIds.size() == 0) return Collections.emptyMap(); for (FlightConfigurationId oldId : oldIds) { final FlightConfiguration oldConfig = rocket.getFlightConfiguration(oldId); @@ -210,7 +214,7 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe } OpenRocketDocument doc = BasicFrame.findDocument(rocket); - if (doc == null) return; + if (doc == null) return Collections.emptyMap(); for (Map.Entry config : newConfigs.entrySet()) { // associate configuration with Id and select it @@ -226,6 +230,7 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe // Reset to first selected flight config rocket.setSelectedConfiguration((FlightConfigurationId) newConfigs.keySet().toArray()[0]); + return newConfigs; } private void renameConfigurationAction() { @@ -273,10 +278,14 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe return duplicateConfigAction; } + private void configurationChanged(int cce, FlightConfigurationId[] ids) { + motorConfigurationPanel.fireTableDataChanged(cce, ids); + recoveryConfigurationPanel.fireTableDataChanged(cce, ids); + separationConfigurationPanel.fireTableDataChanged(cce, ids); + } + private void configurationChanged(int cce) { - motorConfigurationPanel.fireTableDataChanged(cce); - recoveryConfigurationPanel.fireTableDataChanged(cce); - separationConfigurationPanel.fireTableDataChanged(cce); + configurationChanged(cce, null); } private void updateButtonState() { diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java index 69dc1d532..2d3ef491d 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java @@ -64,11 +64,12 @@ public abstract class FlightConfigurablePanel } if (update) { - fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE); + fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE, fcIds.toArray(new FlightConfigurationId[0])); } else { table.requestFocusInWindow(); } @@ -349,7 +349,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } } - fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE); + fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE, fcIds.toArray(new FlightConfigurationId[0])); } private void selectIgnition() { @@ -396,7 +396,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } if (update) { - fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE); + fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE, fcIds.toArray(new FlightConfigurationId[0])); } else { table.requestFocusInWindow(); } @@ -426,7 +426,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } if (update) { - fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE); + fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE, fcIds.toArray(new FlightConfigurationId[0])); } else { table.requestFocusInWindow(); } diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java index a1e6e8745..3b272018b 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java @@ -209,7 +209,7 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel