Merge branch 'unstable' into 22.02_prep

This commit is contained in:
Sibo Van Gool 2023-01-26 10:31:02 +01:00 committed by GitHub
commit 266073a7cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 98 additions and 48 deletions

View File

@ -15,10 +15,51 @@ Release Notes
<div id="22.02.RC.01"> <div id="22.02.RC.01">
OpenRocket 22.02.RC.01 (2023-01-XX) OpenRocket 22.02.RC.01 (2023-01-xx)
------------------------ ------------------------
(through PR1996)
## New Features
* **Native ARM build for Apple Silicon Macs!** (fixes #1136 and #1533)
* Added "Cancel" button to component config window (fixes #960)
* Added component information box in config window (fixes #1564)
* Example designs have been updated and reorganized
* Add option to switch flight event markers to icons in sim plots
* Add support for tail cones (fixes #1889)
* Added additional warnings for inline pods, gaps and overlaps in airframe (fixes #1894)
* Added "plugged" to delay options for all motors
* Support rail button screws, updated rail button aerodynamics
* Updated surface roughness settings to be consistent with standard terminology
* Separate "override subcomponents" option for mass, CG, and drag (fixes #1750)
* Add motor designation to motor selection table
* Enable decal editing on Linux
## UI Improvements
* Reorganized Config dialogs for improved clarity and consistency
* Added "Top View" option to rocket display
* Add option to automatically open preset dialog when creating new component (fixes #1479)
* Tell user where body discontinuities are (fixes #241)
* Improved consistency of warning message text
* Hitting left arrow moves cursor to front of text fields (fixes #1942)
* Grey out texture edit button if using default material
* New app icons
* Zoom to active stages in rocket display
* Added welcome dialog (fixes #1768)
* Updated bug report form
## Notable Bug Fixes
* Fix various significant 3D view issues (fixes #939, #966, #1191, #1771)
* Don't mark all simulations out-of-date on flight config change (fixes #1973)
* Account for all recovery devices in pods when calculating descent rate (fixes #1910)
* Eliminated many occurrences of mystery discontinuity warnings (fixes #999)
* Rocksim import/export file updates
** Support import and export of pods (fixes #1348)
** Support import of trapezoidal fins on transitions (fixes #1553)
** Support subassembly import
* Assorted extension and plug-in fixes
</div> </div>
<div id="22.02.beta.05"> <div id="22.02.beta.05">
@ -708,4 +749,4 @@ OpenRocket 0.9.0 (2009-05-24)
Initial release. Initial release.
</div> </div>
</body> </body>

View File

@ -13,6 +13,7 @@ import net.sf.openrocket.appearance.DecalImage;
import net.sf.openrocket.document.Attachment; import net.sf.openrocket.document.Attachment;
import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.file.FileSystemAttachmentFactory; import net.sf.openrocket.file.FileSystemAttachmentFactory;
import net.sf.openrocket.gui.util.FileHelper;
import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
@ -70,6 +71,7 @@ public class DecalModel extends AbstractListModel<DecalImage> implements ComboBo
lastImageDir = current; lastImageDir = current;
JFileChooser fc = new JFileChooser(current); JFileChooser fc = new JFileChooser(current);
fc.setFileFilter(FileHelper.getImageFileFilter());
fc.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); fc.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory());
int action = fc.showOpenDialog(SwingUtilities.getWindowAncestor(parent)); int action = fc.showOpenDialog(SwingUtilities.getWindowAncestor(parent));
if (action == JFileChooser.APPROVE_OPTION) { if (action == JFileChooser.APPROVE_OPTION) {

View File

@ -2,6 +2,7 @@ package net.sf.openrocket.gui.configdialog;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.Desktop;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -31,6 +32,8 @@ import net.sf.openrocket.appearance.AppearanceBuilder;
import net.sf.openrocket.appearance.Decal.EdgeMode; import net.sf.openrocket.appearance.Decal.EdgeMode;
import net.sf.openrocket.appearance.DecalImage; import net.sf.openrocket.appearance.DecalImage;
import net.sf.openrocket.appearance.defaults.DefaultAppearance; import net.sf.openrocket.appearance.defaults.DefaultAppearance;
import net.sf.openrocket.arch.SystemInfo;
import net.sf.openrocket.arch.SystemInfo.Platform;
import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.gui.SpinnerEditor; import net.sf.openrocket.gui.SpinnerEditor;
import net.sf.openrocket.gui.adaptors.BooleanModel; import net.sf.openrocket.gui.adaptors.BooleanModel;
@ -427,6 +430,8 @@ public class AppearancePanel extends JPanel {
edgesComboBox.setEnabled(customInside.isSelected()); edgesComboBox.setEnabled(customInside.isSelected());
if (customInside.isSelected()) { if (customInside.isSelected()) {
remove(outsidePanel); remove(outsidePanel);
MigLayout layout = (MigLayout) outsidePanel.getLayout();
layout.setLayoutConstraints("fill");
outsideInsidePane.insertTab(trans.get(tr_outside), null, outsidePanel, outsideInsidePane.insertTab(trans.get(tr_outside), null, outsidePanel,
"Outside Tool Tip", 0); "Outside Tool Tip", 0);
outsideInsidePane.setSelectedIndex(0); outsideInsidePane.setSelectedIndex(0);
@ -434,6 +439,8 @@ public class AppearancePanel extends JPanel {
} }
else { else {
remove(outsideInsidePane); remove(outsideInsidePane);
MigLayout layout = (MigLayout) outsidePanel.getLayout();
layout.setLayoutConstraints("fill, ins 0");
add(outsidePanel, "span 4, growx, wrap"); add(outsidePanel, "span 4, growx, wrap");
} }
@ -490,13 +497,11 @@ public class AppearancePanel extends JPanel {
if (!insideBuilder) { if (!insideBuilder) {
builder = ab; builder = ab;
mDefault = new BooleanModel(c.getAppearance() == null || defaultAppearance.equals(c.getAppearance())); mDefault = new BooleanModel(c.getAppearance() == null || defaultAppearance.equals(c.getAppearance()));
} } else if (c instanceof InsideColorComponent) {
else if (c instanceof InsideColorComponent) {
builder = insideAb; builder = insideAb;
Appearance appearance = ((InsideColorComponent)c).getInsideColorComponentHandler().getInsideAppearance(); Appearance appearance = ((InsideColorComponent) c).getInsideColorComponentHandler().getInsideAppearance();
mDefault = new BooleanModel(appearance == null || defaultAppearance.equals(appearance)); mDefault = new BooleanModel(appearance == null || defaultAppearance.equals(appearance));
} } else return;
else return;
DecalModel decalModel = new DecalModel(panel, document, builder); DecalModel decalModel = new DecalModel(panel, document, builder);
JComboBox<DecalImage> textureDropDown = new JComboBox<DecalImage>(decalModel); JComboBox<DecalImage> textureDropDown = new JComboBox<DecalImage>(decalModel);
@ -505,6 +510,7 @@ public class AppearancePanel extends JPanel {
// for multi-comp edits, the listeners' decals may not be updated otherwise // for multi-comp edits, the listeners' decals may not be updated otherwise
textureDropDown.addActionListener(new ActionListener() { textureDropDown.addActionListener(new ActionListener() {
private DecalImage previousSelection = (DecalImage) decalModel.getSelectedItem(); private DecalImage previousSelection = (DecalImage) decalModel.getSelectedItem();
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
DecalImage decal = (DecalImage) textureDropDown.getSelectedItem(); DecalImage decal = (DecalImage) textureDropDown.getSelectedItem();
@ -530,8 +536,7 @@ public class AppearancePanel extends JPanel {
if (!insideBuilder) { if (!insideBuilder) {
previousUserSelectedAppearance = (builder == null) ? null previousUserSelectedAppearance = (builder == null) ? null
: builder.getAppearance(); : builder.getAppearance();
} } else {
else {
previousUserSelectedInsideAppearance = (builder == null) ? null previousUserSelectedInsideAppearance = (builder == null) ? null
: builder.getAppearance(); : builder.getAppearance();
} }
@ -552,8 +557,7 @@ public class AppearancePanel extends JPanel {
listener.setAppearance(previousUserSelectedAppearance); listener.setAppearance(previousUserSelectedAppearance);
} }
builder.setAppearance(previousUserSelectedAppearance); builder.setAppearance(previousUserSelectedAppearance);
} } else {
else {
// Set the listeners' inside appearance to the previous user selected appearance // Set the listeners' inside appearance to the previous user selected appearance
for (AppearanceBuilder listener : builder.getConfigListeners().values()) { for (AppearanceBuilder listener : builder.getConfigListeners().values()) {
listener.setAppearance(previousUserSelectedInsideAppearance); listener.setAppearance(previousUserSelectedInsideAppearance);
@ -572,43 +576,46 @@ public class AppearancePanel extends JPanel {
JPanel p = new JPanel(new MigLayout("fill, ins 0", "[grow][]")); JPanel p = new JPanel(new MigLayout("fill, ins 0", "[grow][]"));
mDefault.addEnableComponent(textureDropDown, false); mDefault.addEnableComponent(textureDropDown, false);
p.add(textureDropDown, "grow"); p.add(textureDropDown, "grow");
panel.add(p, "span 3, growx, wrap"); panel.add(p, "spanx 3, growx, wrap");
order.add(textureDropDown); order.add(textureDropDown);
JButton editBtn = new SelectColorButton(
trans.get("AppearanceCfg.but.edit")); //// Edit button
editBtn.setEnabled(!materialDefault.isSelected() && builder.getImage() != null); if ((SystemInfo.getPlatform() != Platform.UNIX) || !SystemInfo.isConfined()) {
// Enable the editBtn only when the appearance builder has an Image JButton editBtn = new SelectColorButton(
// assigned to it. trans.get("AppearanceCfg.but.edit"));
builder.addChangeListener(new StateChangeListener() { // Enable the editBtn only when the appearance builder has an Image
@Override // assigned to it.
public void stateChanged(EventObject e) { editBtn.setEnabled(!materialDefault.isSelected() && builder.getImage() != null);
editBtn.setEnabled(!materialDefault.isSelected() && builder.getImage() != null); builder.addChangeListener(new StateChangeListener() {
} @Override
}); public void stateChanged(EventObject e) {
materialDefault.addActionListener(new ActionListener() { editBtn.setEnabled(!materialDefault.isSelected() && builder.getImage() != null);
@Override
public void actionPerformed(ActionEvent e) {
editBtn.setEnabled(!materialDefault.isSelected() && builder.getImage() != null);
}
});
editBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
DecalImage newImage = editDecalHelper.editDecal(
SwingUtilities
.getWindowAncestor(panel),
document, c, builder.getImage(), insideBuilder);
builder.setImage(newImage);
} catch (EditDecalHelperException ex) {
JOptionPane.showMessageDialog(panel,
ex.getMessage(), "", JOptionPane.ERROR_MESSAGE);
} }
} });
materialDefault.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
editBtn.setEnabled(!materialDefault.isSelected() && builder.getImage() != null);
}
});
}); editBtn.addActionListener(new ActionListener() {
p.add(editBtn); @Override
public void actionPerformed(ActionEvent e) {
try {
DecalImage newImage = editDecalHelper.editDecal(
SwingUtilities
.getWindowAncestor(panel),
document, c, builder.getImage(), insideBuilder);
builder.setImage(newImage);
} catch (EditDecalHelperException ex) {
JOptionPane.showMessageDialog(panel,
ex.getMessage(), "", JOptionPane.ERROR_MESSAGE);
}
}
});
p.add(editBtn);
}
// TODO: move the separate columns in two separate panels instead of adding them in a zig-zag way // TODO: move the separate columns in two separate panels instead of adding them in a zig-zag way
// Color // Color

View File

@ -96,11 +96,11 @@ public class EditDecalDialog extends JDialog {
} else { } else {
commandText = new JTextArea(); commandText = new JTextArea();
commandText.setEnabled(false); commandText.setEnabled(true);
panel.add(commandText, "growx, wrap"); panel.add(commandText, "growx, wrap");
final JButton chooser = new SelectColorButton(trans.get("EditDecalDialog.btn.chooser")); final JButton chooser = new SelectColorButton(trans.get("EditDecalDialog.btn.chooser"));
chooser.setEnabled(false); chooser.setEnabled(true);
chooser.addActionListener(new ActionListener() { chooser.addActionListener(new ActionListener() {
@Override @Override

View File

@ -145,7 +145,7 @@ public class GraphicsPreferencesPanel extends PreferencesPanel {
* we will rely on using the xdg-open command which allows the user to pick * we will rely on using the xdg-open command which allows the user to pick
* their preferred application. * their preferred application.
*/ */
if (SystemInfo.getPlatform() != Platform.UNIX && !SystemInfo.isConfined()) { if ((SystemInfo.getPlatform() != Platform.UNIX) || !SystemInfo.isConfined()) {
this.add(editorPrefPanel, "growx, span"); this.add(editorPrefPanel, "growx, span");
} }