From d2d4f73834d6167696822915bee186d1f57d3874 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 23 May 2020 16:40:09 +0200 Subject: [PATCH] ScrollBar: use derived colors for track and thumb (issue #103) --- .../com/formdev/flatlaf/UIDefaultsLoader.java | 6 ++++-- .../formdev/flatlaf/ui/FlatArrowButton.java | 6 +++++- .../formdev/flatlaf/ui/FlatScrollBarUI.java | 20 +++++++++++++++++-- .../formdev/flatlaf/util/DerivedColor.java | 2 +- .../formdev/flatlaf/FlatDarkLaf.properties | 8 ++++---- .../formdev/flatlaf/FlatLightLaf.properties | 8 ++++---- .../flatlaf/testing/FlatTestFrame.java | 15 ++++++++++---- .../uidefaults/FlatDarkLaf_1.8.0_202.txt | 12 +++++------ .../uidefaults/FlatLightLaf_1.8.0_202.txt | 12 +++++------ 9 files changed, 59 insertions(+), 30 deletions(-) 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 4f4d70b2..9a80178e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -610,15 +610,17 @@ class UIDefaultsLoader } // parse base color - ColorUIResource baseColor = (ColorUIResource) parseColorOrFunction( resolver.apply( colorStr ), resolver, reportError ); + String resolvedColorStr = resolver.apply( colorStr ); + ColorUIResource baseColor = (ColorUIResource) parseColorOrFunction( resolvedColorStr, resolver, reportError ); // apply this function to base color Color newColor = ColorFunctions.applyFunctions( baseColor, function ); if( derived ) { ColorFunction[] functions; - if( baseColor instanceof DerivedColor ) { + if( baseColor instanceof DerivedColor && resolvedColorStr == colorStr ) { // if the base color is also derived, join the color functions + // but only if base color function is specified directly in this function ColorFunction[] baseFunctions = ((DerivedColor)baseColor).getFunctions(); functions = new ColorFunction[baseFunctions.length + 1]; System.arraycopy( baseFunctions, 0, functions, 0, baseFunctions.length ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java index 3ddf8e13..462d6dc2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java @@ -113,6 +113,10 @@ public class FlatArrowButton this.yOffset = yOffset; } + protected Color deriveHoverBackground( Color hoverBackground ) { + return hoverBackground; + } + @Override public Dimension getPreferredSize() { return scale( super.getPreferredSize() ); @@ -134,7 +138,7 @@ public class FlatArrowButton // paint hover background if( enabled && isHover() && hoverBackground != null ) { - g.setColor( hoverBackground ); + g.setColor( deriveHoverBackground( hoverBackground ) ); g.fillRect( 0, 0, width, height ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index 32a4ce25..0b43498f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -191,6 +191,11 @@ public class FlatScrollBarUI FlatArrowButton button = new FlatArrowButton( orientation, arrowType, buttonArrowColor, buttonDisabledArrowColor, null, hoverTrackColor ) { + @Override + protected Color deriveHoverBackground( Color hoverBackground ) { + return getTrackColor( scrollbar, true ) ; + } + @Override public Dimension getPreferredSize() { if( isShowButtons() ) { @@ -231,7 +236,7 @@ public class FlatScrollBarUI @Override protected void paintTrack( Graphics g, JComponent c, Rectangle trackBounds ) { - g.setColor( hoverTrack ? hoverTrackColor : trackColor ); + g.setColor( getTrackColor( c, hoverTrack ) ); paintTrackOrThumb( g, c, trackBounds, trackInsets, trackArc ); } @@ -240,7 +245,7 @@ public class FlatScrollBarUI if( thumbBounds.isEmpty() || !scrollbar.isEnabled() ) return; - g.setColor( hoverThumb ? hoverThumbColor : thumbColor ); + g.setColor( getThumbColor( c, hoverThumb ) ); paintTrackOrThumb( g, c, thumbBounds, thumbInsets, thumbArc ); } @@ -272,6 +277,17 @@ public class FlatScrollBarUI // do not paint } + protected Color getTrackColor( JComponent c, boolean hover ) { + Color trackColor = FlatUIUtils.deriveColor( this.trackColor, c.getBackground() ); + return hover ? FlatUIUtils.deriveColor( hoverTrackColor, trackColor ) : trackColor; + } + + protected Color getThumbColor( JComponent c, boolean hover ) { + Color trackColor = FlatUIUtils.deriveColor( this.trackColor, c.getBackground() ); + Color thumbColor = FlatUIUtils.deriveColor( this.thumbColor, trackColor ); + return hover ? FlatUIUtils.deriveColor( hoverThumbColor, thumbColor ) : thumbColor; + } + @Override protected Dimension getMinimumThumbSize() { return UIScale.scale( super.getMinimumThumbSize() ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/DerivedColor.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/DerivedColor.java index 798d8684..de366890 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/DerivedColor.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/DerivedColor.java @@ -41,7 +41,7 @@ public class DerivedColor } public Color derive( Color baseColor ) { - if( hasBaseOfDefaultColor && baseOfDefaultColorRGB == baseColor.getRGB() ) + if( (hasBaseOfDefaultColor && baseOfDefaultColorRGB == baseColor.getRGB()) || baseColor == this ) return this; // return default color Color result = ColorFunctions.applyFunctions( baseColor, functions ); diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties index 8c3693ce..a3f6ad8f 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -217,10 +217,10 @@ ProgressBar.selectionBackground=@foreground #---- ScrollBar ---- -ScrollBar.track=#3F4244 -ScrollBar.thumb=lighten($ScrollBar.track,10%) -ScrollBar.hoverTrackColor=lighten($ScrollBar.track,4%) -ScrollBar.hoverThumbColor=lighten($ScrollBar.thumb,10%) +ScrollBar.track=lighten(@background,1%,derived noAutoInverse) +ScrollBar.thumb=lighten($ScrollBar.track,10%,derived noAutoInverse) +ScrollBar.hoverTrackColor=lighten($ScrollBar.track,4%,derived noAutoInverse) +ScrollBar.hoverThumbColor=lighten($ScrollBar.thumb,10%,derived noAutoInverse) #---- Separator ---- diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties index 9ddd869d..938997ea 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -224,10 +224,10 @@ ProgressBar.selectionBackground=@foreground #---- ScrollBar ---- -ScrollBar.track=#F5F5F5 -ScrollBar.thumb=darken($ScrollBar.track,10%) -ScrollBar.hoverTrackColor=darken($ScrollBar.track,3%) -ScrollBar.hoverThumbColor=darken($ScrollBar.thumb,10%) +ScrollBar.track=lighten(@background,1%,derived noAutoInverse) +ScrollBar.thumb=darken($ScrollBar.track,10%,derived noAutoInverse) +ScrollBar.hoverTrackColor=darken($ScrollBar.track,3%,derived noAutoInverse) +ScrollBar.hoverThumbColor=darken($ScrollBar.thumb,10%,derived noAutoInverse) #---- Separator ---- diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java index 2e9efd7c..25674abf 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java @@ -348,13 +348,20 @@ public class FlatTestFrame boolean explicit = explicitColorsCheckBox.isSelected(); ColorUIResource restoreColor = new ColorUIResource( Color.white ); + LookAndFeel lookAndFeel = UIManager.getLookAndFeel(); + boolean dark = (lookAndFeel instanceof FlatLaf && ((FlatLaf)lookAndFeel).isDark()); + Color magenta = dark ? Color.magenta.darker() : Color.magenta; + Color orange = dark ? Color.orange.darker() : Color.orange; + Color blue = dark ? Color.blue.darker() : Color.blue; + Color green = dark ? Color.green.darker() : Color.green; + updateComponentsRecur( content, (c, type) -> { if( type == "view" || type == "tab" ) { - c.setForeground( explicit ? Color.magenta : restoreColor ); - c.setBackground( explicit ? Color.orange : restoreColor ); + c.setForeground( explicit ? magenta : restoreColor ); + c.setBackground( explicit ? orange : restoreColor ); } else { - c.setForeground( explicit ? Color.blue : restoreColor ); - c.setBackground( explicit ? Color.green : restoreColor ); + c.setForeground( explicit ? blue : restoreColor ); + c.setBackground( explicit ? green : restoreColor ); } } ); diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/uidefaults/FlatDarkLaf_1.8.0_202.txt b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/uidefaults/FlatDarkLaf_1.8.0_202.txt index c0c5629f..47fbe940 100644 --- a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/uidefaults/FlatDarkLaf_1.8.0_202.txt +++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/uidefaults/FlatDarkLaf_1.8.0_202.txt @@ -760,20 +760,20 @@ ScrollBar.background #3c3f41 javax.swing.plaf.ColorUIResource [UI] ScrollBar.buttonArrowColor #9a9da1 javax.swing.plaf.ColorUIResource [UI] ScrollBar.buttonDisabledArrowColor #585858 javax.swing.plaf.ColorUIResource [UI] ScrollBar.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI] -ScrollBar.hoverThumbColor #717678 javax.swing.plaf.ColorUIResource [UI] +ScrollBar.hoverThumbColor #6e767a com.formdev.flatlaf.util.DerivedColor [UI] lighten(10%) ScrollBar.hoverThumbWithTrack false -ScrollBar.hoverTrackColor #494c4f javax.swing.plaf.ColorUIResource [UI] +ScrollBar.hoverTrackColor #484c4f com.formdev.flatlaf.util.DerivedColor [UI] lighten(4%) ScrollBar.maximumThumbSize 4096,4096 javax.swing.plaf.DimensionUIResource [UI] ScrollBar.minimumThumbSize 8,8 javax.swing.plaf.DimensionUIResource [UI] ScrollBar.showButtons false ScrollBar.squareButtons false -ScrollBar.thumb #585c5e javax.swing.plaf.ColorUIResource [UI] +ScrollBar.thumb #565c5f com.formdev.flatlaf.util.DerivedColor [UI] lighten(10%) ScrollBar.thumbArc 0 ScrollBar.thumbDarkShadow #7e7e7e javax.swing.plaf.ColorUIResource [UI] ScrollBar.thumbHighlight #242424 javax.swing.plaf.ColorUIResource [UI] ScrollBar.thumbInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI] ScrollBar.thumbShadow #646464 javax.swing.plaf.ColorUIResource [UI] -ScrollBar.track #3f4244 javax.swing.plaf.ColorUIResource [UI] +ScrollBar.track #3e4244 com.formdev.flatlaf.util.DerivedColor [UI] lighten(1%) ScrollBar.trackArc 0 ScrollBar.trackHighlight #7e7e7e javax.swing.plaf.ColorUIResource [UI] ScrollBar.trackInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI] @@ -783,7 +783,7 @@ ScrollBarUI com.formdev.flatlaf.ui.FlatScrollBarUI #---- ScrollPane ---- -ScrollPane.background #3f4244 javax.swing.plaf.ColorUIResource [UI] +ScrollPane.background #3e4244 com.formdev.flatlaf.util.DerivedColor [UI] lighten(1%) ScrollPane.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatBorder [UI] ScrollPane.fillUpperCorner true ScrollPane.font [active] $defaultFont [UI] @@ -1220,7 +1220,7 @@ laf.scaleFactor [active] 1.0 menu #3c3f41 javax.swing.plaf.ColorUIResource [UI] menuText #bbbbbb javax.swing.plaf.ColorUIResource [UI] -scrollbar #3f4244 javax.swing.plaf.ColorUIResource [UI] +scrollbar #3e4244 com.formdev.flatlaf.util.DerivedColor [UI] lighten(1%) #---- swingx/TaskPane ---- diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/uidefaults/FlatLightLaf_1.8.0_202.txt b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/uidefaults/FlatLightLaf_1.8.0_202.txt index 12e2b681..12642abe 100644 --- a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/uidefaults/FlatLightLaf_1.8.0_202.txt +++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/uidefaults/FlatLightLaf_1.8.0_202.txt @@ -762,20 +762,20 @@ ScrollBar.background #f2f2f2 javax.swing.plaf.ColorUIResource [UI] ScrollBar.buttonArrowColor #666666 javax.swing.plaf.ColorUIResource [UI] ScrollBar.buttonDisabledArrowColor #ababab javax.swing.plaf.ColorUIResource [UI] ScrollBar.foreground #000000 javax.swing.plaf.ColorUIResource [UI] -ScrollBar.hoverThumbColor #c3c3c3 javax.swing.plaf.ColorUIResource [UI] +ScrollBar.hoverThumbColor #c3c3c3 com.formdev.flatlaf.util.DerivedColor [UI] darken(10%) ScrollBar.hoverThumbWithTrack false -ScrollBar.hoverTrackColor #ededed javax.swing.plaf.ColorUIResource [UI] +ScrollBar.hoverTrackColor #ededed com.formdev.flatlaf.util.DerivedColor [UI] darken(3%) ScrollBar.maximumThumbSize 4096,4096 javax.swing.plaf.DimensionUIResource [UI] ScrollBar.minimumThumbSize 8,8 javax.swing.plaf.DimensionUIResource [UI] ScrollBar.showButtons false ScrollBar.squareButtons false -ScrollBar.thumb #dcdcdc javax.swing.plaf.ColorUIResource [UI] +ScrollBar.thumb #dcdcdc com.formdev.flatlaf.util.DerivedColor [UI] darken(10%) ScrollBar.thumbArc 0 ScrollBar.thumbDarkShadow #9e9e9e javax.swing.plaf.ColorUIResource [UI] ScrollBar.thumbHighlight #ffffff javax.swing.plaf.ColorUIResource [UI] ScrollBar.thumbInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI] ScrollBar.thumbShadow #c4c4c4 javax.swing.plaf.ColorUIResource [UI] -ScrollBar.track #f5f5f5 javax.swing.plaf.ColorUIResource [UI] +ScrollBar.track #f5f5f5 com.formdev.flatlaf.util.DerivedColor [UI] lighten(1%) ScrollBar.trackArc 0 ScrollBar.trackHighlight #9e9e9e javax.swing.plaf.ColorUIResource [UI] ScrollBar.trackInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI] @@ -785,7 +785,7 @@ ScrollBarUI com.formdev.flatlaf.ui.FlatScrollBarUI #---- ScrollPane ---- -ScrollPane.background #f5f5f5 javax.swing.plaf.ColorUIResource [UI] +ScrollPane.background #f5f5f5 com.formdev.flatlaf.util.DerivedColor [UI] lighten(1%) ScrollPane.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.FlatBorder [UI] ScrollPane.fillUpperCorner true ScrollPane.font [active] $defaultFont [UI] @@ -1222,7 +1222,7 @@ laf.scaleFactor [active] 1.0 menu #f2f2f2 javax.swing.plaf.ColorUIResource [UI] menuText #000000 javax.swing.plaf.ColorUIResource [UI] -scrollbar #f5f5f5 javax.swing.plaf.ColorUIResource [UI] +scrollbar #f5f5f5 com.formdev.flatlaf.util.DerivedColor [UI] lighten(1%) #---- swingx/TaskPane ----