From 801a7023a461ddca0ca7fd6effa36137f73e39c8 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 22 Apr 2020 10:30:14 +0200 Subject: [PATCH] IntelliJ Themes: fixed toggle button selected backgrounds (issue #86) --- .../java/com/formdev/flatlaf/FlatLaf.java | 4 +-- .../com/formdev/flatlaf/IntelliJTheme.java | 25 ++++++++++++++++++ .../com/formdev/flatlaf/UIDefaultsLoader.java | 26 ++++++++++++++----- .../flatlaf/IntelliJTheme$ThemeLaf.properties | 23 ++++++++++++++++ 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java index 2cab462b..925b7982 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -282,9 +282,9 @@ public abstract class FlatLaf // load defaults from properties List> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading(); if( lafClassesForDefaultsLoading != null ) - UIDefaultsLoader.loadDefaultsFromProperties( lafClassesForDefaultsLoading, addons, getAdditionalDefaults(), defaults ); + UIDefaultsLoader.loadDefaultsFromProperties( lafClassesForDefaultsLoading, addons, getAdditionalDefaults(), isDark(), defaults ); else - UIDefaultsLoader.loadDefaultsFromProperties( getClass(), addons, getAdditionalDefaults(), defaults ); + UIDefaultsLoader.loadDefaultsFromProperties( getClass(), addons, getAdditionalDefaults(), isDark(), defaults ); // use Aqua MenuBarUI if Mac screen menubar is enabled if( SystemInfo.IS_MAC && Boolean.getBoolean( "apple.laf.useScreenMenuBar" ) ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java index 26b95c60..835f2daa 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java @@ -132,6 +132,8 @@ public class IntelliJTheme defaults.put( "Button.paintShadow", true ); defaults.put( "Button.shadowWidth", dark ? 2 : 1 ); + Map themeSpecificDefaults = removeThemeSpecificDefaults( defaults ); + loadNamedColors( defaults ); // convert Json "ui" structure to UI defaults @@ -191,6 +193,29 @@ public class IntelliJTheme defaults.put( "ToggleButton.endBackground", defaults.get( "Button.endBackground" ) ); if( !uiKeys.contains( "ToggleButton.foreground" ) && uiKeys.contains( "Button.foreground" ) ) defaults.put( "ToggleButton.foreground", defaults.get( "Button.foreground" ) ); + + // apply theme specific UI defaults at the end to allow overwriting + defaults.putAll( themeSpecificDefaults ); + } + + private Map removeThemeSpecificDefaults( UIDefaults defaults ) { + // search for theme specific UI defaults keys + ArrayList themeSpecificKeys = new ArrayList<>(); + for( Object key : defaults.keySet() ) { + if( key instanceof String && ((String)key).startsWith( "[" ) ) + themeSpecificKeys.add( (String) key ); + } + + // remove theme specific UI defaults and remember only those for current theme + Map themeSpecificDefaults = new HashMap<>(); + String currentThemePrefix = '[' + name.replace( ' ', '_' ) + ']'; + for( String key : themeSpecificKeys ) { + Object value = defaults.remove( key ); + if( key.startsWith( currentThemePrefix ) ) + themeSpecificDefaults.put( key.substring( currentThemePrefix.length() ), value ); + } + + return themeSpecificDefaults; } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java index 661cd65b..b2e5514a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -69,7 +69,7 @@ class UIDefaultsLoader private static final String GLOBAL_PREFIX = "*."; static void loadDefaultsFromProperties( Class lookAndFeelClass, List addons, - Properties additionalDefaults, UIDefaults defaults ) + Properties additionalDefaults, boolean dark, UIDefaults defaults ) { // determine classes in class hierarchy in reverse order ArrayList> lafClasses = new ArrayList<>(); @@ -80,11 +80,11 @@ class UIDefaultsLoader lafClasses.add( 0, lafClass ); } - loadDefaultsFromProperties( lafClasses, addons, additionalDefaults, defaults ); + loadDefaultsFromProperties( lafClasses, addons, additionalDefaults, dark, defaults ); } static void loadDefaultsFromProperties( List> lafClasses, List addons, - Properties additionalDefaults, UIDefaults defaults ) + Properties additionalDefaults, boolean dark, UIDefaults defaults ) { try { // load core properties files @@ -121,14 +121,28 @@ class UIDefaultsLoader // collect all platform specific keys (but do not modify properties) ArrayList platformSpecificKeys = new ArrayList<>(); - for( Object key : properties.keySet() ) { - if( ((String)key).startsWith( "[" ) ) - platformSpecificKeys.add( (String) key ); + for( Object okey : properties.keySet() ) { + String key = (String) okey; + if( key.startsWith( "[" ) && + (key.startsWith( "[win]" ) || + key.startsWith( "[mac]" ) || + key.startsWith( "[linux]" ) || + key.startsWith( "[light]" ) || + key.startsWith( "[dark]" )) ) + platformSpecificKeys.add( key ); } // remove platform specific properties and re-add only properties // for current platform, but with platform prefix removed if( !platformSpecificKeys.isEmpty() ) { + // handle light/dark specific properties + String lightOrDarkPrefix = dark ? "[dark]" : "[light]"; + for( String key : platformSpecificKeys ) { + if( key.startsWith( lightOrDarkPrefix ) ) + properties.put( key.substring( lightOrDarkPrefix.length() ), properties.remove( key ) ); + } + + // handle platform specific properties String platformPrefix = SystemInfo.IS_WINDOWS ? "[win]" : SystemInfo.IS_MAC ? "[mac]" : diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties index d83c99cf..42b31e19 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties @@ -39,3 +39,26 @@ HelpButton.hoverBorderColor=null ToggleButton.startBackground=$ToggleButton.background ToggleButton.endBackground=$ToggleButton.background +[dark]ToggleButton.selectedBackground=lighten($ToggleButton.background,15%,derived autoInverse) +[dark]ToggleButton.disabledSelectedBackground=lighten($ToggleButton.background,5%,derived autoInverse) + + +#---- theme specific ---- + +[Gruvbox_Dark_Hard]ToggleButton.selectedBackground=$ToggleButton.selectedBackground +[Gruvbox_Dark_Hard]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground + +[Gruvbox_Dark_Medium]ToggleButton.selectedBackground=$ToggleButton.selectedBackground +[Gruvbox_Dark_Medium]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground + +[Gruvbox_Dark_Soft]ToggleButton.selectedBackground=$ToggleButton.selectedBackground +[Gruvbox_Dark_Soft]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground + +[Hiberbee_Dark]ToggleButton.selectedBackground=$ToggleButton.selectedBackground +[Hiberbee_Dark]ToggleButton.selectedBackground=$ToggleButton.selectedBackground +[Hiberbee_Dark]ToggleButton.toolbar.selectedBackground=$ToggleButton.toolbar.selectedBackground + +[High_contrast]ToggleButton.selectedBackground=#fff +[High_contrast]ToggleButton.selectedForeground=#000 +[High_contrast]ToggleButton.disabledSelectedBackground=#444 +[High_contrast]ToggleButton.toolbar.selectedBackground=#fff