diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties
index 0668aabcc..912ac9984 100644
--- a/core/resources/l10n/messages.properties
+++ b/core/resources/l10n/messages.properties
@@ -1492,8 +1492,13 @@ OBJOptionChooser.lbl.multipleComponents = Multiple components
OBJOptionChooser.lbl.optimizeFor = Optimize for:
OBJOptionChooser.btn.opt3DPrint = 3D printing
OBJOptionChooser.btn.opt3DPrint.ttip = Optimize the OBJ export settings for 3D printing.
-OBJOptionChooser.btn.opt3DRend = 3D rendering
-OBJOptionChooser.btn.opt3DRend.ttip = Optimize the OBJ export settings for use in 3D rendering software.
+OBJOptionChooser.btn.optRend = Rendering
+OBJOptionChooser.btn.optRend.ttip = Optimize the OBJ export settings for use in 3D rendering software.
+OBJOptionChooser.easterEgg.title = Don't worry
+OBJOptionChooser.easterEgg.msg = Don't worry, you already have the 3D printing settings enabled :).
+OBJOptionChooser.easterEgg.msg2 = Seriously, you don't have to keep pressing me. :|
+OBJOptionChooser.easterEgg.msg3 = I'm getting tired\u2026 Please stop :(
+OBJOptionChooser.easterEgg.msg4 = Well, congrats on wasting 40 clicks and your time :D Bye!
OBJOptionChooser.checkbox.exportChildren = Export children
OBJOptionChooser.checkbox.exportChildren.ttip = If true, export children of the selected components as well.
OBJOptionChooser.checkbox.exportChildren.assemblies.ttip = Component assemblies always export their children.
diff --git a/swing/src/net/sf/openrocket/file/wavefrontobj/OBJOptionChooser.java b/swing/src/net/sf/openrocket/file/wavefrontobj/OBJOptionChooser.java
index 5837f751d..5f72af59b 100644
--- a/swing/src/net/sf/openrocket/file/wavefrontobj/OBJOptionChooser.java
+++ b/swing/src/net/sf/openrocket/file/wavefrontobj/OBJOptionChooser.java
@@ -12,14 +12,18 @@ import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
+import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
+import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JSpinner;
import javax.swing.JToggleButton;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -49,7 +53,9 @@ public class OBJOptionChooser extends JPanel {
private final List selectedComponents;
private final Rocket rocket;
- private boolean isProgrammaticallyChanging = false;
+ //private boolean isProgrammaticallyChanging = false;
+
+ private int totallyNormalCounter = 0;
public OBJOptionChooser(OBJExportOptions opts, List selectedComponents, Rocket rocket) {
super(new MigLayout("hidemode 3"));
@@ -67,27 +73,30 @@ public class OBJOptionChooser extends JPanel {
JLabel label = new JLabel(trans.get("OBJOptionChooser.lbl.optimizeFor"));
this.add(label);
- // 3D printing
+ //// 3D printing
JButton opt3DPrint = new JButton(trans.get("OBJOptionChooser.btn.opt3DPrint"));
opt3DPrint.setToolTipText(trans.get("OBJOptionChooser.btn.opt3DPrint.ttip"));
opt3DPrint.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- optimizeSettingsFor3DPrinting(opts);
+ optimizeSettingsFor3DPrinting();
+ totallyNormalCounter++;
+ youMayIgnoreThisCode();
}
});
- this.add(opt3DPrint, "wrap");
+ this.add(opt3DPrint);
- // 3D rendering
- JButton opt3DRend = new JButton(trans.get("OBJOptionChooser.btn.opt3DRend"));
- opt3DRend.setToolTipText(trans.get("OBJOptionChooser.btn.opt3DRend.ttip"));
- opt3DRend.addActionListener(new ActionListener() {
+ //// Rendering
+ JButton optRend = new JButton(trans.get("OBJOptionChooser.btn.optRend"));
+ optRend.setToolTipText(trans.get("OBJOptionChooser.btn.optRend.ttip"));
+ optRend.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- optimizeSettingsFor3DRendering(opts);
+ optimizeSettingsForRendering();
}
});
- this.add(opt3DRend, "skip 1, wrap");
+ destroyTheMagic(optRend);
+ this.add(optRend, "wrap");
this.add(new JSeparator(JSeparator.HORIZONTAL), "spanx, growx, wrap para");
@@ -114,21 +123,25 @@ public class OBJOptionChooser extends JPanel {
updateComponentsLabel(components);
}
});
+ destroyTheMagic(exportChildren);
this.add(exportChildren, "spanx, wrap");
//// Remove origin offset
this.removeOffset = new JCheckBox(trans.get("OBJOptionChooser.checkbox.removeOffset"));
this.removeOffset.setToolTipText(trans.get("OBJOptionChooser.checkbox.removeOffset.ttip"));
+ destroyTheMagic(removeOffset);
this.add(removeOffset, "spanx, wrap unrel");
//// Export appearance
this.exportAppearance = new JCheckBox(trans.get("OBJOptionChooser.checkbox.exportAppearance"));
this.exportAppearance.setToolTipText(trans.get("OBJOptionChooser.checkbox.exportAppearance.ttip"));
+ destroyTheMagic(exportAppearance);
this.add(exportAppearance, "spanx, wrap");
//// Export as separate files
this.exportAsSeparateFiles = new JCheckBox(trans.get("OBJOptionChooser.checkbox.exportAsSeparateFiles"));
this.exportAsSeparateFiles.setToolTipText(trans.get("OBJOptionChooser.checkbox.exportAsSeparateFiles.ttip"));
+ destroyTheMagic(exportAsSeparateFiles);
this.add(exportAsSeparateFiles, "spanx, wrap unrel");
this.add(new JSeparator(JSeparator.HORIZONTAL), "spanx, growx, wrap para");
@@ -151,16 +164,19 @@ public class OBJOptionChooser extends JPanel {
JSpinner spin = new JSpinner(scalingModel.getSpinnerModel());
spin.setToolTipText(trans.get("OBJOptionChooser.lbl.Scaling.ttip"));
spin.setEditor(new SpinnerEditor(spin, 5));
+ destroyTheMagic(scalingModel);
advancedOptionsPanel.add(spin, "wrap");
//// Export colors in sRGB
this.sRGB = new JCheckBox(trans.get("OBJOptionChooser.checkbox.sRGB"));
this.sRGB.setToolTipText(trans.get("OBJOptionChooser.checkbox.sRGB.ttip"));
+ destroyTheMagic(sRGB);
advancedOptionsPanel.add(sRGB, "spanx, wrap");
//// Triangulate
this.triangulate = new JCheckBox(trans.get("OBJOptionChooser.checkbox.triangulate"));
this.triangulate.setToolTipText(trans.get("OBJOptionChooser.checkbox.triangulate.ttip"));
+ destroyTheMagic(triangulate);
advancedOptionsPanel.add(triangulate, "spanx, wrap");
this.triangulate.addItemListener(new ItemListener() {
@Override
@@ -185,6 +201,7 @@ public class OBJOptionChooser extends JPanel {
advancedOptionsPanel.add(LODLabel, "spanx, split 2");
this.LOD = new JComboBox<>(ObjUtils.LevelOfDetail.values());
this.LOD.setToolTipText(trans.get("OBJOptionChooser.lbl.LevelOfDetail.ttip"));
+ destroyTheMagic(LOD);
advancedOptionsPanel.add(LOD, "growx, wrap unrel");
@@ -249,7 +266,7 @@ public class OBJOptionChooser extends JPanel {
}
}
});
- this.add(advancedOptionsPanel);
+ this.add(advancedOptionsPanel, "spanx");
loadOptions(opts);
}
@@ -313,6 +330,10 @@ public class OBJOptionChooser extends JPanel {
this.exportAsSeparateFiles.setSelected(opts.isExportAsSeparateFiles());
this.removeOffset.setSelected(opts.isRemoveOffset());
this.triangulate.setSelected(opts.isTriangulate());
+ // Re-apply if no triangulate, because the triangulation can mess with the export appearance setting
+ if (!opts.isTriangulate()) {
+ this.exportAppearance.setSelected(opts.isExportAppearance());
+ }
this.sRGB.setSelected(opts.isUseSRGB());
this.scalingModel.setValue(opts.getScaling());
@@ -350,18 +371,29 @@ public class OBJOptionChooser extends JPanel {
opts.setTransformer(new DefaultCoordTransform(rocket.getLength()));
}
- private static void optimizeSettingsFor3DPrinting(OBJExportOptions options) {
+ private void optimizeSettingsFor3DPrinting() {
+ OBJExportOptions options = new OBJExportOptions(rocket);
+ storeOptions(options, true);
+
options.setExportAppearance(false);
+ options.setRemoveOffset(true);
options.setScaling(1000);
options.setTriangulate(true);
options.setLOD(ObjUtils.LevelOfDetail.HIGH_QUALITY);
+
+ loadOptions(options);
}
- private static void optimizeSettingsFor3DRendering(OBJExportOptions options) {
+ private void optimizeSettingsForRendering() {
+ OBJExportOptions options = new OBJExportOptions(rocket);
+ storeOptions(options, true);
+
options.setExportAppearance(true);
- options.setScaling(1);
+ options.setScaling(20); // Idk, pretty arbitrary
options.setTriangulate(false);
options.setLOD(ObjUtils.LevelOfDetail.NORMAL_QUALITY);
+
+ loadOptions(options);
}
private static boolean isOnlyComponentAssembliesSelected(List selectedComponents) {
@@ -382,7 +414,51 @@ public class OBJOptionChooser extends JPanel {
return false;
}
- private void coordTransComboAction(ItemEvent e, JComboBox otherCombo) {
+ private void destroyTheMagic(AbstractButton component) {
+ component.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ totallyNormalCounter = 0;
+ }
+ });
+ }
+
+ private void destroyTheMagic(DoubleModel model) {
+ model.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ totallyNormalCounter = 0;
+ }
+ });
+ }
+
+ private void destroyTheMagic(JComboBox comboBox) {
+ comboBox.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
+ totallyNormalCounter = 0;
+ }
+ });
+ }
+
+ private void youMayIgnoreThisCode() {
+ if (totallyNormalCounter == 4) {
+ JOptionPane.showMessageDialog(null, trans.get("OBJOptionChooser.easterEgg.msg"),
+ trans.get("OBJOptionChooser.easterEgg.title"), JOptionPane.INFORMATION_MESSAGE);
+ } else if (totallyNormalCounter == 15) {
+ JOptionPane.showMessageDialog(null, trans.get("OBJOptionChooser.easterEgg.msg2"),
+ trans.get("OBJOptionChooser.easterEgg.title"), JOptionPane.INFORMATION_MESSAGE);
+ } else if (totallyNormalCounter == 25) {
+ JOptionPane.showMessageDialog(null, trans.get("OBJOptionChooser.easterEgg.msg3"),
+ trans.get("OBJOptionChooser.easterEgg.title"), JOptionPane.INFORMATION_MESSAGE);
+ } else if (totallyNormalCounter == 40) {
+ JOptionPane.showMessageDialog(null, trans.get("OBJOptionChooser.easterEgg.msg4"),
+ trans.get("OBJOptionChooser.easterEgg.title"), JOptionPane.INFORMATION_MESSAGE);
+ totallyNormalCounter = 0;
+ }
+ }
+
+ /*private void coordTransComboAction(ItemEvent e, JComboBox otherCombo) {
if (e.getStateChange() != ItemEvent.SELECTED) {
return;
}
@@ -413,5 +489,5 @@ public class OBJOptionChooser extends JPanel {
// Reset the flag after changes are done
this.isProgrammaticallyChanging = false;
- }
+ }*/
}