diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index 9115a87e..83a1e7e2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -20,7 +20,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.event.MouseListener; +import java.awt.event.MouseEvent; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import javax.swing.JComponent; @@ -53,25 +53,29 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault Slider.trackColor Color * @uiDefault Slider.thumbColor Color * @uiDefault Slider.focusedColor Color optional; defaults to Component.focusColor - * @uiDefault Slider.hoverColor Color optional; defaults to Slider.focusedColor - * @uiDefault Slider.disabledForeground Color used for track and thumb is disabled + * @uiDefault Slider.hoverThumbColor Color optional + * @uiDefault Slider.pressedThumbColor Color optional + * @uiDefault Slider.disabledTrackColor Color + * @uiDefault Slider.disabledThumbColor Color * * @author Karl Tauber */ public class FlatSliderUI extends BasicSliderUI { - private int trackWidth; - private int thumbWidth; + protected int trackWidth; + protected int thumbWidth; - private Color trackColor; - private Color thumbColor; - private Color focusColor; - private Color hoverColor; - private Color disabledForeground; + protected Color trackColor; + protected Color thumbColor; + protected Color focusColor; + protected Color hoverThumbColor; + protected Color pressedThumbColor; + protected Color disabledTrackColor; + protected Color disabledThumbColor; - private MouseListener hoverListener; - private boolean hover; + protected boolean thumbHover; + protected boolean thumbPressed; public static ComponentUI createUI( JComponent c ) { return new FlatSliderUI(); @@ -81,24 +85,6 @@ public class FlatSliderUI super( null ); } - @Override - protected void installListeners( JSlider slider ) { - super.installListeners( slider ); - - hoverListener = new FlatUIUtils.HoverListener( slider, h -> { - hover = h; - } ); - slider.addMouseListener( hoverListener ); - } - - @Override - protected void uninstallListeners( JSlider slider ) { - super.uninstallListeners( slider ); - - slider.removeMouseListener( hoverListener ); - hoverListener = null; - } - @Override protected void installDefaults( JSlider slider ) { super.installDefaults( slider ); @@ -111,8 +97,10 @@ public class FlatSliderUI trackColor = UIManager.getColor( "Slider.trackColor" ); thumbColor = UIManager.getColor( "Slider.thumbColor" ); focusColor = FlatUIUtils.getUIColor( "Slider.focusedColor", "Component.focusColor" ); - hoverColor = FlatUIUtils.getUIColor( "Slider.hoverColor", focusColor ); - disabledForeground = UIManager.getColor( "Slider.disabledForeground" ); + hoverThumbColor = UIManager.getColor( "Slider.hoverThumbColor" ); + pressedThumbColor = UIManager.getColor( "Slider.pressedThumbColor" ); + disabledTrackColor = UIManager.getColor( "Slider.disabledTrackColor" ); + disabledThumbColor = UIManager.getColor( "Slider.disabledThumbColor" ); } @Override @@ -122,8 +110,15 @@ public class FlatSliderUI trackColor = null; thumbColor = null; focusColor = null; - hoverColor = null; - disabledForeground = null; + hoverThumbColor = null; + pressedThumbColor = null; + disabledTrackColor = null; + disabledThumbColor = null; + } + + @Override + protected TrackListener createTrackListener( JSlider slider ) { + return new FlatTrackListener(); } @Override @@ -201,20 +196,17 @@ public class FlatSliderUI } if( coloredTrack != null ) { - g.setColor( FlatUIUtils.deriveColor( FlatUIUtils.isPermanentFocusOwner( slider ) ? focusColor : (hover ? hoverColor : thumbColor), thumbColor ) ); + g.setColor( thumbColor ); ((Graphics2D)g).fill( coloredTrack ); } - g.setColor( enabled ? trackColor : disabledForeground ); + g.setColor( enabled ? trackColor : disabledTrackColor ); ((Graphics2D)g).fill( track ); } @Override public void paintThumb( Graphics g ) { - g.setColor( FlatUIUtils.deriveColor( slider.isEnabled() - ? (FlatUIUtils.isPermanentFocusOwner( slider ) ? focusColor : (hover ? hoverColor : thumbColor)) - : disabledForeground, - thumbColor ) ); + g.setColor( FlatUIUtils.deriveColor( getThumbColor(), thumbColor ) ); if( isRoundThumb() ) g.fillOval( thumbRect.x, thumbRect.y, thumbRect.width, thumbRect.height ); @@ -244,7 +236,73 @@ public class FlatSliderUI } } - private boolean isRoundThumb() { + protected Color getThumbColor() { + if( !slider.isEnabled() ) + return disabledThumbColor; + if( thumbPressed && pressedThumbColor != null ) + return pressedThumbColor; + if( thumbHover && hoverThumbColor != null ) + return hoverThumbColor; + if( FlatUIUtils.isPermanentFocusOwner( slider ) ) + return focusColor; + return thumbColor; + } + + protected boolean isRoundThumb() { return !slider.getPaintTicks() && !slider.getPaintLabels(); } + + //---- class FlatTrackListener -------------------------------------------- + + protected class FlatTrackListener + extends TrackListener + { + @Override + public void mouseEntered( MouseEvent e ) { + setThumbHover( isOverThumb( e ) ); + super.mouseEntered( e ); + } + + @Override + public void mouseExited( MouseEvent e ) { + setThumbHover( false ); + super.mouseExited( e ); + } + + @Override + public void mouseMoved( MouseEvent e ) { + setThumbHover( isOverThumb( e ) ); + super.mouseMoved( e ); + } + + @Override + public void mousePressed( MouseEvent e ) { + setThumbPressed( isOverThumb( e ) ); + super.mousePressed( e ); + } + + @Override + public void mouseReleased( MouseEvent e ) { + setThumbPressed( false ); + super.mouseReleased( e ); + } + + protected void setThumbHover( boolean hover ) { + if( hover != thumbHover ) { + thumbHover = hover; + slider.repaint( thumbRect ); + } + } + + protected void setThumbPressed( boolean pressed ) { + if( pressed != thumbPressed ) { + thumbPressed = pressed; + slider.repaint( thumbRect ); + } + } + + protected boolean isOverThumb( MouseEvent e ) { + return e != null && slider.isEnabled() && thumbRect.contains( e.getX(), e.getY() ); + } + } } 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 93c22262..83a89615 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -240,8 +240,10 @@ Separator.foreground=#515151 Slider.trackColor=#646464 Slider.thumbColor=#A6A6A6 Slider.tickColor=#888 -Slider.hoverColor=darken($Slider.thumbColor,15%,derived) -Slider.disabledForeground=#4c5052 +Slider.hoverThumbColor=darken($Slider.thumbColor,10%,derived) +Slider.pressedThumbColor=darken($Slider.thumbColor,15%,derived) +Slider.disabledTrackColor=#4c5052 +Slider.disabledThumbColor=$Slider.disabledTrackColor #---- SplitPane ---- 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 029a3868..7d96b7e2 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -252,8 +252,10 @@ Separator.foreground=#d1d1d1 Slider.trackColor=#c4c4c4 Slider.thumbColor=#6e6e6e Slider.tickColor=#888 -Slider.hoverColor=lighten($Slider.thumbColor,15%,derived) -Slider.disabledForeground=#c0c0c0 +Slider.hoverThumbColor=lighten($Slider.thumbColor,10%,derived) +Slider.pressedThumbColor=lighten($Slider.thumbColor,15%,derived) +Slider.disabledTrackColor=#c0c0c0 +Slider.disabledThumbColor=$Slider.disabledTrackColor #---- SplitPane ---- diff --git a/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt index f37f4fe6..6dbe410b 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt @@ -841,17 +841,19 @@ SeparatorUI com.formdev.flatlaf.ui.FlatSeparatorUI #---- Slider ---- Slider.background #3c3f41 javax.swing.plaf.ColorUIResource [UI] -Slider.disabledForeground #4c5052 javax.swing.plaf.ColorUIResource [UI] +Slider.disabledThumbColor #4c5052 javax.swing.plaf.ColorUIResource [UI] +Slider.disabledTrackColor #4c5052 javax.swing.plaf.ColorUIResource [UI] Slider.focus #7e7e7e javax.swing.plaf.ColorUIResource [UI] Slider.focusInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI] Slider.font [active] $defaultFont [UI] Slider.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI] Slider.highlight #242424 javax.swing.plaf.ColorUIResource [UI] Slider.horizontalSize 200,21 java.awt.Dimension -Slider.hoverColor #808080 com.formdev.flatlaf.util.DerivedColor [UI] darken(15% autoInverse) +Slider.hoverThumbColor #8d8d8d com.formdev.flatlaf.util.DerivedColor [UI] darken(10% autoInverse) Slider.minimumHorizontalSize 36,21 java.awt.Dimension Slider.minimumVerticalSize 21,36 java.awt.Dimension Slider.onlyLeftMouseButtonDrag true +Slider.pressedThumbColor #808080 com.formdev.flatlaf.util.DerivedColor [UI] darken(15% autoInverse) Slider.shadow #646464 javax.swing.plaf.ColorUIResource [UI] Slider.thumbColor #a6a6a6 javax.swing.plaf.ColorUIResource [UI] Slider.thumbWidth 11 diff --git a/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt index 9d9059b0..526ebb03 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt @@ -846,17 +846,19 @@ SeparatorUI com.formdev.flatlaf.ui.FlatSeparatorUI #---- Slider ---- Slider.background #f2f2f2 javax.swing.plaf.ColorUIResource [UI] -Slider.disabledForeground #c0c0c0 javax.swing.plaf.ColorUIResource [UI] +Slider.disabledThumbColor #c0c0c0 javax.swing.plaf.ColorUIResource [UI] +Slider.disabledTrackColor #c0c0c0 javax.swing.plaf.ColorUIResource [UI] Slider.focus #9e9e9e javax.swing.plaf.ColorUIResource [UI] Slider.focusInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI] Slider.font [active] $defaultFont [UI] Slider.foreground #000000 javax.swing.plaf.ColorUIResource [UI] Slider.highlight #ffffff javax.swing.plaf.ColorUIResource [UI] Slider.horizontalSize 200,21 java.awt.Dimension -Slider.hoverColor #949494 com.formdev.flatlaf.util.DerivedColor [UI] lighten(15% autoInverse) +Slider.hoverThumbColor #888888 com.formdev.flatlaf.util.DerivedColor [UI] lighten(10% autoInverse) Slider.minimumHorizontalSize 36,21 java.awt.Dimension Slider.minimumVerticalSize 21,36 java.awt.Dimension Slider.onlyLeftMouseButtonDrag true +Slider.pressedThumbColor #949494 com.formdev.flatlaf.util.DerivedColor [UI] lighten(15% autoInverse) Slider.shadow #c4c4c4 javax.swing.plaf.ColorUIResource [UI] Slider.thumbColor #6e6e6e javax.swing.plaf.ColorUIResource [UI] Slider.thumbWidth 11 diff --git a/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt index 5e1b71d9..488f902e 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt @@ -833,7 +833,8 @@ SeparatorUI com.formdev.flatlaf.ui.FlatSeparatorUI #---- Slider ---- Slider.background #ccffcc javax.swing.plaf.ColorUIResource [UI] -Slider.disabledForeground #000088 javax.swing.plaf.ColorUIResource [UI] +Slider.disabledThumbColor #888800 javax.swing.plaf.ColorUIResource [UI] +Slider.disabledTrackColor #ffff88 javax.swing.plaf.ColorUIResource [UI] Slider.focus #696969 javax.swing.plaf.ColorUIResource [UI] Slider.focusInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI] Slider.focusedColor #97c3f3 javax.swing.plaf.ColorUIResource [UI] @@ -841,10 +842,11 @@ Slider.font [active] $defaultFont [UI] Slider.foreground #ff0000 javax.swing.plaf.ColorUIResource [UI] Slider.highlight #ffffff javax.swing.plaf.ColorUIResource [UI] Slider.horizontalSize 200,21 java.awt.Dimension -Slider.hoverColor #0000ff javax.swing.plaf.ColorUIResource [UI] +Slider.hoverThumbColor #0000ff javax.swing.plaf.ColorUIResource [UI] Slider.minimumHorizontalSize 36,21 java.awt.Dimension Slider.minimumVerticalSize 21,36 java.awt.Dimension Slider.onlyLeftMouseButtonDrag true +Slider.pressedThumbColor #00ff00 javax.swing.plaf.ColorUIResource [UI] Slider.shadow #a0a0a0 javax.swing.plaf.ColorUIResource [UI] Slider.thumbColor #880000 javax.swing.plaf.ColorUIResource [UI] Slider.thumbWidth 11 diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties index b4e350ba..33437c7c 100644 --- a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties +++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties @@ -261,8 +261,10 @@ Slider.trackColor=#0b0 Slider.thumbColor=#800 Slider.tickColor=#f00 Slider.focusedColor=$Component.focusColor -Slider.hoverColor=#00f -Slider.disabledForeground=#008 +Slider.hoverThumbColor=#00f +Slider.pressedThumbColor=#0f0 +Slider.disabledTrackColor=#ff8 +Slider.disabledThumbColor=#880 #---- SplitPane ---- diff --git a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt index ce120e79..4dc094fb 100644 --- a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt +++ b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt @@ -581,7 +581,8 @@ Separator.stripeIndent Separator.stripeWidth SeparatorUI Slider.background -Slider.disabledForeground +Slider.disabledThumbColor +Slider.disabledTrackColor Slider.focus Slider.focusInputMap Slider.focusInputMap.RightToLeft @@ -590,10 +591,11 @@ Slider.font Slider.foreground Slider.highlight Slider.horizontalSize -Slider.hoverColor +Slider.hoverThumbColor Slider.minimumHorizontalSize Slider.minimumVerticalSize Slider.onlyLeftMouseButtonDrag +Slider.pressedThumbColor Slider.shadow Slider.thumbColor Slider.thumbWidth