From a525fe29dbbbc9f051e4c2b2d44ce6fcd8fb59e3 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 11 Aug 2022 17:02:24 +0200 Subject: [PATCH] Icons: changed icons for FileChooser, OptionPane and Tree to rounded outlined style (issue #543) --- .../flatlaf/icons/FlatCapsLockIcon.java | 15 ++- .../icons/FlatFileChooserDetailsViewIcon.java | 28 +++--- .../icons/FlatFileChooserHomeFolderIcon.java | 18 +++- .../icons/FlatFileChooserListViewIcon.java | 22 +++-- .../icons/FlatFileChooserNewFolderIcon.java | 22 ++++- .../icons/FlatFileChooserUpFolderIcon.java | 16 ++- .../icons/FlatFileViewComputerIcon.java | 21 ++-- .../icons/FlatFileViewDirectoryIcon.java | 26 ++++- .../flatlaf/icons/FlatFileViewFileIcon.java | 27 ++++- .../icons/FlatFileViewFloppyDriveIcon.java | 23 +++-- .../icons/FlatFileViewHardDriveIcon.java | 23 +++-- .../flatlaf/icons/FlatHelpButtonIcon.java | 26 ++--- .../icons/FlatOptionPaneErrorIcon.java | 10 +- .../icons/FlatOptionPaneInformationIcon.java | 10 +- .../icons/FlatOptionPaneQuestionIcon.java | 26 +++-- .../icons/FlatOptionPaneWarningIcon.java | 16 +-- .../flatlaf/icons/FlatTreeClosedIcon.java | 8 +- .../flatlaf/icons/FlatTreeCollapsedIcon.java | 5 +- .../flatlaf/icons/FlatTreeLeafIcon.java | 23 ++++- .../flatlaf/icons/FlatTreeOpenIcon.java | 35 +++++-- .../com/formdev/flatlaf/ui/FlatUIUtils.java | 92 +++++++++++++++++- .../formdev/flatlaf/util/ColorFunctions.java | 13 +++ .../flatlaf/util/TestColorFunctions.java | 6 ++ flatlaf-core/svg/CapsLockIcon.svg | 4 +- .../svg/FileChooserDetailsViewIcon.svg | 14 +-- .../svg/FileChooserHomeFolderIcon.svg | 6 +- flatlaf-core/svg/FileChooserListViewIcon.svg | 8 +- flatlaf-core/svg/FileChooserNewFolderIcon.svg | 5 +- flatlaf-core/svg/FileChooserUpFolderIcon.svg | 5 +- flatlaf-core/svg/FileViewComputerIcon.svg | 5 +- flatlaf-core/svg/FileViewDirectoryIcon.svg | 2 +- flatlaf-core/svg/FileViewFileIcon.svg | 6 +- flatlaf-core/svg/FileViewFloppyDriveIcon.svg | 7 +- flatlaf-core/svg/FileViewHardDriveIcon.svg | 6 +- flatlaf-core/svg/FlatLaf Icons.sketch | Bin 26436 -> 26950 bytes flatlaf-core/svg/FlatLaf.svg | 2 +- flatlaf-core/svg/HelpButtonIcon.svg | 3 +- flatlaf-core/svg/OptionPaneErrorIcon.svg | 4 +- .../svg/OptionPaneInformationIcon.svg | 4 +- flatlaf-core/svg/OptionPaneQuestionIcon.svg | 4 +- flatlaf-core/svg/OptionPaneWarningIcon.svg | 6 +- flatlaf-core/svg/TreeClosedIcon.svg | 2 +- .../svg/TreeCollapsedIcon-chevron.svg | 2 +- flatlaf-core/svg/TreeLeafIcon.svg | 6 +- flatlaf-core/svg/TreeOpenIcon.svg | 5 +- .../com/formdev/flatlaf/demo/FlatLaf.svg | 2 +- .../formdev/flatlaf/themeeditor/FlatLaf.svg | 2 +- 47 files changed, 443 insertions(+), 178 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java index 933f05de..64a26a82 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java @@ -16,9 +16,12 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.Area; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; @@ -63,16 +66,20 @@ public class FlatCapsLockIcon - - + + */ + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + BasicStroke stroke = new BasicStroke( 1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND ); + Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); path.append( new RoundRectangle2D.Float( 0, 0, 16, 16, 6, 6 ), false ); - path.append( new Rectangle2D.Float( 5, 11.5f, 6, 2 ), false ); - path.append( FlatUIUtils.createPath( 2,8, 8,2, 14,8, 11,8, 11,10, 5,10, 5,8 ), false ); + path.append( new Area( stroke.createStrokedShape( new Rectangle2D.Float( 5.5f, 11.5f, 5, 2 ) ) ), false ); + path.append( new Area( stroke.createStrokedShape( FlatUIUtils.createPath( + 2.5,7.5, 8,2, 13.5,7.5, 10.5,7.5, 10.5,9.5, 5.5,9.5, 5.5,7.5, 2.5,7.5 ) ) ), false ); g.fill( path ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserDetailsViewIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserDetailsViewIcon.java index 0a208f69..2f1572ed 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserDetailsViewIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserDetailsViewIcon.java @@ -39,21 +39,25 @@ public class FlatFileChooserDetailsViewIcon /* - - - - - - + + + + + + + + */ - g.fillRect( 2, 3, 2, 2 ); - g.fillRect( 2, 7, 2, 2 ); - g.fillRect( 2, 11, 2, 2 ); - g.fillRect( 6, 3, 8, 2 ); - g.fillRect( 6, 7, 8, 2 ); - g.fillRect( 6, 11, 8, 2 ); + g.fillRoundRect( 2, 3, 2, 1, 1, 1 ); + g.fillRoundRect( 2, 6, 2, 1, 1, 1 ); + g.fillRoundRect( 2, 9, 2, 1, 1, 1 ); + g.fillRoundRect( 2, 12, 2, 1, 1, 1 ); + g.fillRoundRect( 6, 3, 8, 1, 1, 1 ); + g.fillRoundRect( 6, 6, 8, 1, 1, 1 ); + g.fillRoundRect( 6, 9, 8, 1, 1, 1 ); + g.fillRoundRect( 6, 12, 8, 1, 1, 1 ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserHomeFolderIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserHomeFolderIcon.java index 7a2a80f2..adcea5a6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserHomeFolderIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserHomeFolderIcon.java @@ -16,8 +16,10 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -39,10 +41,22 @@ public class FlatFileChooserHomeFolderIcon protected void paintIcon( Component c, Graphics2D g ) { /* - + + + + + */ - g.fill( FlatUIUtils.createPath( 2,8, 8,2, 14,8, 12,8, 12,13, 9,13, 9,10, 7,10, 7,13, 4,13, 4,8 ) ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); + + g.draw( FlatUIUtils.createPath( false, 6.5,13, 6.5,9.5, 9.5,9.5, 9.5,13 ) ); + g.draw( FlatUIUtils.createPath( false, 3.5,6.5, + 3.5,12.5, FlatUIUtils.QUAD_TO, 3.5,13.5, 4.5,13.5, + 11.5,13.5, FlatUIUtils.QUAD_TO, 12.5,13.5, 12.5,12.5, + 12.5,6.5 ) ); + g.draw( FlatUIUtils.createPath( false, 1.5,8.5, 8,2, 14.5,8.5 ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserListViewIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserListViewIcon.java index 9ae70b09..88870ca6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserListViewIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserListViewIcon.java @@ -16,8 +16,11 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.RoundRectangle2D; import javax.swing.UIManager; /** @@ -39,17 +42,20 @@ public class FlatFileChooserListViewIcon /* - - - - + + + + */ - g.fillRect( 3, 3, 4, 4 ); - g.fillRect( 3, 9, 4, 4 ); - g.fillRect( 9, 9, 4, 4 ); - g.fillRect( 9, 3, 4, 4 ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); + + g.draw( new RoundRectangle2D.Float( 2.5f, 2.5f, 4, 4, 2, 2 ) ); + g.draw( new RoundRectangle2D.Float( 2.5f, 9.5f, 4, 4, 2, 2 ) ); + g.draw( new RoundRectangle2D.Float( 9.5f, 9.5f, 4, 4, 2, 2 ) ); + g.draw( new RoundRectangle2D.Float( 9.5f, 2.5f, 4, 4, 2, 2 ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserNewFolderIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserNewFolderIcon.java index a5718b0e..bda7d6de 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserNewFolderIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserNewFolderIcon.java @@ -16,10 +16,13 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; +import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.Line2D; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatUIUtils; /** * "new folder" icon for {@link javax.swing.JFileChooser}. @@ -31,6 +34,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils; public class FlatFileChooserNewFolderIcon extends FlatAbstractIcon { + private final Color greenColor = UIManager.getColor( "Actions.Green" ); + public FlatFileChooserNewFolderIcon() { super( 16, 16, UIManager.getColor( "Actions.Grey" ) ); } @@ -40,13 +45,20 @@ public class FlatFileChooserNewFolderIcon /* - - + + + */ - g.fill( FlatUIUtils.createPath( 2,3, 5.5,3, 7,5, 14,5, 14,8, 11,8, 11,10, 9,10, 9,13, 2,13 ) ); - g.fill( FlatUIUtils.createPath( 14,11, 16,11, 16,13, 14,13, 14,15, 12,15, 12,13, 10,13, 10,11, 12,11, 12,9, 14,9, 14,11 ) ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); + + g.draw( FlatFileViewDirectoryIcon.createFolderPath() ); + + g.setColor( greenColor ); + g.draw( new Line2D.Float( 5.5f, 9, 10.5f, 9 ) ); + g.draw( new Line2D.Float( 8, 6.5f, 8, 11.5f ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserUpFolderIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserUpFolderIcon.java index 0e7d7996..8bb4ba4b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserUpFolderIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserUpFolderIcon.java @@ -16,9 +16,12 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.Line2D; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -44,15 +47,20 @@ public class FlatFileChooserUpFolderIcon /* - - + + + */ - g.fill( FlatUIUtils.createPath( 2,3, 5.5,3, 7,5, 9,5, 9,9, 13,9, 13,5, 14,5, 14,13, 2,13 ) ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); + + g.draw( FlatFileViewDirectoryIcon.createFolderPath() ); g.setColor( blueColor ); - g.fill( FlatUIUtils.createPath( 12,4, 12,8, 10,8, 10,4, 8,4, 11,1, 14,4, 12,4 ) ); + g.draw( new Line2D.Float( 8, 6.5f, 8, 11.5f ) ); + g.draw( FlatUIUtils.createPath( false, 5.5,9, 8,6.5, 10.5,9 ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewComputerIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewComputerIcon.java index 0b7120f4..b3376589 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewComputerIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewComputerIcon.java @@ -16,10 +16,12 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Component; import java.awt.Graphics2D; -import java.awt.geom.Path2D; -import java.awt.geom.Rectangle2D; +import java.awt.RenderingHints; +import java.awt.geom.Line2D; +import java.awt.geom.RoundRectangle2D; import javax.swing.UIManager; /** @@ -41,17 +43,18 @@ public class FlatFileViewComputerIcon /* - - + + + */ - Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); - path.append( new Rectangle2D.Float( 2, 3, 12, 8 ), false ); - path.append( new Rectangle2D.Float( 4, 5, 8, 4 ), false ); - g.fill( path ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); - g.fillRect( 2, 12, 12, 2 ); + g.draw( new RoundRectangle2D.Float( 2.5f, 3.5f, 11, 7, 2, 2 ) ); + g.drawLine( 8, 11, 8, 12 ); + g.draw( new Line2D.Float( 4.5f, 12.5f, 11.5f, 12.5f ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewDirectoryIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewDirectoryIcon.java index 85a59156..6ffc401f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewDirectoryIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewDirectoryIcon.java @@ -18,6 +18,8 @@ package com.formdev.flatlaf.icons; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.Path2D; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -39,10 +41,30 @@ public class FlatFileViewDirectoryIcon protected void paintIcon( Component c, Graphics2D g ) { /* - + */ - g.fill( FlatUIUtils.createPath( 1,2, 6,2, 8,4, 15,4, 15,13, 1,13 ) ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + + g.draw( createFolderPath() ); + } + + static Path2D createFolderPath() { + double arc = 1.5; + double arc2 = 0.5; + return FlatUIUtils.createPath( + // bottom-right + 14.5,13.5-arc, FlatUIUtils.QUAD_TO, 14.5,13.5, 14.5-arc,13.5, + // bottom-left + 1.5+arc,13.5, FlatUIUtils.QUAD_TO, 1.5,13.5, 1.5,13.5-arc, + // top-left + 1.5,2.5+arc, FlatUIUtils.QUAD_TO, 1.5,2.5, 1.5+arc,2.5, + // top-mid-left + 6.5-arc2,2.5, FlatUIUtils.QUAD_TO, 6.5,2.5, 6.5+arc2,2.5+arc2, + // top-mid-right + 8.5,4.5, + // top-right + 14.5-arc,4.5, FlatUIUtils.QUAD_TO, 14.5,4.5, 14.5,4.5+arc ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFileIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFileIcon.java index 69dac58a..f2ef9eb4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFileIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFileIcon.java @@ -16,8 +16,10 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -39,14 +41,29 @@ public class FlatFileViewFileIcon protected void paintIcon( Component c, Graphics2D g ) { /* - - - + + + */ - g.fill( FlatUIUtils.createPath( 8,6, 8,1, 13,1, 13,15, 3,15, 3,6 ) ); - g.fill( FlatUIUtils.createPath( 3,5, 7,5, 7,1 ) ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); + + double arc = 1.5; + g.draw( FlatUIUtils.createPath( + // top-left + 2.5,1.5+arc, FlatUIUtils.QUAD_TO, 2.5,1.5, 2.5+arc,1.5, + // top-right + 8.8,1.5, 13.5,6.2, + // bottom-right + 13.5,14.5-arc, FlatUIUtils.QUAD_TO, 13.5,14.5, 13.5-arc,14.5, + // bottom-left + 2.5+arc,14.5, FlatUIUtils.QUAD_TO, 2.5,14.5, 2.5,14.5-arc ) ); + + g.draw( FlatUIUtils.createPath( false, 8.5,2, + 8.5,6.5-arc, FlatUIUtils.QUAD_TO, 8.5,6.5, 8.5+arc,6.5, + 13,6.5 ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFloppyDriveIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFloppyDriveIcon.java index 94c58cf6..2203c314 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFloppyDriveIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFloppyDriveIcon.java @@ -16,9 +16,10 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Component; import java.awt.Graphics2D; -import java.awt.geom.Path2D; +import java.awt.RenderingHints; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -40,18 +41,22 @@ public class FlatFileViewFloppyDriveIcon protected void paintIcon( Component c, Graphics2D g ) { /* - - - + + + + */ - Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); - path.append( FlatUIUtils.createPath( 11,14, 11,11, 5,11, 5,14, 2,14, 2,2, 14,2, 14,14, 11,14 ), false ); - path.append( FlatUIUtils.createPath( 4,4, 4,8, 12,8, 12,4, 4,4 ), false ); - g.fill( path ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); - g.fillRect( 6, 12, 4, 2 ); + g.draw( FlatUIUtils.createPath( 3.5,2.5, 11.5,2.5, 11.5,2.5, 13.5,4.5, + 13.5,12.5, FlatUIUtils.QUAD_TO, 13.5,13.5, 12.5,13.5, + 3.5,13.5, FlatUIUtils.QUAD_TO, 2.5,13.5, 2.5,12.5, + 2.5,3.5, FlatUIUtils.QUAD_TO, 2.5,2.5, 3.5,2.5 ) ); + g.draw( FlatUIUtils.createPath( false, 4.5,13, 4.5,9.5, 11.5,9.5, 11.5,13 ) ); + g.draw( FlatUIUtils.createPath( false, 5.5,3, 5.5,5.5, 10.5,5.5, 10.5,3 ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewHardDriveIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewHardDriveIcon.java index 8f635ce9..121aa4bf 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewHardDriveIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewHardDriveIcon.java @@ -16,10 +16,12 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Component; import java.awt.Graphics2D; -import java.awt.geom.Path2D; -import java.awt.geom.Rectangle2D; +import java.awt.RenderingHints; +import java.awt.geom.Ellipse2D; +import java.awt.geom.RoundRectangle2D; import javax.swing.UIManager; /** @@ -40,14 +42,19 @@ public class FlatFileViewHardDriveIcon protected void paintIcon( Component c, Graphics2D g ) { /* - + + + + + */ - Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); - path.append( new Rectangle2D.Float( 2, 6, 12, 4 ), false ); - path.append( new Rectangle2D.Float( 12, 8, 1, 1 ), false ); - path.append( new Rectangle2D.Float( 10, 8, 1, 1 ), false ); - g.fill( path ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); + + g.draw( new RoundRectangle2D.Float( 2.5f, 5.5f, 11, 5, 2, 2 ) ); + g.fill( new Ellipse2D.Float( 10.8f, 7.8f, 1.4f, 1.4f ) ); + g.fill( new Ellipse2D.Float( 8.8f, 7.8f, 1.4f, 1.4f ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java index d415356f..2a274064 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java @@ -17,9 +17,11 @@ package com.formdev.flatlaf.icons; import static com.formdev.flatlaf.util.UIScale.*; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; import java.util.Map; @@ -96,7 +98,8 @@ public class FlatHelpButtonIcon - + + */ @@ -148,21 +151,18 @@ public class FlatHelpButtonIcon // paint question mark Path2D q = new Path2D.Float(); - q.moveTo( 11, 5 ); - q.curveTo( 8.8,5, 7,6.8, 7,9 ); - q.lineTo( 9, 9 ); - q.curveTo( 9,7.9, 9.9,7, 11,7 ); - q.curveTo( 12.1,7, 13,7.9, 13,9 ); - q.curveTo( 13,11, 10,10.75, 10,14 ); - q.lineTo( 12, 14 ); - q.curveTo( 12,11.75, 15,11.5, 15,9 ); - q.curveTo( 15,6.8, 13.2,5, 11,5 ); - q.closePath(); + q.moveTo( 8,8.5 ); + q.curveTo( 8.25,7, 9.66585007,6, 11,6 ); + q.curveTo( 12.5,6, 14,7, 14,8.5 ); + q.curveTo( 14,10.5, 11,11, 11,13 ); + + g2.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g2.setStroke( new BasicStroke( 2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); g2.translate( focusWidth, focusWidth ); g2.setColor( enabled ? questionMarkColor : disabledQuestionMarkColor ); - g2.fill( q ); - g2.fillRect( 10, 15, 2, 2 ); + g2.draw( q ); + g2.fill( new Ellipse2D.Float( 9.8f, 14.8f, 2.4f, 2.4f ) ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneErrorIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneErrorIcon.java index 60c09778..5ff20b42 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneErrorIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneErrorIcon.java @@ -19,7 +19,7 @@ package com.formdev.flatlaf.icons; import java.awt.Shape; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; -import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; /** * "Error" icon for {@link javax.swing.JOptionPane}. @@ -40,8 +40,8 @@ public class FlatOptionPaneErrorIcon - - + + */ @@ -54,8 +54,8 @@ public class FlatOptionPaneErrorIcon @Override protected Shape createInside() { Path2D inside = new Path2D.Float( Path2D.WIND_EVEN_ODD ); - inside.append( new Rectangle2D.Float( 14, 7, 4, 11 ), false ); - inside.append( new Rectangle2D.Float( 14, 21, 4, 4 ), false ); + inside.append( new RoundRectangle2D.Float( 14, 7, 4, 12, 4, 4 ), false ); + inside.append( new Ellipse2D.Float( 14, 21, 4, 4 ), false ); return inside; } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneInformationIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneInformationIcon.java index 4ecee661..452e6fe8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneInformationIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneInformationIcon.java @@ -19,7 +19,7 @@ package com.formdev.flatlaf.icons; import java.awt.Shape; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; -import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; /** * "Information" icon for {@link javax.swing.JOptionPane}. @@ -40,8 +40,8 @@ public class FlatOptionPaneInformationIcon - - + + */ @@ -54,8 +54,8 @@ public class FlatOptionPaneInformationIcon @Override protected Shape createInside() { Path2D inside = new Path2D.Float( Path2D.WIND_EVEN_ODD ); - inside.append( new Rectangle2D.Float( 14, 14, 4, 11 ), false ); - inside.append( new Rectangle2D.Float( 14, 7, 4, 4 ), false ); + inside.append( new RoundRectangle2D.Float( 14, 13, 4, 12, 4, 4 ), false ); + inside.append( new Ellipse2D.Float( 14, 7, 4, 4 ), false ); return inside; } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneQuestionIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneQuestionIcon.java index 0f7e14bd..73104606 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneQuestionIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneQuestionIcon.java @@ -16,10 +16,10 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Shape; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; -import java.awt.geom.Rectangle2D; /** * "Question" icon for {@link javax.swing.JOptionPane}. @@ -40,8 +40,8 @@ public class FlatOptionPaneQuestionIcon - - + + */ @@ -54,20 +54,16 @@ public class FlatOptionPaneQuestionIcon @Override protected Shape createInside() { Path2D q = new Path2D.Float(); - q.moveTo( 14, 20 ); - q.lineTo( 18, 20 ); - q.curveTo( 18, 16, 23, 16, 23, 12 ); - q.curveTo( 23, 8, 20, 6, 16, 6 ); - q.curveTo( 12, 6, 9, 8, 9, 12 ); - q.curveTo( 9, 12, 13, 12, 13, 12 ); - q.curveTo( 13, 10, 14, 9, 16, 9 ); - q.curveTo( 18, 9, 19, 10, 19, 12 ); - q.curveTo( 19, 15, 14, 15, 14, 20 ); - q.closePath(); + q.moveTo( 11.5,11.75 ); + q.curveTo( 11.75,9.5, 13.75,8, 16,8 ); + q.curveTo( 18.25,8, 20.5,9.5, 20.5,11.75 ); + q.curveTo( 20.5,14.75, 16,15.5, 16,19 ); + + BasicStroke stroke = new BasicStroke( 3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER ); Path2D inside = new Path2D.Float( Path2D.WIND_EVEN_ODD ); - inside.append( new Rectangle2D.Float( 14, 22, 4, 4 ), false ); - inside.append( q, false ); + inside.append( new Ellipse2D.Float( 14.3f, 22.3f, 3.4f, 3.4f ), false ); + inside.append( stroke.createStrokedShape( q ), false ); return inside; } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneWarningIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneWarningIcon.java index edac6586..fa2eaa88 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneWarningIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneWarningIcon.java @@ -17,8 +17,9 @@ package com.formdev.flatlaf.icons; import java.awt.Shape; +import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; -import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -39,23 +40,24 @@ public class FlatOptionPaneWarningIcon /* - - - + + + */ @Override protected Shape createOutside() { - return FlatUIUtils.createPath( 16,2, 31,28, 1,28 ); + return FlatUIUtils.createRoundTrianglePath( 16,0, 32,28, 0,28, 4 ); + } @Override protected Shape createInside() { Path2D inside = new Path2D.Float( Path2D.WIND_EVEN_ODD ); - inside.append( new Rectangle2D.Float( 14, 10, 4, 8 ), false ); - inside.append( new Rectangle2D.Float( 14, 21, 4, 4 ), false ); + inside.append( new RoundRectangle2D.Float( 14, 8, 4, 11, 4, 4 ), false ); + inside.append( new Ellipse2D.Float( 14, 21, 4, 4 ), false ); return inside; } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java index c149bb9c..ca19812e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java @@ -18,8 +18,8 @@ package com.formdev.flatlaf.icons; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatUIUtils; /** * "closed" icon for {@link javax.swing.JTree} used by {@link javax.swing.tree.DefaultTreeCellRenderer}. @@ -41,10 +41,12 @@ public class FlatTreeClosedIcon /* - + */ - g.fill( FlatUIUtils.createPath( 1,2, 6,2, 8,4, 15,4, 15,13, 1,13 ) ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + + g.draw( FlatFileViewDirectoryIcon.createFolderPath() ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java index 9d76c9c4..e7139ec2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java @@ -16,9 +16,11 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.geom.Path2D; import java.util.function.Function; import javax.swing.JTree; import javax.swing.SwingUtilities; @@ -59,7 +61,8 @@ public class FlatTreeCollapsedIcon if( chevron ) { // chevron arrow - g.fill( FlatUIUtils.createPath( 3,1, 3,2.5, 6,5.5, 3,8.5, 3,10, 4.5,10, 9,5.5, 4.5,1 ) ); + g.setStroke( new BasicStroke( 1f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER ) ); + g.draw( FlatUIUtils.createPath( false, 3.5,1.5, 7.5,5.5, 3.5,9.5 ) ); } else { // triangle arrow g.fill( FlatUIUtils.createPath( 2,1, 2,10, 10,5.5 ) ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java index b85ccbb1..397fa7cf 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java @@ -16,10 +16,14 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.Line2D; +import java.awt.geom.RoundRectangle2D; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.ColorFunctions; /** * "leaf" icon for {@link javax.swing.JTree} used by {@link javax.swing.tree.DefaultTreeCellRenderer}. @@ -42,13 +46,22 @@ public class FlatTreeLeafIcon /* - - + + + + */ - g.fill( FlatUIUtils.createPath( 8,6, 8,1, 13,1, 13,15, 3,15, 3,6 ) ); - g.fill( FlatUIUtils.createPath( 3,5, 7,5, 7,1 ) ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) ); + + g.draw( new RoundRectangle2D.Float( 2.5f, 1.5f, 11, 13, 3, 3 ) ); + + g.setColor( ColorFunctions.fade( g.getColor(), 0.6f ) ); + g.draw( new Line2D.Float( 5.5f, 5.5f, 10.5f, 5.5f ) ); + g.draw( new Line2D.Float( 5.5f, 8, 10.5f, 8 ) ); + g.draw( new Line2D.Float( 5.5f, 10.5f, 10.5f, 10.5f ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java index e2ca5213..456412e6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java @@ -16,8 +16,10 @@ package com.formdev.flatlaf.icons; +import java.awt.BasicStroke; import java.awt.Component; import java.awt.Graphics2D; +import java.awt.RenderingHints; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatUIUtils; @@ -41,14 +43,35 @@ public class FlatTreeOpenIcon /* - - - - + */ - g.fill( FlatUIUtils.createPath( 1,2, 6,2, 8,4, 14,4, 14,6, 3.5,6, 1,11 ) ); - g.fill( FlatUIUtils.createPath( 4,7, 16,7, 13,13, 1,13 ) ); + g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE ); + g.setStroke( new BasicStroke( 1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER ) ); + + double arc = 1.5; + double arc2 = 0.5; + g.draw( FlatUIUtils.createPath( false, + // bottom-left of opend part + 2,13.5, + // top-left of opend part + FlatUIUtils.ROUNDED, 4.5,7.5, arc, + // top-right of opend part + FlatUIUtils.ROUNDED, 15.5,7.5, arc2, + + // bottom-right + FlatUIUtils.ROUNDED, 13,13.5, arc, + // bottom-left + 1.5+arc,13.5, FlatUIUtils.QUAD_TO, 1.5,13.5, 1.5,13.5-arc, + // top-left + 1.5,2.5+arc, FlatUIUtils.QUAD_TO, 1.5,2.5, 1.5+arc,2.5, + // top-mid-left + 6.5-arc2,2.5, FlatUIUtils.QUAD_TO, 6.5,2.5, 6.5+arc2,2.5+arc2, + // top-mid-right + 8.5,4.5, + // top-right + 13.5-arc,4.5, FlatUIUtils.QUAD_TO, 13.5,4.5, 13.5,4.5+arc, + 13.5,6.5 ) ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java index fd3ddea2..95d30494 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java @@ -38,6 +38,7 @@ import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; +import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import java.util.IdentityHashMap; @@ -765,6 +766,27 @@ public class FlatUIUtils return rect; } + /** + * Creates a rounded triangle shape for the given points and arc radius. + * + * @since 3 + */ + public static Shape createRoundTrianglePath( float x1, float y1, float x2, float y2, + float x3, float y3, float arc ) + { + double averageSideLength = (distance( x1,y1, x2,y2 ) + distance( x2,y2, x3,y3 ) + distance( x3,y3, x1,y1 )) / 3; + double t1 = (1 / averageSideLength) * arc; + double t2 = 1 - t1; + + return createPath( + lerp( x3, x1, t2 ), lerp( y3, y1, t2 ), + QUAD_TO, x1, y1, lerp( x1, x2, t1 ), lerp( y1, y2, t1 ), + lerp( x1, x2, t2 ), lerp( y1, y2, t2 ), + QUAD_TO, x2, y2, lerp( x2, x3, t1 ), lerp( y2, y3, t1 ), + lerp( x2, x3, t2 ), lerp( y2, y3, t2 ), + QUAD_TO, x3, y3, lerp( x3, x1, t1 ), lerp( y3, y1, t1 ) ); + } + /** * Paints a chevron or triangle arrow in the center of the given rectangle. * @@ -874,6 +896,10 @@ debug*/ } debug*/ + /** @since 3 */ public static final double QUAD_TO = Double.MIN_VALUE; + /** @since 3 */ public static final double CURVE_TO = Double.MIN_NORMAL; + /** @since 3 */ public static final double ROUNDED = Double.MAX_VALUE; + /** * Creates a closed path for the given points. */ @@ -887,13 +913,75 @@ debug*/ public static Path2D createPath( boolean close, double... points ) { Path2D path = new Path2D.Float(); path.moveTo( points[0], points[1] ); - for( int i = 2; i < points.length; i += 2 ) - path.lineTo( points[i], points[i + 1] ); + for( int i = 2; i < points.length; ) { + if( points[i] == QUAD_TO ) { + // add quadratic curve + // params: x1, y1, x2, y2 + path.quadTo( points[i + 1], points[i + 2], points[i + 3], points[i + 4] ); + i += 5; + } else if( points[i] == CURVE_TO ) { + // add bezier curve + // params: x1, y1, x2, y2, x3, y3 + path.curveTo( points[i + 1], points[i + 2], points[i + 3], points[i + 4], points[i + 5], points[i + 6] ); + i += 7; + } else if( points[i] == ROUNDED ) { + // add rounded corner + // params: x, y, arc + double x = points[i + 1]; + double y = points[i + 2]; + double arc = points[i + 3]; + + // index of next point + int ip2 = i + 4; + if( points[ip2] == QUAD_TO || points[ip2] == ROUNDED ) + ip2++; + + // previous and next points + Point2D p1 = path.getCurrentPoint(); + double x1 = p1.getX(); + double y1 = p1.getY(); + double x2 = points[ip2]; + double y2 = points[ip2 + 1]; + + double d1 = distance( x, y, x1, y1 ); + double d2 = distance( x, y, x2, y2 ); + double t1 = 1 - ((1 / d1) * arc); + double t2 = (1 / d2) * arc; + + path.lineTo( lerp( x1, x, t1 ), lerp( y1, y, t1 ) ); + path.quadTo( x, y, lerp( x, x2, t2 ), lerp( y, y2, t2 ) ); + + i += 4; + } else { + // add line + // params: x, y + path.lineTo( points[i], points[i + 1] ); + i += 2; + } + } if( close ) path.closePath(); return path; } + /** + * Calculates linear interpolation between two values. + * + * https://en.wikipedia.org/wiki/Linear_interpolation#Programming_language_support + */ + private static double lerp( double v1, double v2, double t ) { + return (v1 * (1 - t)) + (v2 * t); + } + + /** + * Calculates the distance between two points. + */ + private static double distance( double x1, double y1, double x2, double y2 ) { + double dx = x2 - x1; + double dy = y2 - y1; + return Math.sqrt( (dx * dx) + (dy * dy) ); + } + /** * Draws the given shape with disabled stroke normalization. * The x/y coordinates of the shape are translated by a half pixel. diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/ColorFunctions.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/ColorFunctions.java index 913cf6a1..fc5f58d2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/ColorFunctions.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/ColorFunctions.java @@ -105,6 +105,19 @@ public class ColorFunctions return HSLColor.toRGB( hsl[0], hsl[1], hsl[2], alpha ); } + /** + * Set the opacity (alpha) of a color. + * + * @param color base color + * @param amount the amount (in range 0-1) of the new opacity + * @return new color + * @since 3 + */ + public static Color fade( Color color, float amount ) { + int newAlpha = Math.round( 255 * amount ); + return new Color( (color.getRGB() & 0xffffff) | (newAlpha << 24), true ); + } + /** * Returns a color that is a mixture of two colors. *

diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/util/TestColorFunctions.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/util/TestColorFunctions.java index 960ff57a..2c81bfce 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/util/TestColorFunctions.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/util/TestColorFunctions.java @@ -27,6 +27,7 @@ public class TestColorFunctions { @Test void colorFunctions() { + // lighten, darken assertEquals( new Color( 0xff6666 ), ColorFunctions.lighten( Color.red, 0.2f ) ); assertEquals( new Color( 0x990000 ), ColorFunctions.darken( Color.red, 0.2f ) ); @@ -38,6 +39,11 @@ public class TestColorFunctions assertEquals( new Color( 0xffaa00 ), ColorFunctions.spin( Color.red,40 ) ); assertEquals( new Color( 0xff00aa ), ColorFunctions.spin( Color.red,-40 ) ); + // fade + assertEquals( new Color( 0x33ff0000, true ), ColorFunctions.fade( Color.red, 0.2f ) ); + assertEquals( new Color( 0xccff0000, true ), ColorFunctions.fade( Color.red, 0.8f ) ); + assertEquals( new Color( 0xccff0000, true ), ColorFunctions.fade( new Color( 0x10ff0000, true ), 0.8f ) ); + // mix assertEquals( new Color( 0x1ae600 ), ColorFunctions.mix( Color.red, Color.green, 0.1f ) ); assertEquals( new Color( 0x40bf00 ), ColorFunctions.mix( Color.red, Color.green, 0.25f ) ); diff --git a/flatlaf-core/svg/CapsLockIcon.svg b/flatlaf-core/svg/CapsLockIcon.svg index a81e218e..b58b8922 100644 --- a/flatlaf-core/svg/CapsLockIcon.svg +++ b/flatlaf-core/svg/CapsLockIcon.svg @@ -1,7 +1,7 @@ - - + + diff --git a/flatlaf-core/svg/FileChooserDetailsViewIcon.svg b/flatlaf-core/svg/FileChooserDetailsViewIcon.svg index dda96e57..4f636e2e 100644 --- a/flatlaf-core/svg/FileChooserDetailsViewIcon.svg +++ b/flatlaf-core/svg/FileChooserDetailsViewIcon.svg @@ -1,10 +1,12 @@ - - - - - - + + + + + + + + diff --git a/flatlaf-core/svg/FileChooserHomeFolderIcon.svg b/flatlaf-core/svg/FileChooserHomeFolderIcon.svg index e2599d40..46492757 100644 --- a/flatlaf-core/svg/FileChooserHomeFolderIcon.svg +++ b/flatlaf-core/svg/FileChooserHomeFolderIcon.svg @@ -1,3 +1,7 @@ - + + + + + diff --git a/flatlaf-core/svg/FileChooserListViewIcon.svg b/flatlaf-core/svg/FileChooserListViewIcon.svg index 069275e1..f073e1e1 100644 --- a/flatlaf-core/svg/FileChooserListViewIcon.svg +++ b/flatlaf-core/svg/FileChooserListViewIcon.svg @@ -1,8 +1,8 @@ - - - - + + + + diff --git a/flatlaf-core/svg/FileChooserNewFolderIcon.svg b/flatlaf-core/svg/FileChooserNewFolderIcon.svg index 59c59a83..ce472205 100644 --- a/flatlaf-core/svg/FileChooserNewFolderIcon.svg +++ b/flatlaf-core/svg/FileChooserNewFolderIcon.svg @@ -1,6 +1,7 @@ - - + + + diff --git a/flatlaf-core/svg/FileChooserUpFolderIcon.svg b/flatlaf-core/svg/FileChooserUpFolderIcon.svg index f5a072ef..fa6c07d6 100644 --- a/flatlaf-core/svg/FileChooserUpFolderIcon.svg +++ b/flatlaf-core/svg/FileChooserUpFolderIcon.svg @@ -1,6 +1,7 @@ - - + + + diff --git a/flatlaf-core/svg/FileViewComputerIcon.svg b/flatlaf-core/svg/FileViewComputerIcon.svg index 910f29f3..280b3303 100644 --- a/flatlaf-core/svg/FileViewComputerIcon.svg +++ b/flatlaf-core/svg/FileViewComputerIcon.svg @@ -1,6 +1,7 @@ - - + + + diff --git a/flatlaf-core/svg/FileViewDirectoryIcon.svg b/flatlaf-core/svg/FileViewDirectoryIcon.svg index d01b4331..111c03ee 100644 --- a/flatlaf-core/svg/FileViewDirectoryIcon.svg +++ b/flatlaf-core/svg/FileViewDirectoryIcon.svg @@ -1,3 +1,3 @@ - + diff --git a/flatlaf-core/svg/FileViewFileIcon.svg b/flatlaf-core/svg/FileViewFileIcon.svg index 81f06450..d8e8e328 100644 --- a/flatlaf-core/svg/FileViewFileIcon.svg +++ b/flatlaf-core/svg/FileViewFileIcon.svg @@ -1,6 +1,6 @@ - - - + + + diff --git a/flatlaf-core/svg/FileViewFloppyDriveIcon.svg b/flatlaf-core/svg/FileViewFloppyDriveIcon.svg index e07ed776..1a348053 100644 --- a/flatlaf-core/svg/FileViewFloppyDriveIcon.svg +++ b/flatlaf-core/svg/FileViewFloppyDriveIcon.svg @@ -1,6 +1,7 @@ - - - + + + + diff --git a/flatlaf-core/svg/FileViewHardDriveIcon.svg b/flatlaf-core/svg/FileViewHardDriveIcon.svg index 7dce2914..f8bd1d48 100644 --- a/flatlaf-core/svg/FileViewHardDriveIcon.svg +++ b/flatlaf-core/svg/FileViewHardDriveIcon.svg @@ -1,3 +1,7 @@ - + + + + + diff --git a/flatlaf-core/svg/FlatLaf Icons.sketch b/flatlaf-core/svg/FlatLaf Icons.sketch index acca1c77e79eb29aeb3ae862ef2493a5ffdf5b52..53678d63363f5b410c4f0daceaa3a2526fe84af9 100644 GIT binary patch literal 26950 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�^pUuU0ddfm7A9q6?$w>nwQ=*!TaZN*DM z$FfCB^YUa0IJme9^70t>XDcA#qzZgU$LJO?MX!e&*Sm`;HCQxn8-1gSvNF0wNZ?1q z2B$(&Zi9(8yIF7Za$SfkVHXi;ul>>PW=r5nd+i-JL+*3rsYS|mG@nZ8nn z8QHb2AXKhpb3t@p-1b5k%~Gx%2gG3~!n!duJPd2SUd;zVg!G?-JhU}6Ww!cai9#@Z zawdX!9G2b3#h3e&J8l|jIeBaB`O%6GDaUE|-w;mgH^bP1!Q=wp@OB+EuTR$0+<%Yc zc8B9FUDtaa8E|lO7gD^oLPr`x-{Uc?2VzUf$J26$+-9O9Ml0fwq$w_($jvBd*Bpp0 zN~pm0*(N<$2`QX2PvIB~P5dusTwi|N&Gtgs2*agOPG$iS3eE?kV)c|zVq0NeA;)dHZo~vWXGemJ4weGEqqo2(Bm6r7mHB{Uw~YK(B?+&RuLwJo2Zx z4eQlSOupIx;MCyXb~Y%uiWKdoYx)etSPu2obH1-UaEgIxL6Tw0QV9|A}`_148i3h`vz0r){@z zJr^9BSA-0c8hUZoOAbVi-q5XacnaUTNS`Vt~)7z$2< z^JZ)E%9JH@{hi12h!n~d!y@ZRQREB~YJ$G8au>#PQbk|CQvorTEWG00oPAEdt3riv zNf0EUBvbfPr!Pm6cuox57rnQ}UiG_9G;JH$|W^Hw{9$5DCPpN1&W*G`&RT5oHtM)U4Z z+H=-DiRJ^jNuSXN7P0E6GRLY}Str#_B-Lp4biX$c!(H_PgfBn3| zSW=gTR1HH9uZ6SHNvV5Y>ipVPGZ}mF2VRIxlFLL2h_kZGF;UaRottK_D1Tlsn@h}j zGez-_AP35(Vt7o|UB}W)esI>2ol{UB*BLM;2T-4+*k$}x?la@;cDCuB>cOtKp;i*R6 zaD5&6D_Cuni&+Xh&67=Yv?nlw+L~{4u)$NgNGHmrJ{WGpvRm{`=aGWT@6q#dNjmqd zSXEw2tf%>6VXtGOvdYRhb~K?d6PHd@0nfwvbeAguS|s`f72a0aITODMw$I?}gSqiK z^?CiLX)Uz{Uhj=8s+A&Ba{K~!CKTdUemCwQ7NloE;T13u4zC8iV0OE{EX8x2QdzIjItaX10H=vy(hj& zZ??!#t85aVzQ>J2b|-wl*5-e4vlTy;?X^nbmE0dklfS%dR9x{nfOVq)X(0BQ5Phr- zi!p#Uvo@M6v9fU!6Xr;$=a88#?pH4&{Ng!6P2$!9*n}_SxG3Oz__JRYhZ%z)nGJ*1 zxFW1Y{ea~0xGX0RG%t>;>f&F`oi`}4Jxfa_X$Bd3prSpqN#Vy zbII}Iux7k(-tP`pyp>5N{HPsTT+QOY8Of^YVHlgFCIgi-E=x)xbel~ddp;`}UY~0- zFK^&1s5ewfH>VkG#}CM`gH-0FAjYuLTu{KdUJt>G%EZ;9rYDwnYQ5Aw=(VS&C*a+ivy_>F@D+3mpvxBqpxA<5+TB-+ z(Pz0g%k~M*IE8cNtl9S^;GR2;H8tQ#+(@k_#LVDk`?u4(H@`zcff>|0D7h^%3K^Wd zT`b~gUNqb23iWhdu_F+bW&%72JO)4uHc9`)CaPuwP=}NgaLWna`TyahXD3Wbd`N^7v$6^)skS`}lUI zg|IC8f&Lq0{qqkvhs36G>2Ibo^JFQJp<$rO#!B@8Gh}hJ-D`46e7<<2*qUU33B}tM z(QjTFO$4DNkA-E@NOkaTR6WdX7Xxn+tw@o~S;BpWm}?pnNWHrA=W4xy89ItA##Z9v zwT)CP#s*?VBOJ`hJT+gf4VH0|dAMn{tVoiS()7n)b03E(rIE(7*I=^iGUrJQGuz!a zD+FhF_-M=Vk6TRce2J;LUi*|I@pSW{tfHbYD~p=)wG}of{grh3Rg{YSs*_Nc8Jkyj z46Qg|wdImgG5b<||9cJVdadQjYOBXA&rI{#nVTpO@LhPMaB5D_?tV*(r6Su}R>_HwEgDP8IGf;{dA`vIzXV~ftL z0WPAwCVn2rPrxgE7LBE}XVvDqw>~#mmGi8mvd3-r$K-;=k}UjzXo6WE{R#DM3cY&= z1qNHfI`Mx{t*=u@+vF*_G}unDSb6;f0gQ9=;a|LPy* z$*vT5fX?x7>&a*1*&u`I96Y8o3^!fO4&URZ-Mv04=jmCiBySVj_fF6apS|30*$BAL zbwe|Koc85vrSY#MU@_<$hAiFjs^3X0Y--TL#FZaZUD=`J1t2=~>orG47%Q1NMKX`* z9yan08A%2YHWL)n;5+?J;wLcj%8NUGDu|&4wCiD?W&unBZr38+&k#8Q$ zfD3D6RzL>N9!bcHH!d!Vf1=!r9JwS1EG{kmEq`S5OXGyEdHD%P{%lgS@X4cd6fik8QIPs8v& zP&KFL`>h9|^`Mg?V_ckAxF3*^39a=_%nAL7)kygLwRo;JLeB`W$zlg+V4_>L6Pe1V zTRt=u{a!=*TI;@y;LXvuFeTy5VCCu2@_!VaxVHt0|1_q_wv$wl7zhrQWl@lnbu>*K z9&hRpLF@5pPM&riDc5Ts<*eizrWSAxP+(+p`%XrVcszv~7Dp1o*inELW%PRDelI_M zuOkRq-Yd#E13%sF_B)uFK?Sw=GnVTyPPL(fVgS!W#WWLN_H55ZTgC{8 zUL>}uF+qnsMic9#V4}k3I)Ze#B&?Gu?EF=+(D=pq#BPaIM4-VGYLow=RMU2n%3)@l z5*bRbRY5-CnEg^ZF5yCPw;$oYf^j++P%8qY$4_y&srsXDoh`T3A5UgDlkLI}%ZjL4 zlSdd%YmNslVF<)^hM-ODq?z)x=~hOPN{jh=ybbGSdK;+lBT;%dYz5y8+QiVkk;u^D z-#qZ`(wh9o9{0PdK;7@}q)A9f+EOsFuxz&n67%va<1qc%g@a@%ri$G~n`Od(UiOKR zkdYnaY0?UPdirS4;_dqFBX7$e8NMkx#U_F;vY_3oj^oBH-2JIywY^O_M>&zboA2y2g?=6u{=~!R-^#ujIkk8p?am6MTbXp5IJz0FeTX=uws$Mi|OZ? zGj`kY0-K!vx6PmW1`jh;qtzl%N~FKml542S7J`yU3qFq$iz%*NH}r6g0!%2A|QD&3USQ6#=7u3vJmj%!e}hdCora-<|rTFz}YdmI8I6c1WAe#JL z;|!QErBEdeiYNI%-%9aGM~PXDMctWF;lrMgVwo+pH=7^2(LM+Gl31jgotfaGhy`VE z#J3$1%*?shi0?^&5u~yw!Ha~(!siX9=K(CX9(at#XoP1bS)g+4@f7Q8hK#&4prJ;78%Okq^cbangA3F*mg|#Fxh?@z zHG}^pPh}Iz-W{ArOqw?t6vN$>faCm~8eaoYMHTrXI;u12I&W)jqCh<-lBx-x$dldD zi+VR(-7Pzvb8z7kO^TZJcw2JGXOW`tXW2(}$X4*Dz62gSH(AS^1|hjnt|dzpVifP) zDx?>pS|M;@SWv{B2NN#*qGEd%y?_hDb}qk-h~YvnCix){2QCaxua7jb!G&JpSMwQ^ z@ch!w40jE9cV{=NdMyag*9>{Rn@8VKpw(e!Z3oXUd|^E%CrxiD8vaG>b(g+-9T$za87Q?=iY1Iu^DQrBsyJwS8dpbic|Ql`l!B*7yRP*-g4HZ=kJsV>9yULs ze^V~@JA z*kG?BNhd~}T#k)=Dv$g8a?YD?ugCW=2qjZ{+C{aC;Y}BQxIhu%7vl!EKx|X4XFwQn z^DANhhCiS+=Q<4Gk9(!s&|d?pn8ICBV$;Dk0s6}XRZ8I!Sq_>Wg9NPiKF!_@RV9bb zJK<=O783{t4FUP|wCHHUUHD|OuWY2IFoRkvM2EPbmxMjY8|(7qoAi4p(&2LPQp-{@ zIb4Fd(USL~6?gU1V-7bHo#2fo>!pBpT&0$ogMCLFDt?hy8wsrPrEU`l&$Be5t^^j{ zB%hPb|1fcb7wh@_@^P9+r4KW4^R=-lmr-05KXAZ3m9pGPNv_MB>s>-~UY_H_t7=OS zqseFEg4vZC&}0P67TF@a1sz&hTTd2}#TNziw)T=d(KABejd3$rBox8DXGV)V#i%*W zqT^_1DF&7KTi0m)RQfXGB_Z(lD-mvkyEk=CGedVfL~-v|sy#$o&o|z~Crr7^Ek^tH zm!`m;>B=n64#5b;u0aW-HVuhsrq00B*7ZQz74N2^I>50;umi zB=x8Z@<~;V0Uia%#v_KPQ*MR!zJ5cptAR_*$3+!Odj~UX&5F=zhbrB869GS=fsv*_+~GygD86}h>Tewkk_>Mz zYS?CS7Ivbny|wq)fD)Fkp0?*@6DnS>GBQhm4+UHoHW6cQ(w$*1vDmUs_n`k87W|<< z6Oo{*7>KlAL&;)^7 z3VABrZM++11|FsIzlbS_~@nG&LO`xtSEL-j*kDUbB&`Wy7IjXqt20_m;S^f}n@51?4N(L`Ob% zJ^(v^JkE%1!!_u>#0Sb9*$cUjmGJn<6NweMwc`p*O)<*FI>E;PZMFSL7U6^d#=;^K ziH0-1igfcjtMMM$UA#=`3Iz!gBGTzC<>vfCDx2%A@rl#7;USBpzTDr{e6JcE0XulK zFFK?f#DYuQ?(#mD2Z5KT3{exhnM+ z-e`NnD2JSc=Rq@Gjj3Sz<+1Q*DUZ6J6!-P}is_dAzv}iXpOq<3|42DMxrokuEpgu_ z9)W!DAGs<0bet@(`I5tQm{eb&L`&i^@2&sZ**)@1ZSDgbO~uTbTJ`X5D0CyfUt@F( zuU6?Ss!tQbhgIjw669L&Ho1B0_?~FirJ{n@+^f~8Y{32`$0WCG#$NnfE_Uud_g+T0 z&ZhcltF;2dzVUT5rp@mKaoG&3XMbVtC4HE_#I*ObpOVsEk&wo1-z8@Ol>+$Z3!$H& zyK&vv$4$wrNl~g#EGy5N)kC|eT|bSnU=s>ktx4)jSfuJsf{u4Z)^Jq-s!36a5^{SOMky2@`}h&=1=TXrjmcJ7_L#aCXGD6BIhyu zYK5deQ9-?v?bY75PPMO9v0}k+yz*Bzpmv(o1)`o> zlO&5}3AKWGVQXKjtE)c`u`c04x7!_aB?B(=Zyv2yuP+*K&>Y;8)x>Y{9MObCTFzXG zE)V*N2NMOa`N|H$;&k_T3^s!PI2A-I4(B9t*VT!>Q-~97B$f zp%#;B=fz;_EW+C%GRsx>{K&H;&j%yES1x0Nx04~b;1FQ$ydcf2rqCX z75PXDC*o#mO?&p!Xt{R(s>^Ho5M5ejiKX%RjH&Luk{UN$mBz+v?JF!n#F9~z1dnCL=W4MMLQR`Cft zz5JKur01eD!MIBBHi@+wFmaiH%z;w94q9z468b)QOrS;`MkVi>>mXZ_C3l%Wf?k9F z<{?0vU}tw)5-Fy(n0r|sQZW-Ln-p_4qn3zrkX*VWYGS_1TB{U(q{O26>v=mt-{byg z;#Av&T6Ma>{MQr?n1y2qKgrZt_G*5h^5R^)CTBcNF>JPawLXf{bm0Yij@>(9xxBt^ z|GerET+J2FZ<`&8vlf^;%&_l|E-b-?ya_mxjUW`i6CmpS#$Vd;&%oxYj-&kUT!y6= zT_@-^5?0|PDA}}*DsWr44ECm{UN(6T2z@W9v;t+~)#Bq`L$vf7q3o{EmmXq0=|3UHc!4h2zG7JRvgJMI%TMdEZJvLr<@r#g z9K0P$(_WfH?~}3r@#axF^Ae_d8nPq{JlAy0-=edKlC8^ipHs`dDgW#MHIIJd`EW;a z$j|QcJAMjAwo6o0Y!DAM@!lAf2m1k$oJJDyj=>P@|fBpV;2lxX>caEcX|NgqBq z*og%cslPuaJrOXA_R&UKGGB#sh~mJJD7->t_}3uN-6CwR*|vszB9r_*)c;}qiphK^ zT!O4fIFD3Pi;b_~ZO|W8WFaFK!l_Blzavs79Kl4oBD@wIEDqr$?K`hWS%J4b#F2s( z=8P=)dc`ZUT5PVO;pTx2<)Y>S=d6pBxb`-hmN?gvt@#qW{-rJN~b8I{1VF0!?)*z{jpB2NZetx zZ{D^r6`nWtvA3)n$Y0Joo&KFANwl+9+$5&NI(j}lOBiW32liV4%p2d$oyh@gp2$fhfIVbvYsUl%BP|AfZous4N7}%@`4qhYy}3Glwu0MO5tQUqWh-UO zg4ItKS8_U*4_Wd{TBWc`G2ma`)}j| z(*MWWy8i_G&(%Kv4K^%`fbhT9{`?o%|76ep3--^0UitrS-BwpY{cFNTK!u-*@UPyp I{`>U50Fyp<6aWAK literal 26436 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 diff --git a/flatlaf-core/svg/FlatLaf.svg b/flatlaf-core/svg/FlatLaf.svg index 41c42936..0c3d1462 100644 --- a/flatlaf-core/svg/FlatLaf.svg +++ b/flatlaf-core/svg/FlatLaf.svg @@ -6,7 +6,7 @@ - + diff --git a/flatlaf-core/svg/HelpButtonIcon.svg b/flatlaf-core/svg/HelpButtonIcon.svg index c1b89884..6faf7cff 100644 --- a/flatlaf-core/svg/HelpButtonIcon.svg +++ b/flatlaf-core/svg/HelpButtonIcon.svg @@ -2,6 +2,7 @@ - + + diff --git a/flatlaf-core/svg/OptionPaneErrorIcon.svg b/flatlaf-core/svg/OptionPaneErrorIcon.svg index 500286c3..83356238 100644 --- a/flatlaf-core/svg/OptionPaneErrorIcon.svg +++ b/flatlaf-core/svg/OptionPaneErrorIcon.svg @@ -1,7 +1,7 @@ - - + + diff --git a/flatlaf-core/svg/OptionPaneInformationIcon.svg b/flatlaf-core/svg/OptionPaneInformationIcon.svg index f418a778..a4d71164 100644 --- a/flatlaf-core/svg/OptionPaneInformationIcon.svg +++ b/flatlaf-core/svg/OptionPaneInformationIcon.svg @@ -1,7 +1,7 @@ - - + + diff --git a/flatlaf-core/svg/OptionPaneQuestionIcon.svg b/flatlaf-core/svg/OptionPaneQuestionIcon.svg index a4de4ac0..3960c088 100644 --- a/flatlaf-core/svg/OptionPaneQuestionIcon.svg +++ b/flatlaf-core/svg/OptionPaneQuestionIcon.svg @@ -1,7 +1,7 @@ - - + + diff --git a/flatlaf-core/svg/OptionPaneWarningIcon.svg b/flatlaf-core/svg/OptionPaneWarningIcon.svg index 30a91c7a..eda21225 100644 --- a/flatlaf-core/svg/OptionPaneWarningIcon.svg +++ b/flatlaf-core/svg/OptionPaneWarningIcon.svg @@ -1,7 +1,7 @@ - - - + + + diff --git a/flatlaf-core/svg/TreeClosedIcon.svg b/flatlaf-core/svg/TreeClosedIcon.svg index d01b4331..111c03ee 100644 --- a/flatlaf-core/svg/TreeClosedIcon.svg +++ b/flatlaf-core/svg/TreeClosedIcon.svg @@ -1,3 +1,3 @@ - + diff --git a/flatlaf-core/svg/TreeCollapsedIcon-chevron.svg b/flatlaf-core/svg/TreeCollapsedIcon-chevron.svg index ba0218ff..e4c50a2a 100644 --- a/flatlaf-core/svg/TreeCollapsedIcon-chevron.svg +++ b/flatlaf-core/svg/TreeCollapsedIcon-chevron.svg @@ -1,3 +1,3 @@ - + diff --git a/flatlaf-core/svg/TreeLeafIcon.svg b/flatlaf-core/svg/TreeLeafIcon.svg index 81f06450..6a96ba02 100644 --- a/flatlaf-core/svg/TreeLeafIcon.svg +++ b/flatlaf-core/svg/TreeLeafIcon.svg @@ -1,6 +1,8 @@ - - + + + + diff --git a/flatlaf-core/svg/TreeOpenIcon.svg b/flatlaf-core/svg/TreeOpenIcon.svg index 0ae3582d..f241eedc 100644 --- a/flatlaf-core/svg/TreeOpenIcon.svg +++ b/flatlaf-core/svg/TreeOpenIcon.svg @@ -1,6 +1,3 @@ - - - - + diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/FlatLaf.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/FlatLaf.svg index 41c42936..0c3d1462 100644 --- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/FlatLaf.svg +++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/FlatLaf.svg @@ -6,7 +6,7 @@ - + diff --git a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLaf.svg b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLaf.svg index 61569fce..e587c6f7 100644 --- a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLaf.svg +++ b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLaf.svg @@ -6,7 +6,7 @@ - +