From c3649964498c66ad25021c811b9d9aafc50f518f Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 28 Aug 2023 13:31:33 +0100 Subject: [PATCH] Add UI hack for file chooser on light theme macOS --- .../gui/main/DesignFileSaveAsFileChooser.java | 13 ++++++++++++ .../net/sf/openrocket/gui/util/UITheme.java | 20 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/main/DesignFileSaveAsFileChooser.java b/swing/src/net/sf/openrocket/gui/main/DesignFileSaveAsFileChooser.java index 85b961814..1cc5e6b74 100644 --- a/swing/src/net/sf/openrocket/gui/main/DesignFileSaveAsFileChooser.java +++ b/swing/src/net/sf/openrocket/gui/main/DesignFileSaveAsFileChooser.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.main; +import java.awt.Dimension; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; @@ -8,13 +9,16 @@ import java.util.List; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; +import net.sf.openrocket.arch.SystemInfo; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.StorageOptions.FileType; import net.sf.openrocket.file.wavefrontobj.OBJOptionChooser; import net.sf.openrocket.file.wavefrontobj.export.OBJExportOptions; import net.sf.openrocket.gui.util.FileHelper; +import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.SimpleFileFilter; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.widgets.SaveFileChooser; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.RocketComponent; @@ -76,6 +80,15 @@ public class DesignFileSaveAsFileChooser extends SaveFileChooser { this.setAccessory(objChooser); this.addChoosableFileFilter(FileHelper.WAVEFRONT_OBJ_FILTER); this.setFileFilter(FileHelper.WAVEFRONT_OBJ_FILTER); + + // TODO: update this dynamically instead of hard-coded values + // The macOS file chooser has an issue where it does not update its size when the accessory is added. + if (SystemInfo.getPlatform() == SystemInfo.Platform.MAC_OS && UITheme.isLightTheme(GUIUtil.getUITheme())) { + Dimension currentSize = this.getPreferredSize(); + Dimension newSize = new Dimension((int) (1.35 * currentSize.width), (int) (1.5 * currentSize.height)); + this.setPreferredSize(newSize); + } + break; } diff --git a/swing/src/net/sf/openrocket/gui/util/UITheme.java b/swing/src/net/sf/openrocket/gui/util/UITheme.java index ecc1a2d1a..612792f5f 100644 --- a/swing/src/net/sf/openrocket/gui/util/UITheme.java +++ b/swing/src/net/sf/openrocket/gui/util/UITheme.java @@ -85,6 +85,26 @@ public class UITheme { void formatScriptTextArea(RSyntaxTextArea textArea); } + public static boolean isLightTheme(Theme theme) { + if (theme == Themes.DARK) { + return false; + } else if (theme == Themes.LIGHT) { + return true; + } else if (theme == Themes.AUTO) { + try { + final OsThemeDetector detector = OsThemeDetector.getDetector(); + final boolean isDarkThemeUsed = detector.isDark(); + if (isDarkThemeUsed) { + return false; + } else { + return true; + } + } catch (Exception ignore) {} + } + + return false; + } + public enum Themes implements Theme { LIGHT { private final String displayName = trans.get("UITheme.Light");