[#1973] Don't mark all simulations out-of-date on flight config change
This commit is contained in:
parent
890d6def2d
commit
de32314569
@ -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;
|
||||
|
||||
|
@ -525,6 +525,13 @@ public class FlightConfiguration implements FlightConfigurableParameter<FlightCo
|
||||
updateMotors();
|
||||
updateActiveInstances();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the configuration's modID, thus staging it in need to update.
|
||||
*/
|
||||
public void updateModID() {
|
||||
this.modID++;
|
||||
}
|
||||
|
||||
private void updateStages() {
|
||||
Map<Integer, FlightConfiguration.StageFlags> stagesBackup = new HashMap<>(this.stages);
|
||||
@ -890,13 +897,7 @@ public class FlightConfiguration implements FlightConfigurableParameter<FlightCo
|
||||
|
||||
@Override
|
||||
public int getModID() {
|
||||
// TODO: this doesn't seem consistent...
|
||||
int id = modID;
|
||||
// for (MotorInstance motor : motors.values()) {
|
||||
// id += motor.getModID();
|
||||
// }
|
||||
id += rocket.getModID();
|
||||
return id;
|
||||
return modID;
|
||||
}
|
||||
|
||||
public void setName(final String newName) {
|
||||
|
@ -467,17 +467,28 @@ public class Rocket extends ComponentAssembly {
|
||||
listenerList.remove(l);
|
||||
log.trace("Removed ComponentChangeListener " + l + ", current number of listeners is " + listenerList.size());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fireComponentChangeEvent(ComponentChangeEvent cce) {
|
||||
if( ! this.eventsEnabled ){
|
||||
|
||||
/**
|
||||
* Fires a ComponentChangeEvent of the given type. The source of the event is set to
|
||||
* this rocket.
|
||||
*
|
||||
* @param type Type of event
|
||||
* @param ids IDs of the flight configurations to update, or null to update all.
|
||||
* @see #fireComponentChangeEvent(ComponentChangeEvent)
|
||||
*/
|
||||
public void fireComponentChangeEvent(int type, FlightConfigurationId[] ids) {
|
||||
fireComponentChangeEvent(new ComponentChangeEvent(this, type), ids);
|
||||
}
|
||||
|
||||
protected void fireComponentChangeEvent(ComponentChangeEvent cce, FlightConfigurationId[] ids) {
|
||||
if (!this.eventsEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
mutex.lock("fireComponentChangeEvent");
|
||||
try {
|
||||
checkState();
|
||||
|
||||
|
||||
// Update modification ID's only for normal (not undo/redo) events
|
||||
if (!cce.isUndoChange()) {
|
||||
modID = UniqueID.next();
|
||||
@ -487,32 +498,39 @@ public class Rocket extends ComponentAssembly {
|
||||
aeroModID = modID;
|
||||
if (cce.isTreeChange())
|
||||
treeModID = modID;
|
||||
if (cce.isFunctionalChange())
|
||||
if (cce.isFunctionalChange()) {
|
||||
functionalModID = modID;
|
||||
updateConfigurationsModID(ids);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Check whether frozen
|
||||
if (freezeList != null) {
|
||||
log.debug("Rocket is in frozen state, adding event " + cce + " info freeze list");
|
||||
freezeList.add(cce);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Notify all components first
|
||||
Iterator<RocketComponent> 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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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<FlightConfigurationId, FlightConfiguration> 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<FlightConfigurationId, FlightConfiguration> addOrDuplicateConfiguration(boolean duplicate) {
|
||||
final Map<FlightConfigurationId, FlightConfiguration> newConfigs = new LinkedHashMap<>();
|
||||
|
||||
// create or duplicate configuration
|
||||
if (duplicate) {
|
||||
List<FlightConfigurationId> 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<FlightConfigurationId, FlightConfiguration> 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() {
|
||||
|
@ -64,11 +64,12 @@ public abstract class FlightConfigurablePanel<T extends FlightConfigurableCompon
|
||||
/**
|
||||
* Update the data in the table, with component change event type {cce}
|
||||
* @param cce index of the ComponentChangeEvent to use (e.g. ComponentChangeEvent.NONFUNCTIONAL_CHANGE)
|
||||
* @param ids: the IDs of the flight configurations that are affected by the change
|
||||
*/
|
||||
public void fireTableDataChanged(int cce) {
|
||||
public void fireTableDataChanged(int cce, FlightConfigurationId[] ids) {
|
||||
int selectedRow = table.getSelectedRow();
|
||||
int selectedColumn = table.getSelectedColumn();
|
||||
this.rocket.fireComponentChangeEvent(cce);
|
||||
this.rocket.fireComponentChangeEvent(cce, ids);
|
||||
((AbstractTableModel)table.getModel()).fireTableDataChanged();
|
||||
restoreSelection(selectedRow,selectedColumn);
|
||||
updateButtonState();
|
||||
|
@ -330,7 +330,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
|
||||
}
|
||||
|
||||
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<MotorMount>
|
||||
}
|
||||
}
|
||||
|
||||
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<MotorMount>
|
||||
}
|
||||
|
||||
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<MotorMount>
|
||||
}
|
||||
|
||||
if (update) {
|
||||
fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE);
|
||||
fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE, fcIds.toArray(new FlightConfigurationId[0]));
|
||||
} else {
|
||||
table.requestFocusInWindow();
|
||||
}
|
||||
|
@ -209,7 +209,7 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel<Recovery
|
||||
}
|
||||
|
||||
if (update) {
|
||||
fireTableDataChanged(ComponentChangeEvent.AERODYNAMIC_CHANGE);
|
||||
fireTableDataChanged(ComponentChangeEvent.AERODYNAMIC_CHANGE, fcIds.toArray(new FlightConfigurationId[0]));
|
||||
} else {
|
||||
table.requestFocusInWindow();
|
||||
}
|
||||
@ -235,7 +235,7 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel<Recovery
|
||||
}
|
||||
}
|
||||
if (update) {
|
||||
fireTableDataChanged(ComponentChangeEvent.AERODYNAMIC_CHANGE);
|
||||
fireTableDataChanged(ComponentChangeEvent.AERODYNAMIC_CHANGE, fcIds.toArray(new FlightConfigurationId[0]));
|
||||
} else {
|
||||
table.requestFocusInWindow();
|
||||
}
|
||||
|
@ -219,7 +219,7 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel<AxialS
|
||||
}
|
||||
|
||||
if (update) {
|
||||
fireTableDataChanged(ComponentChangeEvent.AEROMASS_CHANGE);
|
||||
fireTableDataChanged(ComponentChangeEvent.AEROMASS_CHANGE, fcIds.toArray(new FlightConfigurationId[0]));
|
||||
} else {
|
||||
table.requestFocusInWindow();
|
||||
}
|
||||
@ -245,7 +245,7 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel<AxialS
|
||||
}
|
||||
|
||||
if (update) {
|
||||
fireTableDataChanged(ComponentChangeEvent.AEROMASS_CHANGE);
|
||||
fireTableDataChanged(ComponentChangeEvent.AEROMASS_CHANGE, fcIds.toArray(new FlightConfigurationId[0]));
|
||||
} else {
|
||||
table.requestFocusInWindow();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user