diff --git a/build.gradle.kts b/build.gradle.kts index d9c727c8b..5c262c993 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -171,7 +171,7 @@ intellijPlatform { VerifyPluginTask.FailureLevel.COMPATIBILITY_PROBLEMS, // VerifyPluginTask.FailureLevel.DEPRECATED_API_USAGES, // https://github.com/flutter/flutter-intellij/issues/7718 // VerifyPluginTask.FailureLevel.SCHEDULED_FOR_REMOVAL_API_USAGES, -// VerifyPluginTask.FailureLevel.EXPERIMENTAL_API_USAGES, + VerifyPluginTask.FailureLevel.EXPERIMENTAL_API_USAGES, // VerifyPluginTask.FailureLevel.INTERNAL_API_USAGES, // VerifyPluginTask.FailureLevel.OVERRIDE_ONLY_API_USAGES, VerifyPluginTask.FailureLevel.NON_EXTENDABLE_API_USAGES, diff --git a/src/io/flutter/toolwindow/ToolWindowBadgeUpdater.java b/src/io/flutter/toolwindow/ToolWindowBadgeUpdater.java index 871114efe..70fde6b50 100644 --- a/src/io/flutter/toolwindow/ToolWindowBadgeUpdater.java +++ b/src/io/flutter/toolwindow/ToolWindowBadgeUpdater.java @@ -10,22 +10,20 @@ import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowId; import com.intellij.openapi.wm.ToolWindowManager; -import com.intellij.ui.BadgeIcon; import io.flutter.run.common.RunMode; import io.flutter.run.daemon.FlutterApp; -import java.awt.Color; -import java.awt.Paint; +import javax.swing.*; +import java.awt.*; import java.util.Objects; -import javax.swing.Icon; public class ToolWindowBadgeUpdater { - public static final Paint BADGE_PAINT = Color.decode("#5ca963"); + public static final Color BADGE_PAINT = Color.decode("#5ca963"); /** * Updates the tool window icons for RUN or DEBUG mode with a green badge. * - * @param app The FlutterApp instance running in a given mode. + * @param app The FlutterApp instance running in a given mode. * @param project The current IntelliJ project context. */ public static void updateBadgedIcon(FlutterApp app, Project project) { @@ -33,24 +31,60 @@ public static void updateBadgedIcon(FlutterApp app, Project project) { final ToolWindow runToolWindow = manager.getToolWindow(ToolWindowId.RUN); final ToolWindow debugToolWindow = manager.getToolWindow(ToolWindowId.DEBUG); - if(Objects.requireNonNull(app).getMode() == RunMode.RUN) { + if (Objects.requireNonNull(app).getMode() == RunMode.RUN) { if (runToolWindow != null) { manager.invokeLater(() -> { Icon baseIcon = AllIcons.Toolwindows.ToolWindowRun; BadgeIcon iconWithBadge = new BadgeIcon(baseIcon, BADGE_PAINT); - runToolWindow.setIcon(iconWithBadge); }); } } - else if(app.getMode() == RunMode.DEBUG) { + else if (app.getMode() == RunMode.DEBUG) { manager.invokeLater(() -> { Icon baseIcon = AllIcons.Toolwindows.ToolWindowDebugger; BadgeIcon iconWithBadge = new BadgeIcon(baseIcon, BADGE_PAINT); - Objects.requireNonNull(debugToolWindow).setIcon(iconWithBadge); }); } + } + + private static class BadgeIcon implements Icon { + private final Icon baseIcon; + private final Color overlayColor; + private static final float alpha = 1.0F; + + public BadgeIcon(Icon baseIcon, Color overlayColor) { + this.baseIcon = baseIcon; + this.overlayColor = overlayColor; + } + + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + baseIcon.paintIcon(c, g, x, y); + + Graphics2D g2d = (Graphics2D)g.create(); + try { + g2d.translate(x, y); + + g2d.setComposite(AlphaComposite.SrcOver.derive(alpha)); + + g2d.setColor(overlayColor); + g2d.fillRect(0, 0, getIconWidth(), getIconHeight()); + } + finally { + g2d.dispose(); + } + } + + @Override + public int getIconWidth() { + return baseIcon.getIconWidth(); + } + @Override + public int getIconHeight() { + return baseIcon.getIconHeight(); + } } }