intellij-sdk-code-samples/topics/reference_guide/work_with_icons_and_images.md
Yann Cébron cd23596f6b
223 release (#904)
* api_notable_list_2022.md: update unbundled plugins 2022.3

* element_patterns.md: new sample

* 2022.3 release: update GH links

* 2022.3 release: update GH links, #2

* EP list: initial, change android from GH to JB hosting temporarily + adapt links

* 223 release initial values

* stop recommending PreloadingActivity (internal API now)

* product specific EP lists

* element_patterns.md: minor

* code samples: upgrade

* extension_point_list.md: fix duplicate heading

* sdk_code_guidelines.md: update compatibility values

* spring_extension_point_list.md: update

* 223.7571.182
2022-11-30 20:31:23 +01:00

8.8 KiB

Code: AllIcons

Platform UI Guidelines: Icons list, Icons

Icons and images are used widely by IntelliJ Platform plugins. Plugins need icons mostly for , custom component renderers, , and so on.

Plugin Logos, which represent a plugin itself, have different requirements than icons and images used within a plugin. For more information, see the .

Platform vs. Custom Icons

Plugins should reuse existing platform icons whenever possible. Use Icons list to browse existing icons. Platform icons are located in AllIcons. Icons from plugins are located in corresponding <PLUGIN_NAME>Icons class (e.g., GithubIcons).

If custom icons are required, please refer to detailed design guide.

How to organize and how to use icons?

See Action Basics sample plugin as a reference.

In the case of a Gradle-based project, icons should be placed in the resources folder. If the project is DevKit-based, the recommended approach is to put icons to a dedicated source root marked as Resources Root, say icons or resources.

The getIcon() method of IconLoader can be used to access the icons. The path to the icon passed in as argument to IconLoader.getIcon() must start with leading /.

Then define a class/interface in a top-level package called icons holding icon constants as static fields:

package icons;

public interface MyIcons {
  Icon Action = IconLoader.getIcon("/icons/myAction.png", MyIcons.class);
  Icon Structure = IconLoader.getIcon("/icons/myStructure.png", MyIcons.class);
  Icon FileType = IconLoader.getIcon("/icons/myFileType.png", MyIcons.class);
}

When using Kotlin, fields must be annotated with @JvmField:

package icons

object MyIcons {
  @JvmField
  val Action = IconLoader.getIcon("/icons/myAction.png", javaClass)
  @JvmField
  val Structure = IconLoader.getIcon("/icons/myStructure.png", javaClass)
  @JvmField
  val FileType = IconLoader.getIcon("/icons/myFileType.png", javaClass)
}

Starting with 2021.2, *Icons class is not required to be located in icons package but can use plugin's package: icons.MyIconsmy.plugin.MyIcons.

{style="note"}

Use these constants inside plugin.xml when specifying icon attribute for <action> or extension point, as well in @Presentation icon attribute. Note that the package name icons will be automatically prefixed and must not be specified.

<actions>
  <action
      id="DemoPlugin.DemoAction"
      icon="MyIcons.Action"
      ... />
</actions>

<extensions defaultExtensionNs="com.intellij">
  <toolWindow
      id="CustomStructure"
      icon="MyIcons.Structure"
      ... />
</extensions>

Image Formats

IntelliJ Platform supports Retina displays and has a bundled dark theme called Darcula. Thus, every icon should have a dedicated variant for Retina devices and Darcula theme. In some cases, you can skip dark variants if the original icon looks good under Darcula.

Required icon sizes depend on the usage as listed in the following table:

Usage Icon Size (pixels)
Node, Action, Filetype 16x16
Tool window 13x13
Editor gutter 12x12

SVG Format

SVG (Scalable Vector Graphics) icons are supported since 2018.2.

{style="note"}

As SVG icons can be scaled arbitrarily, they provide better results in HiDPI environments or when used in combination with bigger screen fonts (e.g., in presentation mode).

A base size denoting the size (in the user space) of the rendered image in 1x scale should be provided. The size is set via the width and height attributes omitting the size units. If unspecified, it defaults to 16x16 pixels.

A minimal SVG icon file:

<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
  <rect width="100%" height="100%" fill="green"/>
</svg>

The naming notation used for PNG icons (see below) is still relevant. However, the @2x version of an SVG icon should still provide the same base size. The icon graphics of such an icon can be expressed in more details via double precision. If the icon graphics are simple enough so that it renders perfectly in every scale, then the @2x version can be omitted.

For generating the SVG icons suited for the IntelliJ-based IDEs, you may also use the third-party web tool IntelliJ Icon Generator.

PNG Format

Please consider using SVG icons for optimal results if your plugin targets 2018.2+.

{style="note"}

All icon files must be placed in the same directory following this naming pattern (replace .png with .svg for SVG icons):

  • iconName.png W x H pixels (Will be used on non-Retina devices with default theme)
  • iconName@2x.png 2*W x 2*H pixels (Will be used on Retina devices with default theme)
  • iconName_dark.png W x H pixels (Will be used on non-Retina devices with Darcula theme)
  • iconName@2x_dark.png 2*W x 2*H pixels (Will be used on Retina devices with Darcula theme)

The IconLoader class will load the icon that matches the best depending on the current environment.

Here are examples of toolWindowStructure.png icon representations:

Theme/Resolution File name Image
Default toolWindowStructure.png Tool Window Structure
Darcula toolWindowStructure_dark.png Tool Window Structure, dark
Default + Retina toolWindowStructure@2x.png Tool Window Structure, retina
Darcula + Retina toolWindowStructure@2x_dark.png Tool Window Structure, retina, dark

Animated Icons

Animated icons are a way to show that plugin is now performing some long-time action. For example, when plugin is loading some data.

Any animated icon is a set of frames that loop with some delay.

To create a new animated icon, use the AnimatedIcon. If you want to create an icon where frames follow each other with the same delay, use a constructor that accepts a delay and icons:

AnimatedIcon icon = new AnimatedIcon(500, AllIcons.Ide.Macro.Recording_1, AllIcons.Ide.Macro.Recording_2);

To create an icon from frames with different delays, use AnimatedIcon.Frame. Each frame represents an icon, and a delay until the next frame.

If you want to show somewhere that there is a long process, you can use the predefined AnimatedIcon.Default loader icon. This icon has a larger AnimatedIcon.Big version.

Icon Tooltips

Register resource bundle via com.intellij.iconDescriptionBundle extension point to provide tooltips automatically for all SimpleColoredComponent renderers.

Create icon.<icon-path>.tooltip key in given resource bundle, where <icon-path> is the icon path with leading slash and .svg removed and slashes replaced with dots (e.g., /nodes/class.svgicon.nodes.class.tooltip).