From d6525b6a890853614ad0994360ce07b96d2181c9 Mon Sep 17 00:00:00 2001 From: weisj <31143295+weisJ@users.noreply.github.com> Date: Sun, 14 Mar 2021 22:07:29 +0100 Subject: [PATCH] Tooltip: Replace hacky method of keeping a consistent shadow opacity with better approach. Previously we checked whether the window of the tooltip could possibly be painted multiple times and then set a flag to prevent the shadow from being painted more than once. It is a lot easier to simply erase the background with a transparent color. This may also help with #233. --- .../weisj/darklaf/ui/tooltip/DarkToolTipUI.java | 16 +++++++--------- .../darklaf/ui/tooltip/DarkTooltipBorder.java | 7 +------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/tooltip/DarkToolTipUI.java b/core/src/main/java/com/github/weisj/darklaf/ui/tooltip/DarkToolTipUI.java index 566cf44ab..6ddda2ef8 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/tooltip/DarkToolTipUI.java +++ b/core/src/main/java/com/github/weisj/darklaf/ui/tooltip/DarkToolTipUI.java @@ -134,7 +134,13 @@ protected boolean useDecoratedPopup() { @Override public void update(final Graphics g, final JComponent c) { - // Ensures no background is painted. + if (style.isOpqaue()) { + g.setColor(c.getBackground()); + } else { + // Erase background completely. + g.setColor(PaintUtil.TRANSPARENT_COLOR); + } + g.fillRect(0, 0, c.getWidth(), c.getHeight()); paint(g, c); } @@ -419,10 +425,6 @@ public void paintNow(final float fraction) { Window window = SwingUtilities.getWindowAncestor(toolTip); if (DarkUIUtil.isDecorated(window)) return; if (window != null) window.setOpacity(alpha); - Border border = toolTip.getBorder(); - if (border instanceof DarkTooltipBorder) { - ((DarkTooltipBorder) border).setSkipShadow(false); - } } @Override @@ -431,10 +433,6 @@ protected void paintCycleEnd() { Window window = SwingUtilities.getWindowAncestor(toolTip); if (window != null && !DarkUIUtil.isDecorated(window)) { window.setOpacity(alpha); - Border border = toolTip.getBorder(); - if (window.getFocusableWindowState() && border instanceof DarkTooltipBorder) { - ((DarkTooltipBorder) border).setSkipShadow(true); - } } } } diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/tooltip/DarkTooltipBorder.java b/core/src/main/java/com/github/weisj/darklaf/ui/tooltip/DarkTooltipBorder.java index 4d53f59b5..c2a88e851 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/tooltip/DarkTooltipBorder.java +++ b/core/src/main/java/com/github/weisj/darklaf/ui/tooltip/DarkTooltipBorder.java @@ -42,7 +42,6 @@ public class DarkTooltipBorder implements Border, AlignableTooltipBorder { private final DropShadowBorder shadowBorder; private final BubbleBorder bubbleBorder; private final boolean paintShadow; - private boolean skipShadow; private Insets margin; private Alignment alignment; private boolean showPointer; @@ -117,7 +116,7 @@ public void paintBorder(final Component c, final Graphics g, final int x, final adjustInsets(ins); Area innerArea = bubbleBorder.getBubbleArea(x + ins.left, y + ins.top, width - ins.left - ins.right, height - ins.top - ins.bottom, bubbleBorder.getThickness()); - if (!skipShadow && paintShadow) { + if (paintShadow) { paintShadow(c, g, x, y, width, height, innerArea); } Area outerArea = bubbleBorder.getBubbleArea(x + ins.left, y + ins.top, width - ins.left - ins.right, @@ -191,10 +190,6 @@ public int getShadowSize(final Component c) { return shadowBorder.getShadowSize(); } - public void setSkipShadow(final boolean skip) { - this.skipShadow = skip; - } - @Override public Point alignTooltip(final Component c, final Point p, final Alignment align, final Dimension dim, final boolean outside) {