From 09542f830964ff48ab3bb34bb62b5d82dcc27765 Mon Sep 17 00:00:00 2001 From: Stanislav Alekseev Date: Thu, 2 Jul 2026 22:59:14 +0400 Subject: [PATCH] [settingsDialog] IJPL-247005 replace new badge in settings tree with a blue dot (cherry picked from commit 7f6a40da3d4ab2faee2488b69869bbd32b521f3f) IJ-CR-213851 GitOrigin-RevId: 84b33cc9be5df893d6443dbb25c314f89b5a082b --- .../options/newEditor/SettingsTreeView.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java index 8dc790d8110a..2ee01a9f926d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java @@ -109,6 +109,7 @@ import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; +import java.awt.RenderingHints; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; @@ -116,6 +117,7 @@ import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; +import java.awt.geom.Ellipse2D; import java.io.IOException; import java.util.ArrayDeque; import java.util.ArrayList; @@ -138,6 +140,7 @@ public class SettingsTreeView extends JComponent implements Accessible, Disposab private static final String NODE_ICON = "settings.tree.view.icon"; private static final Color WRONG_CONTENT = JBColor.namedColor("Tree.errorForeground", JBColor.RED); private static final Color MODIFIED_CONTENT = JBColor.namedColor("Tree.modifiedItemForeground", JBColor.BLUE); + private static final Icon NEW_BADGE_DOT = new LargeBlueDotIcon(); private final SimpleTree myTree; @@ -791,7 +794,7 @@ public class SettingsTreeView extends JComponent implements Accessible, Disposab if (node != null && node.hasNewOptions() && (leaf || !expanded)) { if (shouldShowNewBadge(configurable)) { - setRightIcon(Badge.newBadge); + setRightIcon(NEW_BADGE_DOT); myAccessibleBadgeText = IdeBundle.message("badge.text.new"); } } @@ -930,6 +933,39 @@ public class SettingsTreeView extends JComponent implements Accessible, Disposab return ConfigurableWrapper.cast(Configurable.Promo.class, c); } + private static final class LargeBlueDotIcon implements Icon { + private static final int ICON_HEIGHT = 16; + private static final int DOT_DIAMETER = 6; + + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + Graphics2D g2 = (Graphics2D)g.create(); + try { + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + float diameter = JBUIScale.scale((float)DOT_DIAMETER); + float dotX = x + (getIconWidth() - diameter) / 2.0f; + float dotY = y + (getIconHeight() - diameter) / 2.0f; + + g2.setColor(JBUI.CurrentTheme.IconBadge.INFORMATION); + g2.fill(new Ellipse2D.Float(dotX, dotY, diameter, diameter)); + } + finally { + g2.dispose(); + } + } + + @Override + public int getIconWidth() { + return JBUIScale.scale(DOT_DIAMETER); + } + + @Override + public int getIconHeight() { + return JBUIScale.scale(ICON_HEIGHT); + } + } + private static boolean hasNewOptions(@NotNull Configurable configurable) { if (isNewOptions(configurable)) { return true;