diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index be9630a1d..f54a10cff 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -410,6 +410,7 @@ PreferencesOptionPanel.checkbox.windowInfo.ttip = If unchecked, window informati UITheme.Auto = Auto (detect) UITheme.Light = Light (default) UITheme.Dark = Dark +UITheme.DarkContrast = Dark, high contrast ! Welcome dialog welcome.dlg.title = Welcome to OpenRocket diff --git a/swing/src/net/sf/openrocket/gui/util/UITheme.java b/swing/src/net/sf/openrocket/gui/util/UITheme.java index 612792f5f..158c2ad8c 100644 --- a/swing/src/net/sf/openrocket/gui/util/UITheme.java +++ b/swing/src/net/sf/openrocket/gui/util/UITheme.java @@ -2,6 +2,7 @@ package net.sf.openrocket.gui.util; import com.github.weisj.darklaf.LafManager; import com.github.weisj.darklaf.theme.DarculaTheme; +import com.github.weisj.darklaf.theme.OneDarkTheme; import com.jthemedetecor.OsThemeDetector; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; @@ -106,6 +107,9 @@ public class UITheme { } public enum Themes implements Theme { + /* + Standard light theme + */ LIGHT { private final String displayName = trans.get("UITheme.Light"); @@ -330,8 +334,12 @@ public class UITheme { } } }, + /* + Dark theme + */ DARK { private final String displayName = trans.get("UITheme.Dark"); + @Override public void applyTheme() { final SwingPreferences prefs = (SwingPreferences) Application.getPreferences(); @@ -552,6 +560,235 @@ public class UITheme { } } }, + /* + High-contrast dark theme + */ + DARK_CONTRAST { + private final String displayName = trans.get("UITheme.DarkContrast"); + + @Override + public void applyTheme() { + final SwingPreferences prefs = (SwingPreferences) Application.getPreferences(); + + LafManager.install(new OneDarkTheme()); + setGlobalFontSize(prefs.getUIFontSize()); + } + + @Override + public String getDisplayName() { + return displayName; + } + + @Override + public Color getBackgroundColor() { + return new Color(43, 45, 51); + } + + @Override + public Color getBorderColor() { + return new Color(163, 163, 163, 204); + } + + @Override + public Color getTextColor() { + return UIManager.getColor("Label.foreground"); + } + + @Override + public Color getDimTextColor() { + return new Color(189, 189, 189); + } + + @Override + public Color getTextSelectionForegroundColor() { + return Color.WHITE; + } + + @Override + public Color getTextSelectionBackgroundColor() { + return new Color(62, 108, 173); + } + + @Override + public Color getWarningColor() { + return new Color(255, 162, 162); + } + + @Override + public Color getDarkWarningColor() { + return new Color(238, 125, 125); + } + + @Override + public Color getRowBackgroundLighterColor() { + return new Color(43, 49, 58); + } + + @Override + public Color getRowBackgroundDarkerColor() { + return new Color(34, 37, 44); + } + + @Override + public Color getFlightDataTextActiveColor() { + return new Color(173, 206, 255); + } + + @Override + public Color getFlightDataTextInactiveColor() { + return new Color(149, 186, 255, 127); + } + + @Override + public String getDefaultBodyComponentColor() { + return "150,175,255"; + } + @Override + public String getDefaultTubeFinSetColor() { + return "150,184,254"; + } + @Override + public String getDefaultFinSetColor() { + return "150,184,255"; + } + @Override + public String getDefaultLaunchLugColor() { + return "142,153,238"; + } + @Override + public String getDefaultRailButtonColor() { + return "142,153,238"; + } + @Override + public String getDefaultInternalComponentColor() { + return "181,128,151"; + } + @Override + public String getDefaultMassObjectColor() { + return "210,210,210"; + } + @Override + public String getDefaultRecoveryDeviceColor() { + return "220,90,90"; + } + @Override + public String getDefaultPodSetColor() { + return "190,190,235"; + } + @Override + public String getDefaultParallelStageColor() { + return "210,180,195"; + } + + @Override + public Color getMotorBorderColor() { + return new Color(255, 255, 255, 200); + } + + @Override + public Color getMotorFillColor() { + return new Color(0, 0, 0, 70); + } + + @Override + public Color getCGColor() { + return new Color(85, 133, 253); + } + + @Override + public Color getCPColor() { + return new Color(255, 72, 106); + } + + @Override + public Color getURLColor() { + return new Color(171, 185, 255); + } + + @Override + public Color getComponentTreeBackgroundColor() { + return getBackgroundColor(); + } + + @Override + public Color getComponentTreeForegroundColor() { + return getTextColor(); + } + + @Override + public Color getFinPointGridMajorLineColor() { + return new Color(164, 164, 224, 197); + } + + @Override + public Color getFinPointGridMinorLineColor() { + return new Color(134, 134, 201, 69); + } + + @Override + public Color getFinPointPointColor() { + return new Color(242, 121, 121, 255); + } + + @Override + public Color getFinPointSelectedPointColor() { + return new Color(232, 78, 78, 255); + } + + @Override + public Color getFinPointBodyLineColor() { + return Color.WHITE; + } + + @Override + public Icon getMassOverrideIcon() { + return Icons.MASS_OVERRIDE_DARK; + } + + @Override + public Icon getMassOverrideSubcomponentIcon() { + return Icons.MASS_OVERRIDE_SUBCOMPONENT_DARK; + } + + @Override + public Icon getCGOverrideIcon() { + return Icons.CG_OVERRIDE_DARK; + } + + @Override + public Icon getCGOverrideSubcomponentIcon() { + return Icons.CG_OVERRIDE_SUBCOMPONENT_DARK; + } + + @Override + public Icon getCDOverrideIcon() { + return Icons.CD_OVERRIDE_DARK; + } + + @Override + public Icon getCDOverrideSubcomponentIcon() { + return Icons.CD_OVERRIDE_SUBCOMPONENT_DARK; + } + + @Override + public Border getBorder() { + return BorderFactory.createLineBorder(getBorderColor()); + } + + @Override + public void formatScriptTextArea(RSyntaxTextArea textArea) { + try { + org.fife.ui.rsyntaxtextarea.Theme theme = org.fife.ui.rsyntaxtextarea.Theme.load(getClass().getResourceAsStream( + "/org/fife/ui/rsyntaxtextarea/themes/monokai.xml")); + theme.apply(textArea); + } catch (IOException ioe) { + log.warn("Unable to load RSyntaxTextArea theme", ioe); + } + } + }, + /* + Detect best theme based on operating system theme + */ AUTO { private final String displayName = trans.get("UITheme.Auto");