Window decorations: fixed top window border in dark themes when running in JetBrains Runtime (issue #244)

fixed/improved calculation of active border color
This commit is contained in:
Karl Tauber
2021-01-23 16:59:53 +01:00
parent 38301454a6
commit 9015a4d56b
2 changed files with 20 additions and 6 deletions

View File

@@ -18,6 +18,8 @@ FlatLaf Change Log
color is different to default background color, even if component is not color is different to default background color, even if component is not
opaque (which is the default). This paints selection if using the component as opaque (which is the default). This paints selection if using the component as
cell renderer a Table, Tree or List. cell renderer a Table, Tree or List.
- Custom window decorations: Fixed top window border in dark themes when running
in JetBrains Runtime.
## 1.0-rc1 ## 1.0-rc1

View File

@@ -227,7 +227,6 @@ public class JBRCustomDecorations
private final Color defaultActiveBorder = new Color( 0x707070 ); private final Color defaultActiveBorder = new Color( 0x707070 );
private final Color inactiveLightColor = new Color( 0xaaaaaa ); private final Color inactiveLightColor = new Color( 0xaaaaaa );
private final Color inactiveDarkColor = new Color( 0x3f3f3f );
private boolean colorizationAffectsBorders; private boolean colorizationAffectsBorders;
private Color activeColor = defaultActiveBorder; private Color activeColor = defaultActiveBorder;
@@ -273,7 +272,7 @@ public class JBRCustomDecorations
Object colorizationColorBalanceObj = toolkit.getDesktopProperty( "win.dwm.colorizationColorBalance" ); Object colorizationColorBalanceObj = toolkit.getDesktopProperty( "win.dwm.colorizationColorBalance" );
if( colorizationColorBalanceObj instanceof Integer ) { if( colorizationColorBalanceObj instanceof Integer ) {
int colorizationColorBalance = (Integer) colorizationColorBalanceObj; int colorizationColorBalance = (Integer) colorizationColorBalanceObj;
if( colorizationColorBalance < 0 ) if( colorizationColorBalance < 0 || colorizationColorBalance > 100 )
colorizationColorBalance = 100; colorizationColorBalance = 100;
if( colorizationColorBalance == 0 ) if( colorizationColorBalance == 0 )
@@ -283,9 +282,15 @@ public class JBRCustomDecorations
float alpha = colorizationColorBalance / 100.0f; float alpha = colorizationColorBalance / 100.0f;
float remainder = 1 - alpha; float remainder = 1 - alpha;
int r = Math.round( (colorizationColor.getRed() * alpha + 0xD9 * remainder) ); int r = Math.round( colorizationColor.getRed() * alpha + 0xD9 * remainder );
int g = Math.round( (colorizationColor.getGreen() * alpha + 0xD9 * remainder) ); int g = Math.round( colorizationColor.getGreen() * alpha + 0xD9 * remainder );
int b = Math.round( (colorizationColor.getBlue() * alpha + 0xD9 * remainder) ); int b = Math.round( colorizationColor.getBlue() * alpha + 0xD9 * remainder );
// avoid potential IllegalArgumentException in Color constructor
r = Math.min( Math.max( r, 0 ), 255 );
g = Math.min( Math.max( g, 0 ), 255 );
b = Math.min( Math.max( b, 0 ), 255 );
return new Color( r, g, b ); return new Color( r, g, b );
} }
return colorizationColor; return colorizationColor;
@@ -300,7 +305,14 @@ public class JBRCustomDecorations
Window window = SwingUtilities.windowForComponent( c ); Window window = SwingUtilities.windowForComponent( c );
boolean active = (window != null) ? window.isActive() : false; boolean active = (window != null) ? window.isActive() : false;
g.setColor( active ? activeColor : (FlatLaf.isLafDark() ? inactiveDarkColor : inactiveLightColor) ); // paint top border
// - in light themes
// - in dark themes only for active windows if colorization affects borders
boolean paintTopBorder = !FlatLaf.isLafDark() || (active && colorizationAffectsBorders);
if( !paintTopBorder )
return;
g.setColor( active ? activeColor : inactiveLightColor );
HiDPIUtils.paintAtScale1x( (Graphics2D) g, x, y, width, height, this::paintImpl ); HiDPIUtils.paintAtScale1x( (Graphics2D) g, x, y, width, height, this::paintImpl );
} }