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; - } + }*/ }