Skip to content

Commit

Permalink
Improve IconKey API to include a classloader (#507)
Browse files Browse the repository at this point in the history
This prevents issues when running in release-mode IDEs, where providing
a classloader is mandatory to successfully load icons.

The icon keys generator script has also been updated to include the
class in each entry. This has been tested in standalone, in the normal
IDE sample mode, and as a built plugin in a release-mode IDE.
  • Loading branch information
rock3r authored Jul 31, 2024
1 parent dae048c commit cde0289
Show file tree
Hide file tree
Showing 21 changed files with 261 additions and 134 deletions.
39 changes: 19 additions & 20 deletions buildSrc/src/main/kotlin/icon-keys-generator.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -216,49 +216,48 @@ open class IconKeysGeneratorTask : DefaultTask() {
.objectBuilder(objectName)
.apply {
for (childHolder in rootHolder.holders) {
generateKotlinCodeInner(childHolder)
generateKotlinCodeInner(childHolder, className)
}

for (key in rootHolder.keys) {
addProperty(
PropertySpec
.builder(key.name.substringAfterLast('.'), keyClassName)
.initializer(
"%L",
"""IntelliJIconKey("${key.oldPath}", "${key.newPath ?: key.oldPath}")""",
).build(),
)
addProperty(buildIconKeyEntry(key, className))
}
}.build(),
)
}.build()
}

private fun TypeSpec.Builder.generateKotlinCodeInner(holder: IconKeyHolder) {
private fun TypeSpec.Builder.generateKotlinCodeInner(holder: IconKeyHolder, rootClassName: ClassName) {
val objectName = holder.name.substringAfterLast('.')
addType(
TypeSpec
.objectBuilder(objectName)
.apply {
for (childHolder in holder.holders) {
generateKotlinCodeInner(childHolder)
generateKotlinCodeInner(childHolder, rootClassName)
}

for (key in holder.keys) {
addProperty(
PropertySpec
.builder(key.name.substringAfterLast('.'), keyClassName)
.initializer(
"%L",
"""IntelliJIconKey("${key.oldPath}", "${key.newPath ?: key.oldPath}")"""
)
.build(),
)
addProperty(buildIconKeyEntry(key, rootClassName))
}
}.build(),
)
}

private fun buildIconKeyEntry(
key: IconKey,
rootClassName: ClassName,
) =
PropertySpec
.builder(key.name.substringAfterLast('.'), keyClassName)
.initializer(
"%L",
"IntelliJIconKey(\"${key.oldPath}\", " +
"\"${key.newPath ?: key.oldPath}\", " +
"${rootClassName.simpleName}::class.java)",
)
.build()

companion object {

private fun Class<*>.getOriginalPathField(): Field = declaredFields.first { it.name == "originalPath" }
Expand Down
3 changes: 2 additions & 1 deletion ide-laf-bridge/api/ide-laf-bridge.api
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ public final class org/jetbrains/jewel/bridge/actionSystem/ProvideDataKt {
}

public final class org/jetbrains/jewel/bridge/icon/IntelliJIconKeyKt {
public static final fun fromPlatformIcon (Lorg/jetbrains/jewel/ui/icon/IntelliJIconKey$Companion;Ljavax/swing/Icon;)Lorg/jetbrains/jewel/ui/icon/IconKey;
public static final fun fromPlatformIcon (Lorg/jetbrains/jewel/ui/icon/IntelliJIconKey$Companion;Ljavax/swing/Icon;Ljava/lang/Class;)Lorg/jetbrains/jewel/ui/icon/IconKey;
public static synthetic fun fromPlatformIcon$default (Lorg/jetbrains/jewel/ui/icon/IntelliJIconKey$Companion;Ljavax/swing/Icon;Ljava/lang/Class;ILjava/lang/Object;)Lorg/jetbrains/jewel/ui/icon/IconKey;
}

public final class org/jetbrains/jewel/bridge/theme/BridgeGlobalColorsKt {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import com.intellij.ui.icons.IconPathProvider
import org.jetbrains.jewel.ui.icon.IconKey
import org.jetbrains.jewel.ui.icon.IntelliJIconKey

public fun IntelliJIconKey.Companion.fromPlatformIcon(icon: javax.swing.Icon): IconKey {
public fun IntelliJIconKey.Companion.fromPlatformIcon(
icon: javax.swing.Icon,
iconClass: Class<*> = icon::class.java,
): IconKey {
check(icon is IconPathProvider) {
"Only icons implementing IconPathsProvider are supported (e.g., coming from AllIcons)"
}
Expand All @@ -15,5 +18,5 @@ public fun IntelliJIconKey.Companion.fromPlatformIcon(icon: javax.swing.Icon): I
}

val newUiPath = icon.expUIPath ?: oldUiPath
return IntelliJIconKey(oldUiPath, newUiPath)
return IntelliJIconKey(oldUiPath, newUiPath, iconClass)
}
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ private fun readCheckboxStyle(): CheckboxStyle {
outlineSelectedFocusedSize = metrics.outlineSelectedFocusedSize,
iconContentGap = metrics.iconContentGap,
),
icons = CheckboxIcons(checkbox = PathIconKey("${iconsBasePath}checkBox.svg")),
icons = CheckboxIcons(checkbox = PathIconKey("${iconsBasePath}checkBox.svg", CheckboxIcons::class.java)),
)
}

Expand Down Expand Up @@ -776,7 +776,7 @@ private fun readRadioButtonStyle(): RadioButtonStyle {
retrieveIntAsDpOrUnspecified("RadioButton.textIconGap")
.takeOrElse { metrics.iconContentGap },
),
icons = RadioButtonIcons(radioButton = PathIconKey("${iconsBasePath}radio.svg")),
icons = RadioButtonIcons(radioButton = PathIconKey("${iconsBasePath}radio.svg", RadioButtonIcons::class.java)),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,19 @@ public fun CheckboxMetrics.Companion.defaults(
)

@Composable
public fun CheckboxIcons.Companion.light(checkbox: IconKey = PathIconKey("com/intellij/ide/ui/laf/icons/intellij/checkBox.svg")): CheckboxIcons =
CheckboxIcons(checkbox)
public fun CheckboxIcons.Companion.light(
checkbox: IconKey =
PathIconKey(
path = "com/intellij/ide/ui/laf/icons/intellij/checkBox.svg",
iconClass = CheckboxIcons::class.java,
),
): CheckboxIcons = CheckboxIcons(checkbox)

@Composable
public fun CheckboxIcons.Companion.dark(checkbox: IconKey = PathIconKey("com/intellij/ide/ui/laf/icons/darcula/checkBox.svg")): CheckboxIcons =
CheckboxIcons(checkbox)
public fun CheckboxIcons.Companion.dark(
checkbox: IconKey =
PathIconKey(
path = "com/intellij/ide/ui/laf/icons/darcula/checkBox.svg",
iconClass = CheckboxIcons::class.java,
),
): CheckboxIcons = CheckboxIcons(checkbox)
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,17 @@ public fun RadioButtonMetrics.Companion.defaults(
)

public fun RadioButtonIcons.Companion.light(
radioButton: IconKey = PathIconKey("com/intellij/ide/ui/laf/icons/intellij/radio.svg"),
radioButton: IconKey =
PathIconKey(
path = "com/intellij/ide/ui/laf/icons/intellij/radio.svg",
iconClass = RadioButtonIcons::class.java,
),
): RadioButtonIcons = RadioButtonIcons(radioButton)

public fun RadioButtonIcons.Companion.dark(radioButton: IconKey = PathIconKey("com/intellij/ide/ui/laf/icons/darcula/radio.svg")): RadioButtonIcons =
RadioButtonIcons(radioButton)
public fun RadioButtonIcons.Companion.dark(
radioButton: IconKey =
PathIconKey(
path = "com/intellij/ide/ui/laf/icons/darcula/radio.svg",
iconClass = RadioButtonIcons::class.java,
),
): RadioButtonIcons = RadioButtonIcons(radioButton)
32 changes: 21 additions & 11 deletions markdown/extension/gfm-alerts/api/gfm-alerts.api
Original file line number Diff line number Diff line change
Expand Up @@ -86,23 +86,23 @@ public abstract interface class org/jetbrains/jewel/markdown/extensions/github/a
public abstract fun getPathEffect ()Landroidx/compose/ui/graphics/PathEffect;
public abstract fun getStrokeCap-KaPHkGw ()I
public abstract fun getTextColor-0d7_KjU ()J
public abstract fun getTitleIconPath ()Ljava/lang/String;
public abstract fun getTitleIconKey ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public abstract fun getTitleIconTint-0d7_KjU ()J
public abstract fun getTitleTextStyle ()Landroidx/compose/ui/text/TextStyle;
}

public final class org/jetbrains/jewel/markdown/extensions/github/alerts/CautionAlertStyling : org/jetbrains/jewel/markdown/extensions/github/alerts/BaseAlertStyling {
public static final field $stable I
public static final field Companion Lorg/jetbrains/jewel/markdown/extensions/github/alerts/CautionAlertStyling$Companion;
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Ljava/lang/String;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Lorg/jetbrains/jewel/ui/icon/IconKey;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun equals (Ljava/lang/Object;)Z
public fun getLineColor-0d7_KjU ()J
public fun getLineWidth-D9Ej5fM ()F
public fun getPadding ()Landroidx/compose/foundation/layout/PaddingValues;
public fun getPathEffect ()Landroidx/compose/ui/graphics/PathEffect;
public fun getStrokeCap-KaPHkGw ()I
public fun getTextColor-0d7_KjU ()J
public fun getTitleIconPath ()Ljava/lang/String;
public fun getTitleIconKey ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public fun getTitleIconTint-0d7_KjU ()J
public fun getTitleTextStyle ()Landroidx/compose/ui/text/TextStyle;
public fun hashCode ()I
Expand All @@ -119,6 +119,16 @@ public final class org/jetbrains/jewel/markdown/extensions/github/alerts/GitHubA
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CustomBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownBlockRenderer;Lorg/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
}

public final class org/jetbrains/jewel/markdown/extensions/github/alerts/GitHubAlertIcons {
public static final field $stable I
public static final field INSTANCE Lorg/jetbrains/jewel/markdown/extensions/github/alerts/GitHubAlertIcons;
public final fun getCaution ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public final fun getImportant ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public final fun getNote ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public final fun getTip ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public final fun getWarning ()Lorg/jetbrains/jewel/ui/icon/IconKey;
}

public final class org/jetbrains/jewel/markdown/extensions/github/alerts/GitHubAlertProcessorExtension : org/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension {
public static final field $stable I
public static final field INSTANCE Lorg/jetbrains/jewel/markdown/extensions/github/alerts/GitHubAlertProcessorExtension;
Expand All @@ -138,15 +148,15 @@ public final class org/jetbrains/jewel/markdown/extensions/github/alerts/GitHubA
public final class org/jetbrains/jewel/markdown/extensions/github/alerts/ImportantAlertStyling : org/jetbrains/jewel/markdown/extensions/github/alerts/BaseAlertStyling {
public static final field $stable I
public static final field Companion Lorg/jetbrains/jewel/markdown/extensions/github/alerts/ImportantAlertStyling$Companion;
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Ljava/lang/String;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Lorg/jetbrains/jewel/ui/icon/IconKey;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun equals (Ljava/lang/Object;)Z
public fun getLineColor-0d7_KjU ()J
public fun getLineWidth-D9Ej5fM ()F
public fun getPadding ()Landroidx/compose/foundation/layout/PaddingValues;
public fun getPathEffect ()Landroidx/compose/ui/graphics/PathEffect;
public fun getStrokeCap-KaPHkGw ()I
public fun getTextColor-0d7_KjU ()J
public fun getTitleIconPath ()Ljava/lang/String;
public fun getTitleIconKey ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public fun getTitleIconTint-0d7_KjU ()J
public fun getTitleTextStyle ()Landroidx/compose/ui/text/TextStyle;
public fun hashCode ()I
Expand All @@ -159,15 +169,15 @@ public final class org/jetbrains/jewel/markdown/extensions/github/alerts/Importa
public final class org/jetbrains/jewel/markdown/extensions/github/alerts/NoteAlertStyling : org/jetbrains/jewel/markdown/extensions/github/alerts/BaseAlertStyling {
public static final field $stable I
public static final field Companion Lorg/jetbrains/jewel/markdown/extensions/github/alerts/NoteAlertStyling$Companion;
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Ljava/lang/String;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Lorg/jetbrains/jewel/ui/icon/IconKey;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun equals (Ljava/lang/Object;)Z
public fun getLineColor-0d7_KjU ()J
public fun getLineWidth-D9Ej5fM ()F
public fun getPadding ()Landroidx/compose/foundation/layout/PaddingValues;
public fun getPathEffect ()Landroidx/compose/ui/graphics/PathEffect;
public fun getStrokeCap-KaPHkGw ()I
public fun getTextColor-0d7_KjU ()J
public fun getTitleIconPath ()Ljava/lang/String;
public fun getTitleIconKey ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public fun getTitleIconTint-0d7_KjU ()J
public fun getTitleTextStyle ()Landroidx/compose/ui/text/TextStyle;
public fun hashCode ()I
Expand All @@ -180,15 +190,15 @@ public final class org/jetbrains/jewel/markdown/extensions/github/alerts/NoteAle
public final class org/jetbrains/jewel/markdown/extensions/github/alerts/TipAlertStyling : org/jetbrains/jewel/markdown/extensions/github/alerts/BaseAlertStyling {
public static final field $stable I
public static final field Companion Lorg/jetbrains/jewel/markdown/extensions/github/alerts/TipAlertStyling$Companion;
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Ljava/lang/String;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Lorg/jetbrains/jewel/ui/icon/IconKey;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun equals (Ljava/lang/Object;)Z
public fun getLineColor-0d7_KjU ()J
public fun getLineWidth-D9Ej5fM ()F
public fun getPadding ()Landroidx/compose/foundation/layout/PaddingValues;
public fun getPathEffect ()Landroidx/compose/ui/graphics/PathEffect;
public fun getStrokeCap-KaPHkGw ()I
public fun getTextColor-0d7_KjU ()J
public fun getTitleIconPath ()Ljava/lang/String;
public fun getTitleIconKey ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public fun getTitleIconTint-0d7_KjU ()J
public fun getTitleTextStyle ()Landroidx/compose/ui/text/TextStyle;
public fun hashCode ()I
Expand All @@ -201,15 +211,15 @@ public final class org/jetbrains/jewel/markdown/extensions/github/alerts/TipAler
public final class org/jetbrains/jewel/markdown/extensions/github/alerts/WarningAlertStyling : org/jetbrains/jewel/markdown/extensions/github/alerts/BaseAlertStyling {
public static final field $stable I
public static final field Companion Lorg/jetbrains/jewel/markdown/extensions/github/alerts/WarningAlertStyling$Companion;
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Ljava/lang/String;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Landroidx/compose/foundation/layout/PaddingValues;FJLandroidx/compose/ui/graphics/PathEffect;ILandroidx/compose/ui/text/TextStyle;Lorg/jetbrains/jewel/ui/icon/IconKey;JJLkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun equals (Ljava/lang/Object;)Z
public fun getLineColor-0d7_KjU ()J
public fun getLineWidth-D9Ej5fM ()F
public fun getPadding ()Landroidx/compose/foundation/layout/PaddingValues;
public fun getPathEffect ()Landroidx/compose/ui/graphics/PathEffect;
public fun getStrokeCap-KaPHkGw ()I
public fun getTextColor-0d7_KjU ()J
public fun getTitleIconPath ()Ljava/lang/String;
public fun getTitleIconKey ()Lorg/jetbrains/jewel/ui/icon/IconKey;
public fun getTitleIconTint-0d7_KjU ()J
public fun getTitleTextStyle ()Landroidx/compose/ui/text/TextStyle;
public fun hashCode ()I
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public class GitHubAlertBlockRenderer(
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
val titleIconProvider = styling.titleIconPath
val titleIconProvider = styling.titleIconKey
if (titleIconProvider != null) {
val colorFilter =
remember(styling.titleIconTint) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.jetbrains.jewel.markdown.extensions.github.alerts

import org.jetbrains.jewel.ui.icon.IconKey
import org.jetbrains.jewel.ui.icon.PathIconKey

public object GitHubAlertIcons {
public val Note: IconKey =
PathIconKey(
path = "icons/markdown/extensions/github/alerts/alert-note.svg",
iconClass = GitHubAlertIcons::class.java,
)
public val Tip: IconKey =
PathIconKey(
path = "icons/markdown/extensions/github/alerts/alert-tip.svg",
iconClass = GitHubAlertIcons::class.java,
)
public val Important: IconKey =
PathIconKey(
path = "icons/markdown/extensions/github/alerts/alert-important.svg",
iconClass = GitHubAlertIcons::class.java,
)
public val Warning: IconKey =
PathIconKey(
path = "icons/markdown/extensions/github/alerts/alert-warning.svg",
iconClass = GitHubAlertIcons::class.java,
)
public val Caution: IconKey =
PathIconKey(
path = "icons/markdown/extensions/github/alerts/alert-caution.svg",
iconClass = GitHubAlertIcons::class.java,
)
}
Loading

0 comments on commit cde0289

Please sign in to comment.