diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 8c2302ac8..e7e38f845 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -75,7 +75,7 @@ This is the first beta release of version 23.09. * Show calculated values in override tab (fixes #1629) * Decrease minimum FoV to 10 degrees in Photo Studio * Increase resolution of launch temperature and pressure to 2 decimal places (fixes #2003) -* Display Cd oerride with 3 decimal places +* Display Cd override with 3 decimal places * Add wiki button to help menu (fixes #2046) * Eliminate option to save "some" sim data (fixes #2024) * Add OK/Cancel buttons when editing simulations (fixes #2158) diff --git a/core/src/net/sf/openrocket/rocketcomponent/Transition.java b/core/src/net/sf/openrocket/rocketcomponent/Transition.java index bc1679f09..7f00daf32 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Transition.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Transition.java @@ -402,7 +402,10 @@ public class Transition extends SymmetricComponent implements InsideColorCompone ((Transition) listener).setForeShoulderRadius(foreShoulderRadius, doClamping); } } - foreShoulderRadius = Math.min(foreShoulderRadius, getForeRadius()); + + if (doClamping) { + foreShoulderRadius = Math.min(foreShoulderRadius, getForeRadius()); + } if (MathUtil.equals(this.foreShoulderRadius, foreShoulderRadius)) return; @@ -486,7 +489,9 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } } - aftShoulderRadius = Math.min(aftShoulderRadius, getAftRadius()); + if (doClamping) { + aftShoulderRadius = Math.min(aftShoulderRadius, getAftRadius()); + } if (MathUtil.equals(this.aftShoulderRadius, aftShoulderRadius)) return; diff --git a/swing/resources/datafiles/examples/3D Printable Nose Cone and Fins.ork b/swing/resources/datafiles/examples/3D Printable Nose Cone and Fins.ork new file mode 100644 index 000000000..3b23b87a2 Binary files /dev/null and b/swing/resources/datafiles/examples/3D Printable Nose Cone and Fins.ork differ diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 0239958b8..b11871fb0 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -303,14 +303,21 @@ public class RocketComponentConfig extends JPanel { } // Yes/No dialog: Are you sure you want to discard your changes? - JPanel msg = createCancelOperationContent(); - int resultYesNo = JOptionPane.showConfirmDialog(RocketComponentConfig.this, msg, - trans.get("RocketCompCfg.CancelOperation.title"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); - if (resultYesNo == JOptionPane.YES_OPTION) { - ComponentConfigDialog.clearConfigListeners = false; // Undo action => config listeners of new component will be cleared - disposeDialog(); - document.undo(); - } + SwingUtilities.invokeLater(() -> { + JPanel msg = createCancelOperationContent(); + int resultYesNo = JOptionPane.showConfirmDialog(RocketComponentConfig.this, msg, + trans.get("RocketCompCfg.CancelOperation.title"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); + + if (resultYesNo == JOptionPane.YES_OPTION) { + ComponentConfigDialog.clearConfigListeners = false; + + // Need to execute after delay, otherwise the dialog will not be disposed + GUIUtil.executeAfterDelay(100, () -> { + disposeDialog(); + document.undo(); + }); + } + }); } }); buttonPanel.add(cancelButton, "split 2, right, gapleft 30lp"); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java index 98e993c6f..f7e273988 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java @@ -364,7 +364,11 @@ public class GeneralPreferencesPanel extends PreferencesPanel { trans.get("generalprefs.ImportWarning.msg"), trans.get("generalprefs.ImportWarning.title"), JOptionPane.WARNING_MESSAGE); - PreferencesDialog.showPreferences(parent.getParentFrame()); // Refresh the preferences dialog + + // Need to execute after delay, otherwise the dialog will not be disposed + GUIUtil.executeAfterDelay(100, () -> { + PreferencesDialog.showPreferences(parent.getParentFrame()); // Refresh the preferences dialog + }); } }); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java index 6b32bd009..acfa5c400 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java @@ -86,7 +86,10 @@ public class ComponentPresetTable extends JTable { ComponentPreset preset = ComponentPresetTable.this.presets.get(rowIndex); Application.getComponentPresetDao().setFavorite(preset, presetType, (Boolean) aValue); ComponentPresetTable.this.updateFavorites(); - ComponentPresetTable.this.setRowSelectionInterval(rowIndex, rowIndex); + int viewIndex = ComponentPresetTable.this.convertRowIndexToView(rowIndex); + if (viewIndex != -1) { + ComponentPresetTable.this.setRowSelectionInterval(viewIndex, viewIndex); + } } @Override diff --git a/swing/src/net/sf/openrocket/gui/util/GUIUtil.java b/swing/src/net/sf/openrocket/gui/util/GUIUtil.java index 2becea7c8..991c7cead 100644 --- a/swing/src/net/sf/openrocket/gui/util/GUIUtil.java +++ b/swing/src/net/sf/openrocket/gui/util/GUIUtil.java @@ -51,6 +51,7 @@ import javax.swing.RootPaneContainer; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; +import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeListener; @@ -761,5 +762,22 @@ public class GUIUtil { } } + + /** + * Executes the given code after a specified delay. + * + * @param delayMillis the delay in milliseconds. + * @param runnable the code to be executed after the delay. + */ + public static void executeAfterDelay(int delayMillis, Runnable runnable) { + Timer timer = new Timer(delayMillis, new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + runnable.run(); + } + }); + timer.setRepeats(false); + timer.start(); + } }