Skip to content

Commit 50bc558

Browse files
[JEWEL-818] Make LaF Parsing More Defensive Against Bad Themes
This commit also refactors some minor stuff throughout the code
1 parent 9bae108 commit 50bc558

File tree

7 files changed

+39
-41
lines changed

7 files changed

+39
-41
lines changed

platform/jewel/ide-laf-bridge/api/ide-laf-bridge.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public final class org/jetbrains/jewel/bridge/BridgeUtilsKt {
4141
public static synthetic fun retrieveTextStyle-WdJyH8Q$default (Ljava/lang/String;JJZIJILjava/lang/Object;)Landroidx/compose/ui/text/TextStyle;
4242
public static final fun retrieveTextStyle-tD9LlGs (Ljava/lang/String;Ljava/lang/String;JZIJ)Landroidx/compose/ui/text/TextStyle;
4343
public static synthetic fun retrieveTextStyle-tD9LlGs$default (Ljava/lang/String;Ljava/lang/String;JZIJILjava/lang/Object;)Landroidx/compose/ui/text/TextStyle;
44+
public static final fun safeValue (II)I
45+
public static synthetic fun safeValue$default (IIILjava/lang/Object;)I
46+
public static final fun safeValue-YgX7TsA (FF)F
47+
public static synthetic fun safeValue-YgX7TsA$default (FFILjava/lang/Object;)F
4448
public static final fun toAwtColor-8_81llA (J)Ljava/awt/Color;
4549
public static final fun toComposeColor (Ljava/awt/Color;)J
4650
public static final fun toComposeColorOrUnspecified (Ljava/awt/Color;)J

platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/BridgeUtils.kt

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ import com.intellij.util.ui.JBDimension
4040
import com.intellij.util.ui.JBFont
4141
import com.intellij.util.ui.JBInsets
4242
import com.intellij.util.ui.JBValue
43-
import org.jetbrains.jewel.ui.component.Typography
4443
import java.awt.Dimension
4544
import java.awt.Insets
4645
import javax.swing.UIManager
46+
import org.jetbrains.jewel.ui.component.Typography
4747

4848
private val logger = Logger.getInstance("JewelBridge")
4949

@@ -54,6 +54,7 @@ public fun Color.toAwtColor(): java.awt.Color = java.awt.Color(red, green, blue,
5454
public fun java.awt.Color?.toComposeColorOrUnspecified(): Color = this?.toComposeColor() ?: Color.Unspecified
5555

5656
public fun Dp.safeValue(minimumValue: Dp = 0.dp) = this.coerceAtLeast(minimumValue)
57+
5758
public fun Int.safeValue(minimumValue: Int = 0) = this.coerceAtLeast(minimumValue)
5859

5960
public fun retrieveColor(key: String, default: Color): Color = retrieveColorOrNull(key) ?: default
@@ -117,7 +118,7 @@ public fun Insets.toPaddingValues(): PaddingValues =
117118
start = left.dp.safeValue(),
118119
top = top.dp.safeValue(),
119120
end = right.dp.safeValue(),
120-
bottom = bottom.dp.safeValue()
121+
bottom = bottom.dp.safeValue(),
121122
)
122123
}
123124

@@ -131,32 +132,27 @@ public fun JBInsets.toPaddingValues(): PaddingValues =
131132
start = unscaled.left.dp.safeValue(),
132133
top = unscaled.top.dp.safeValue(),
133134
end = unscaled.right.dp.safeValue(),
134-
bottom = unscaled.bottom.dp.safeValue()
135+
bottom = unscaled.bottom.dp.safeValue(),
135136
)
136137

137138
/**
138139
* Converts a [Dimension] to [DpSize]. If the receiver is a [JBDimension] instance, this function delegates to the
139140
* specific [toDpSize] for it, which is scaling-aware.
140141
*/
141-
public fun Dimension.toDpSize(): DpSize = if (this is JBDimension) {
142-
toDpSize()
143-
} else {
144-
DpSize(
145-
width = width.dp.safeValue(),
146-
height = height.dp.safeValue()
147-
)
148-
}
142+
public fun Dimension.toDpSize(): DpSize =
143+
if (this is JBDimension) {
144+
toDpSize()
145+
} else {
146+
DpSize(width = width.dp.safeValue(), height = height.dp.safeValue())
147+
}
149148

150149
/**
151150
* Converts a [JBDimension] to [DpSize], in a scaling-aware way. This means that the resulting [DpSize] will be
152151
* constructed by first obtaining the unscaled values. This avoids double scaling.
153152
*/
154153
public fun JBDimension.toDpSize(): DpSize {
155154
val scaleFactor = scale(1f)
156-
return DpSize(
157-
width = (width2d() / scaleFactor).dp.safeValue(),
158-
height = (height2d() / scaleFactor).dp.safeValue()
159-
)
155+
return DpSize(width = (width2d() / scaleFactor).dp.safeValue(), height = (height2d() / scaleFactor).dp.safeValue())
160156
}
161157

162158
public fun retrieveArcAsCornerSize(key: String): CornerSize = CornerSize(retrieveIntAsDp(key) / 2)

platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridge.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.ui.text.TextStyle
55
import com.intellij.ide.ui.laf.darcula.DarculaUIUtil
66
import com.intellij.ui.JBColor
77
import com.intellij.util.ui.DirProvider
8+
import javax.swing.UIManager
89
import org.jetbrains.jewel.bridge.dp
910
import org.jetbrains.jewel.bridge.lafName
1011
import org.jetbrains.jewel.bridge.readFromLaF
@@ -18,7 +19,6 @@ import org.jetbrains.jewel.foundation.theme.ThemeIconData
1819
import org.jetbrains.jewel.foundation.util.JewelLogger
1920
import org.jetbrains.jewel.ui.ComponentStyling
2021
import org.jetbrains.jewel.ui.DefaultComponentStyling
21-
import javax.swing.UIManager
2222

2323
private val logger = JewelLogger.getInstance("JewelIntUiBridge")
2424

@@ -102,6 +102,4 @@ internal fun createBridgeComponentStyling(theme: ThemeDefinition): ComponentStyl
102102
}
103103

104104
internal val componentArc: CornerSize
105-
get() = CornerSize(
106-
size = DarculaUIUtil.COMPONENT_ARC.dp.safeValue() / 2
107-
)
105+
get() = CornerSize(size = DarculaUIUtil.COMPONENT_ARC.dp.safeValue() / 2)

platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridgeDropdown.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,7 @@ internal fun readUndecoratedDropdownStyle(menuStyle: MenuStyle): DropdownStyle {
104104
DropdownMetrics(
105105
arrowMinSize = DpSize(arrowWidth, minimumSize.height),
106106
minSize = DpSize(minimumSize.width + arrowWidth, minimumSize.height),
107-
cornerSize = CornerSize(
108-
size = JBUI.CurrentTheme.MainToolbar.Dropdown.hoverArc().dp.safeValue(),
109-
),
107+
cornerSize = CornerSize(size = JBUI.CurrentTheme.MainToolbar.Dropdown.hoverArc().dp.safeValue()),
110108
contentPadding = PaddingValues(3.dp), // from
111109
// com.intellij.ide.ui.laf.darcula.ui.DarculaComboBoxUI.getDefaultComboBoxInsets
112110
borderWidth = 0.dp,

platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridgeMenu.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,7 @@ internal fun readMenuStyle(): MenuStyle {
7676
contentPadding = PaddingValues(vertical = 7.dp, horizontal = 2.dp),
7777
offset = DpOffset(0.dp, 2.dp),
7878
shadowSize = 12.dp,
79-
borderWidth = retrieveIntAsDpOrUnspecified("Popup.borderWidth")
80-
.takeOrElse { 1.dp }
81-
.coerceAtLeast(1.dp),
79+
borderWidth = retrieveIntAsDpOrUnspecified("Popup.borderWidth").takeOrElse { 1.dp }.coerceAtLeast(1.dp),
8280
itemMetrics =
8381
MenuItemMetrics(
8482
selectionCornerSize = CornerSize(JBUI.CurrentTheme.PopupMenu.Selection.ARC.dp.safeValue() / 2),
@@ -96,15 +94,17 @@ internal fun readMenuStyle(): MenuStyle {
9694
retrieveIntAsDpOrUnspecified("PopupMenuSeparator.stripeWidth")
9795
.takeOrElse { 1.dp }
9896
.coerceAtLeast(1.dp),
99-
separatorHeight = retrieveIntAsDpOrUnspecified("PopupMenuSeparator.height")
100-
.takeOrElse { 3.dp }
101-
.coerceAtLeast(3.dp),
97+
separatorHeight =
98+
retrieveIntAsDpOrUnspecified("PopupMenuSeparator.height")
99+
.takeOrElse { 3.dp }
100+
.coerceAtLeast(3.dp),
102101
iconSize = 16.dp,
103-
minHeight = if (isNewUiTheme()) {
104-
JBUI.CurrentTheme.List.rowHeight().dp
105-
} else {
106-
Dp.Unspecified
107-
},
102+
minHeight =
103+
if (isNewUiTheme()) {
104+
JBUI.CurrentTheme.List.rowHeight().dp
105+
} else {
106+
Dp.Unspecified
107+
},
108108
),
109109
submenuMetrics = SubmenuMetrics(offset = DpOffset(0.dp, (-8).dp)),
110110
),

platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridgeScrollbar.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import com.intellij.diagnostic.LoadingState
99
import com.intellij.ide.ui.UISettings
1010
import com.intellij.openapi.util.registry.Registry.Companion.intValue
1111
import com.intellij.ui.ColorUtil
12+
import kotlin.time.Duration
13+
import kotlin.time.Duration.Companion.milliseconds
1214
import org.jetbrains.jewel.bridge.ScrollbarHelper
1315
import org.jetbrains.jewel.bridge.retrieveColor
1416
import org.jetbrains.jewel.bridge.toAwtColor
@@ -19,8 +21,6 @@ import org.jetbrains.jewel.ui.component.styling.ScrollbarStyle
1921
import org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility
2022
import org.jetbrains.jewel.ui.component.styling.TrackClickBehavior
2123
import org.jetbrains.skiko.hostOs
22-
import kotlin.time.Duration
23-
import kotlin.time.Duration.Companion.milliseconds
2424

2525
private val useContrastScrollbars: Boolean
2626
get() = LoadingState.CONFIGURATION_STORE_INITIALIZED.isOccurred && UISettings.getInstance().useContrastScrollbars
@@ -240,11 +240,12 @@ private fun Color.updateTransparency(isDark: Boolean): Color {
240240
if (!useContrastScrollbars) return this
241241

242242
var alpha = intValue("contrast.scrollbars.alpha.level")
243-
alpha = if (alpha > 0) {
244-
Integer.min(alpha, 255)
245-
} else {
246-
if (!isDark) LIGHT_ALPHA else DARK_ALPHA
247-
}
243+
alpha =
244+
if (alpha > 0) {
245+
Integer.min(alpha, 255)
246+
} else {
247+
if (!isDark) LIGHT_ALPHA else DARK_ALPHA
248+
}
248249
return ColorUtil.toAlpha(this.toAwtColor(), alpha).toComposeColor()
249250
}
250251

platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/theme/IntUiBridgeSimpleListItem.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ internal fun readSimpleListItemStyle() =
2828
SimpleListItemMetrics(
2929
innerPadding = JBUI.CurrentTheme.PopupMenu.Selection.innerInsets().toPaddingValues(),
3030
outerPadding = JBUI.CurrentTheme.PopupMenu.Selection.outerInsets().toPaddingValues(),
31-
selectionBackgroundCornerSize = CornerSize(JBUI.CurrentTheme.PopupMenu.Selection.ARC.dp.safeValue() / 2),
31+
selectionBackgroundCornerSize =
32+
CornerSize(JBUI.CurrentTheme.PopupMenu.Selection.ARC.dp.safeValue() / 2),
3233
iconTextGap = 2.dp,
3334
),
3435
)

0 commit comments

Comments
 (0)