From 619a4ef265f05304b341dd16ac0c75b84cf3a421 Mon Sep 17 00:00:00 2001 From: Jannis Weis <31143295+weisJ@users.noreply.github.com> Date: Mon, 20 Nov 2023 20:14:26 +0100 Subject: [PATCH] Draw border of popupmenu with corner radius on macos --- .../components/border/RoundedLineBorder.java | 62 +++++++++++++++++++ .../ui/popupmenu/DarkPopupMenuBorder.java | 9 +-- .../weisj/darklaf/nativelaf/mac.properties | 2 +- .../darklaf/nativelaf/windows11.properties | 1 - .../weisj/darklaf/ui/popupMenu.properties | 5 +- 5 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 core/src/main/java/com/github/weisj/darklaf/components/border/RoundedLineBorder.java diff --git a/core/src/main/java/com/github/weisj/darklaf/components/border/RoundedLineBorder.java b/core/src/main/java/com/github/weisj/darklaf/components/border/RoundedLineBorder.java new file mode 100644 index 00000000..db0f0657 --- /dev/null +++ b/core/src/main/java/com/github/weisj/darklaf/components/border/RoundedLineBorder.java @@ -0,0 +1,62 @@ +/* + * MIT License + * + * Copyright (c) 2023 Jannis Weis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.github.weisj.darklaf.components.border; + +import java.awt.*; + +import javax.swing.border.Border; + +import com.github.weisj.darklaf.graphics.PaintUtil; + +public class RoundedLineBorder implements Border { + + private final Color color; + private final int arc; + private final int thickness; + + public RoundedLineBorder(final Color color, final int arc, final int thickness) { + this.color = color; + this.arc = arc; + this.thickness = thickness; + } + + @Override + public void paintBorder(final Component c, final Graphics g, final int x, final int y, final int width, + final int height) { + g.setColor(color); + if (arc == 0) { + PaintUtil.drawRect(g, new Rectangle(x, y, width, height), thickness); + } else { + ((Graphics2D) g).setStroke(new BasicStroke(thickness)); + PaintUtil.paintLineBorder((Graphics2D) g, x, y, width, height, arc); + } + } + + @Override + public Insets getBorderInsets(final Component c) { + return new Insets(thickness, thickness, thickness, thickness); + } + + @Override + public boolean isBorderOpaque() { + return false; + } +} diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/popupmenu/DarkPopupMenuBorder.java b/core/src/main/java/com/github/weisj/darklaf/ui/popupmenu/DarkPopupMenuBorder.java index c58580ec..67fe31bc 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/popupmenu/DarkPopupMenuBorder.java +++ b/core/src/main/java/com/github/weisj/darklaf/ui/popupmenu/DarkPopupMenuBorder.java @@ -27,16 +27,17 @@ import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.plaf.UIResource; -import com.github.weisj.darklaf.components.border.MutableLineBorder; +import com.github.weisj.darklaf.components.border.RoundedLineBorder; import com.github.weisj.darklaf.ui.util.DarkUIUtil; /** @author Jannis Weis */ public class DarkPopupMenuBorder extends CompoundBorder implements UIResource { public DarkPopupMenuBorder() { - super(new MutableLineBorder( - UIManager.getInsets("PopupMenu.borderInsets"), - UIManager.getColor("PopupMenu.borderColor")), + super(new RoundedLineBorder( + UIManager.getColor("PopupMenu.borderColor"), + UIManager.getInt("PopupMenu.borderRadius"), + UIManager.getInt("PopupMenu.borderThickness")), new EmptyBorder(DarkUIUtil.notNullOrElse( UIManager.getInsets("PopupMenu.border.margins"), new Insets(0, 0, 0, 0)))); diff --git a/core/src/main/resources/com/github/weisj/darklaf/nativelaf/mac.properties b/core/src/main/resources/com/github/weisj/darklaf/nativelaf/mac.properties index 18c12078..049eb8dd 100644 --- a/core/src/main/resources/com/github/weisj/darklaf/nativelaf/mac.properties +++ b/core/src/main/resources/com/github/weisj/darklaf/nativelaf/mac.properties @@ -65,7 +65,7 @@ Menu.arrowHover.icon = navigation/arrow/thick/arrowRightH kerning.blockList = [Table.font] -PopupMenu.borderInsets = 1,1,1,1 +PopupMenu.borderRadius = 18 PopupMenu.border.margins = 5,3,5,3 PopupMenuDivider.insets = 5,5,5,5 PopupMenuDivider.size = 9,9 diff --git a/core/src/main/resources/com/github/weisj/darklaf/nativelaf/windows11.properties b/core/src/main/resources/com/github/weisj/darklaf/nativelaf/windows11.properties index 43b955fe..af73b677 100644 --- a/core/src/main/resources/com/github/weisj/darklaf/nativelaf/windows11.properties +++ b/core/src/main/resources/com/github/weisj/darklaf/nativelaf/windows11.properties @@ -32,7 +32,6 @@ Tooltip.borderRadius = %arc RootPane.frameBorder = com.github.weisj.darklaf.ui.rootpane.PlainRootPaneBorder -PopupMenu.borderInsets = 1,1,1,1 PopupMenu.border.margins = 5,3,5,3 PopupMenuDivider.insets = 5,5,5,5 PopupMenuDivider.size = 9,9 diff --git a/core/src/main/resources/com/github/weisj/darklaf/ui/popupMenu.properties b/core/src/main/resources/com/github/weisj/darklaf/ui/popupMenu.properties index 4ee968c5..e4e4103e 100644 --- a/core/src/main/resources/com/github/weisj/darklaf/ui/popupMenu.properties +++ b/core/src/main/resources/com/github/weisj/darklaf/ui/popupMenu.properties @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2019-2021 Jannis Weis +# Copyright (c) 2019-2023 Jannis Weis # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -25,6 +25,7 @@ PopupMenuUI = com.github.weisj.darklaf.ui.popupmenu.DarkP PopupMenu.border = com.github.weisj.darklaf.ui.popupmenu.DarkPopupMenuBorder PopupMenu.translucentBackground = %backgroundContainer PopupMenu.borderColor = %borderSecondary -PopupMenu.borderInsets = 1,1,1,1 +PopupMenu.borderThickness = 1 +PopupMenu.borderRadius = 0 PopupMenu.defaultLightWeightPopups = true PopupMenuDivider.size = 3,3