Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,27 @@ internal fun readScrollbarStyle(isDark: Boolean): ScrollbarStyle =
scrollbarVisibility = readScrollbarVisibility(),
)

internal fun readTabStripScrollbarStyle(isDark: Boolean): ScrollbarStyle =
ScrollbarStyle(
colors = readScrollbarColors(isDark),
metrics = readScrollbarMetrics(),
trackClickBehavior = TrackClickBehavior.JumpToSpot,
scrollbarVisibility =
ScrollbarVisibility.AlwaysVisible(
trackThickness = 5.dp,
trackThicknessExpanded = 5.dp,
trackPadding = PaddingValues(1.dp),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Including on the sides?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the value used in swing is JBUI.insets(1) (which is all sides)

trackPaddingExpanded = PaddingValues(),
trackPaddingWithBorder = PaddingValues(1.dp),
trackColorAnimationDuration = 125.milliseconds,
expandAnimationDuration = 125.milliseconds,
thumbColorAnimationDuration = 125.milliseconds,
lingerDuration = 700.milliseconds,
scrollbarBackgroundColorLight = Color.Unspecified,
scrollbarBackgroundColorDark = Color.Unspecified,
),
)

private fun readScrollbarColors(isDark: Boolean) =
if (hostOs.isMacOS) {
readScrollbarMacColors(isDark)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ internal fun readDefaultTabStyle(): TabStyle {
contentHovered = 1f,
contentSelected = 1f,
),
scrollbarStyle = readScrollbarStyle(isDark),
scrollbarStyle = readTabStripScrollbarStyle(isDark),
)
}

Expand Down Expand Up @@ -122,6 +122,6 @@ internal fun readEditorTabStyle(): TabStyle {
contentHovered = 1f,
contentSelected = 1f,
),
scrollbarStyle = readScrollbarStyle(isDark),
scrollbarStyle = readTabStripScrollbarStyle(isDark),
)
}
2 changes: 2 additions & 0 deletions platform/jewel/int-ui/int-ui-standalone/api-dump.txt
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,8 @@ f:org.jetbrains.jewel.intui.standalone.styling.IntUiScrollbarStylingKt
- bs:macOsLight$default(org.jetbrains.jewel.ui.component.styling.ScrollbarStyle$Companion,org.jetbrains.jewel.ui.component.styling.ScrollbarColors,org.jetbrains.jewel.ui.component.styling.ScrollbarMetrics,org.jetbrains.jewel.ui.component.styling.TrackClickBehavior,org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.ScrollbarStyle
- sf:macOsLight-zwkVjRg(org.jetbrains.jewel.ui.component.styling.ScrollbarColors$Companion,J,J,J,J,J,J,J,J,J,J,J,J):org.jetbrains.jewel.ui.component.styling.ScrollbarColors
- bs:macOsLight-zwkVjRg$default(org.jetbrains.jewel.ui.component.styling.ScrollbarColors$Companion,J,J,J,J,J,J,J,J,J,J,J,J,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.ScrollbarColors
- sf:tabStrip-FbBwQsc(org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$Companion,F,F,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,J,J,J,J):org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility
- bs:tabStrip-FbBwQsc$default(org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$Companion,F,F,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,J,J,J,J,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility
- sf:windowsAndLinux-TZvXluI(org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$WhenScrolling$Companion,F,F,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,J,J,J,J):org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$WhenScrolling
- bs:windowsAndLinux-TZvXluI$default(org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$WhenScrolling$Companion,F,F,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,J,J,J,J,I,java.lang.Object):org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$WhenScrolling
- sf:windowsAndLinux-tYhzLtE(org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$AlwaysVisible$Companion,F,androidx.compose.foundation.layout.PaddingValues,J,J):org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$AlwaysVisible
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ public fun AlwaysVisible.Companion.macOs(
*/
public fun AlwaysVisible.Companion.windowsAndLinux(
trackThickness: Dp = 10.dp,
trackPadding: PaddingValues = PaddingValues(0.dp),
trackPadding: PaddingValues = PaddingValues(),
thumbColorAnimationDuration: Duration = 330.milliseconds,
trackColorAnimationDuration: Duration = thumbColorAnimationDuration,
): AlwaysVisible =
Expand Down Expand Up @@ -508,8 +508,8 @@ public fun WhenScrolling.Companion.macOs(
public fun WhenScrolling.Companion.windowsAndLinux(
trackThickness: Dp = 10.dp,
trackThicknessExpanded: Dp = 10.dp,
trackPadding: PaddingValues = PaddingValues(0.dp),
trackPaddingWithBorder: PaddingValues = PaddingValues(0.dp),
trackPadding: PaddingValues = PaddingValues(),
trackPaddingWithBorder: PaddingValues = PaddingValues(),
trackColorAnimationDuration: Duration = 330.milliseconds,
expandAnimationDuration: Duration = 0.milliseconds,
thumbColorAnimationDuration: Duration = trackColorAnimationDuration,
Expand All @@ -525,3 +525,28 @@ public fun WhenScrolling.Companion.windowsAndLinux(
thumbColorAnimationDuration = thumbColorAnimationDuration,
lingerDuration = lingerDuration,
)

public fun ScrollbarVisibility.Companion.tabStrip(
trackThickness: Dp = 5.dp,
trackThicknessExpanded: Dp = 5.dp,
trackPadding: PaddingValues = PaddingValues(1.dp),
trackPaddingExpanded: PaddingValues = PaddingValues(),
trackPaddingWithBorder: PaddingValues = PaddingValues(1.dp),
trackColorAnimationDuration: Duration = 125.milliseconds,
expandAnimationDuration: Duration = trackColorAnimationDuration,
thumbColorAnimationDuration: Duration = trackColorAnimationDuration,
lingerDuration: Duration = 700.milliseconds,
): ScrollbarVisibility =
AlwaysVisible(
trackThickness = trackThickness,
trackThicknessExpanded = trackThicknessExpanded,
trackPadding = trackPadding,
trackPaddingExpanded = trackPaddingExpanded,
trackPaddingWithBorder = trackPaddingWithBorder,
trackColorAnimationDuration = trackColorAnimationDuration,
expandAnimationDuration = expandAnimationDuration,
thumbColorAnimationDuration = thumbColorAnimationDuration,
lingerDuration = lingerDuration,
scrollbarBackgroundColorLight = Color.Unspecified,
scrollbarBackgroundColorDark = Color.Unspecified,
)
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public fun ScrollbarStyle.Companion.tabStripMacOsLight(
colors: ScrollbarColors = ScrollbarColors.macOsLight(),
metrics: ScrollbarMetrics = ScrollbarMetrics.tabStripMacOs(),
trackClickBehavior: TrackClickBehavior = TrackClickBehavior.NextPage,
scrollbarVisibility: ScrollbarVisibility = ScrollbarVisibility.WhenScrolling.default(),
scrollbarVisibility: ScrollbarVisibility = ScrollbarVisibility.tabStrip(),
): ScrollbarStyle =
ScrollbarStyle(
colors = colors,
Expand All @@ -44,7 +44,7 @@ public fun ScrollbarStyle.Companion.tabStripMacOsDark(
colors: ScrollbarColors = ScrollbarColors.macOsDark(),
metrics: ScrollbarMetrics = ScrollbarMetrics.tabStripMacOs(),
trackClickBehavior: TrackClickBehavior = TrackClickBehavior.NextPage,
scrollbarVisibility: ScrollbarVisibility = ScrollbarVisibility.WhenScrolling.default(),
scrollbarVisibility: ScrollbarVisibility = ScrollbarVisibility.tabStrip(),
): ScrollbarStyle =
ScrollbarStyle(
colors = colors,
Expand All @@ -57,7 +57,7 @@ public fun ScrollbarStyle.Companion.tabStripWindowsAndLinuxLight(
colors: ScrollbarColors = ScrollbarColors.windowsAndLinuxLight(),
metrics: ScrollbarMetrics = ScrollbarMetrics.tabStripWindowsAndLinux(),
trackClickBehavior: TrackClickBehavior = TrackClickBehavior.JumpToSpot,
scrollbarVisibility: ScrollbarVisibility = ScrollbarVisibility.AlwaysVisible.tabStrip(),
scrollbarVisibility: ScrollbarVisibility = ScrollbarVisibility.tabStrip(),
): ScrollbarStyle =
ScrollbarStyle(
colors = colors,
Expand All @@ -70,7 +70,7 @@ public fun ScrollbarStyle.Companion.tabStripWindowsAndLinuxDark(
colors: ScrollbarColors = ScrollbarColors.windowsAndLinuxDark(),
metrics: ScrollbarMetrics = ScrollbarMetrics.tabStripWindowsAndLinux(),
trackClickBehavior: TrackClickBehavior = TrackClickBehavior.JumpToSpot,
scrollbarVisibility: ScrollbarVisibility = ScrollbarVisibility.AlwaysVisible.tabStrip(),
scrollbarVisibility: ScrollbarVisibility = ScrollbarVisibility.tabStrip(),
): ScrollbarStyle =
ScrollbarStyle(
colors = colors,
Expand All @@ -89,6 +89,16 @@ public fun ScrollbarMetrics.Companion.tabStripWindowsAndLinux(
minThumbLength: Dp = 20.dp,
): ScrollbarMetrics = ScrollbarMetrics(thumbCornerSize, minThumbLength)

@Deprecated(
"Replace with 'ScrollbarVisibility.tabStrip()' version",
ReplaceWith(
"ScrollbarVisibility.tabStrip(" +
"trackThickness = trackThickness," +
"trackPadding = trackPadding," +
"trackPaddingWithBorder = trackPaddingWithBorder" +
")"
),
)
public fun ScrollbarVisibility.AlwaysVisible.Companion.tabStrip(
trackThickness: Dp = 4.dp,
trackPadding: PaddingValues = PaddingValues(),
Expand Down
6 changes: 6 additions & 0 deletions platform/jewel/ui/api-dump.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1760,18 +1760,21 @@ f:org.jetbrains.jewel.ui.component.styling.ScrollbarStyle$Companion
f:org.jetbrains.jewel.ui.component.styling.ScrollbarStylingKt
- sf:getLocalScrollbarStyle():androidx.compose.runtime.ProvidableCompositionLocal
org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility
- sf:Companion:org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$Companion
- a:getExpandAnimationDuration-UwyO8pc():J
- a:getLingerDuration-UwyO8pc():J
- a:getThumbColorAnimationDuration-UwyO8pc():J
- a:getTrackColorAnimationDuration-UwyO8pc():J
- a:getTrackPadding():androidx.compose.foundation.layout.PaddingValues
- a:getTrackPaddingExpanded():androidx.compose.foundation.layout.PaddingValues
- a:getTrackPaddingWithBorder():androidx.compose.foundation.layout.PaddingValues
- a:getTrackThickness-D9Ej5fM():F
- a:getTrackThicknessExpanded-D9Ej5fM():F
f:org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$AlwaysVisible
- org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility
- sf:$stable:I
- sf:Companion:org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$AlwaysVisible$Companion
- b:<init>(F,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.layout.PaddingValues,J,J,J,J,F,androidx.compose.foundation.layout.PaddingValues,J,J,I,kotlin.jvm.internal.DefaultConstructorMarker):V
- equals(java.lang.Object):Z
- getExpandAnimationDuration-UwyO8pc():J
- getLingerDuration-UwyO8pc():J
Expand All @@ -1780,11 +1783,13 @@ f:org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$AlwaysVisible
- getThumbColorAnimationDuration-UwyO8pc():J
- getTrackColorAnimationDuration-UwyO8pc():J
- getTrackPadding():androidx.compose.foundation.layout.PaddingValues
- getTrackPaddingExpanded():androidx.compose.foundation.layout.PaddingValues
- getTrackPaddingWithBorder():androidx.compose.foundation.layout.PaddingValues
- getTrackThickness-D9Ej5fM():F
- getTrackThicknessExpanded-D9Ej5fM():F
- hashCode():I
f:org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$AlwaysVisible$Companion
f:org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$Companion
f:org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$WhenScrolling
- org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility
- sf:$stable:I
Expand All @@ -1795,6 +1800,7 @@ f:org.jetbrains.jewel.ui.component.styling.ScrollbarVisibility$WhenScrolling
- getThumbColorAnimationDuration-UwyO8pc():J
- getTrackColorAnimationDuration-UwyO8pc():J
- getTrackPadding():androidx.compose.foundation.layout.PaddingValues
- getTrackPaddingExpanded():androidx.compose.foundation.layout.PaddingValues
- getTrackPaddingWithBorder():androidx.compose.foundation.layout.PaddingValues
- getTrackThickness-D9Ej5fM():F
- getTrackThicknessExpanded-D9Ej5fM():F
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ private const val ID_CONTENT = "VerticallyScrollableContainer_content"
private const val ID_VERTICAL_SCROLLBAR = "VerticallyScrollableContainer_verticalScrollbar"
private const val ID_HORIZONTAL_SCROLLBAR = "VerticallyScrollableContainer_horizontalScrollbar"

internal enum class ScrollbarPosition {
Start,
End,
}

/**
* A vertically scrollable container that follows the standard visual styling.
*
Expand Down Expand Up @@ -161,8 +166,10 @@ public fun VerticallyScrollableContainer(
)
},
verticalScrollbarVisible = scrollState.canScroll,
verticalScrollbarPosition = ScrollbarPosition.End,
horizontalScrollbar = null,
horizontalScrollbarVisible = false,
horizontalScrollbarPosition = ScrollbarPosition.End,
scrollbarStyle = style,
modifier = modifier.withKeepVisible(style.scrollbarVisibility.lingerDuration, scope) { keepVisible = it },
) {
Expand Down Expand Up @@ -196,8 +203,10 @@ internal fun TextAreaScrollableContainer(
)
},
verticalScrollbarVisible = scrollState.canScroll,
verticalScrollbarPosition = ScrollbarPosition.End,
horizontalScrollbar = null,
horizontalScrollbarVisible = false,
horizontalScrollbarPosition = ScrollbarPosition.End,
scrollbarStyle = style,
modifier = Modifier.withKeepVisible(style.scrollbarVisibility.lingerDuration, scope) { keepVisible = it },
) {
Expand Down Expand Up @@ -388,8 +397,10 @@ public fun VerticallyScrollableContainer(
)
},
verticalScrollbarVisible = scrollState.canScroll,
verticalScrollbarPosition = ScrollbarPosition.End,
horizontalScrollbar = null,
horizontalScrollbarVisible = false,
horizontalScrollbarPosition = ScrollbarPosition.End,
scrollbarStyle = style,
modifier = modifier.withKeepVisible(style.scrollbarVisibility.lingerDuration, scope) { keepVisible = it },
) {
Expand Down Expand Up @@ -492,13 +503,41 @@ public fun HorizontallyScrollableContainer(
scrollbarEnabled: Boolean = userScrollEnabled,
scrollbarInteractionSource: MutableInteractionSource = remember { MutableInteractionSource() },
content: @Composable BoxScope.() -> Unit,
) {
HorizontallyScrollableContainer(
ScrollbarPosition.End,
modifier,
scrollbarModifier,
scrollState,
style,
reverseLayout,
userScrollEnabled,
scrollbarEnabled,
scrollbarInteractionSource,
content,
)
}

@Composable
internal fun HorizontallyScrollableContainer(
scrollbarPosition: ScrollbarPosition,
modifier: Modifier = Modifier,
scrollbarModifier: Modifier = Modifier,
scrollState: ScrollState = rememberScrollState(),
style: ScrollbarStyle = JewelTheme.scrollbarStyle,
reverseLayout: Boolean = false,
userScrollEnabled: Boolean = true,
scrollbarEnabled: Boolean = userScrollEnabled,
scrollbarInteractionSource: MutableInteractionSource = remember { MutableInteractionSource() },
content: @Composable BoxScope.() -> Unit,
) {
var keepVisible by remember { mutableStateOf(false) }
val scope = rememberCoroutineScope()

ScrollableContainerImpl(
verticalScrollbar = null,
verticalScrollbarVisible = false,
verticalScrollbarPosition = ScrollbarPosition.End,
horizontalScrollbar = {
HorizontalScrollbar(
scrollState = scrollState,
Expand All @@ -511,6 +550,7 @@ public fun HorizontallyScrollableContainer(
)
},
horizontalScrollbarVisible = scrollState.canScroll,
horizontalScrollbarPosition = scrollbarPosition,
scrollbarStyle = style,
modifier = modifier.withKeepVisible(style.scrollbarVisibility.lingerDuration, scope) { keepVisible = it },
) {
Expand Down Expand Up @@ -707,7 +747,9 @@ public fun HorizontallyScrollableContainer(
interactionSource = scrollbarInteractionSource,
)
},
verticalScrollbarPosition = ScrollbarPosition.End,
horizontalScrollbarVisible = scrollState.canScroll,
horizontalScrollbarPosition = ScrollbarPosition.End,
scrollbarStyle = style,
modifier = modifier.withKeepVisible(style.scrollbarVisibility.lingerDuration, scope) { keepVisible = it },
) {
Expand Down Expand Up @@ -742,8 +784,10 @@ private fun Modifier.withKeepVisible(
private fun ScrollableContainerImpl(
verticalScrollbar: (@Composable () -> Unit)?,
verticalScrollbarVisible: Boolean,
verticalScrollbarPosition: ScrollbarPosition,
horizontalScrollbar: (@Composable () -> Unit)?,
horizontalScrollbarVisible: Boolean,
horizontalScrollbarPosition: ScrollbarPosition,
scrollbarStyle: ScrollbarStyle,
modifier: Modifier = Modifier,
content: @Composable () -> Unit,
Expand Down Expand Up @@ -771,21 +815,27 @@ private fun ScrollableContainerImpl(
val sizeOffsetWhenBothVisible =
if (accountForVerticalScrollbar && accountForHorizontalScrollbar) {
scrollbarStyle.scrollbarVisibility.trackThicknessExpanded.roundToPx()
} else 0
} else {
0
}

val verticalScrollbarPlaceable =
if (accountForVerticalScrollbar) {
val verticalScrollbarConstraints =
Constraints.fixedHeight(incomingConstraints.maxHeight - sizeOffsetWhenBothVisible)
verticalScrollbarMeasurable.measure(verticalScrollbarConstraints)
} else null
} else {
null
}

val horizontalScrollbarPlaceable =
if (accountForHorizontalScrollbar) {
val horizontalScrollbarConstraints =
Constraints.fixedWidth(incomingConstraints.maxWidth - sizeOffsetWhenBothVisible)
horizontalScrollbarMeasurable.measure(horizontalScrollbarConstraints)
} else null
} else {
null
}

val isMacOs = hostOs == OS.MacOS
val contentMeasurable = measurables.find { it.layoutId == ID_CONTENT } ?: error("Content not provided")
Expand Down Expand Up @@ -818,10 +868,22 @@ private fun ScrollableContainerImpl(

layout(width, height) {
contentPlaceable.placeRelative(x = 0, y = 0, zIndex = 0f)
verticalScrollbarPlaceable?.placeRelative(x = width - verticalScrollbarPlaceable.width, y = 0, zIndex = 1f)
verticalScrollbarPlaceable?.placeRelative(
x =
when (verticalScrollbarPosition) {
ScrollbarPosition.Start -> 0
ScrollbarPosition.End -> width - verticalScrollbarPlaceable.width
},
y = 0,
zIndex = 1f,
)
horizontalScrollbarPlaceable?.placeRelative(
x = 0,
y = height - horizontalScrollbarPlaceable.height,
y =
when (horizontalScrollbarPosition) {
ScrollbarPosition.Start -> 0
ScrollbarPosition.End -> height - horizontalScrollbarPlaceable.height
},
zIndex = 1f,
)
}
Expand Down Expand Up @@ -864,7 +926,9 @@ private fun computeContentConstraints(
visibility is WhenScrolling -> minWidth
else -> error("Unsupported visibility style: $visibility")
}
} else 0
} else {
0
}

fun maxHeight() =
if (incomingConstraints.hasBoundedHeight) {
Expand All @@ -886,7 +950,9 @@ private fun computeContentConstraints(
visibility is WhenScrolling -> minHeight
else -> error("Unsupported visibility style: $visibility")
}
} else 0
} else {
0
}

return when {
incomingConstraints.hasBoundedWidth && incomingConstraints.hasBoundedHeight -> {
Expand Down
Loading