From 520930c5eb79a2045ba5b5be40351ecd85abfd6e Mon Sep 17 00:00:00 2001 From: Kirill Grouchnikov Date: Fri, 14 Jan 2022 16:00:36 -0500 Subject: [PATCH] Horizontal auto-reveal scrolling for breadcrumb bar For #8 --- .../aurora/component/AuroraBreadcrumbBar.kt | 19 ++++++++++--------- .../aurora/demo/AuroraBreadcrumbBarDemo.kt | 7 +++++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/component/src/desktopMain/kotlin/org/pushingpixels/aurora/component/AuroraBreadcrumbBar.kt b/component/src/desktopMain/kotlin/org/pushingpixels/aurora/component/AuroraBreadcrumbBar.kt index 782c493e..53cd8c36 100644 --- a/component/src/desktopMain/kotlin/org/pushingpixels/aurora/component/AuroraBreadcrumbBar.kt +++ b/component/src/desktopMain/kotlin/org/pushingpixels/aurora/component/AuroraBreadcrumbBar.kt @@ -15,6 +15,7 @@ */ package org.pushingpixels.aurora.component +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* @@ -47,6 +48,7 @@ import org.pushingpixels.aurora.theming.* fun AuroraBreadcrumbBar( contentModel: List, presentationModel: BreadcrumbBarPresentationModel = BreadcrumbBarPresentationModel(), + horizontalScrollState: ScrollState = rememberScrollState(0), modifier: Modifier ) { val colors = AuroraSkin.colors @@ -102,7 +104,6 @@ fun AuroraBreadcrumbBar( resourceLoader = resourceLoader ) - val stateHorizontal = rememberScrollState(0) val scope = rememberCoroutineScope() val scrollAmount = 12.dp.value * density.density @@ -146,11 +147,11 @@ fun AuroraBreadcrumbBar( ) } }, - isActionEnabled = (stateHorizontal.value > 0), + isActionEnabled = (horizontalScrollState.value > 0), action = { scope.launch { - stateHorizontal.scrollTo( - (stateHorizontal.value - scrollAmount.toInt()).coerceAtLeast(0) + horizontalScrollState.scrollTo( + (horizontalScrollState.value - scrollAmount.toInt()).coerceAtLeast(0) ) } }) @@ -194,12 +195,12 @@ fun AuroraBreadcrumbBar( ) } }, - isActionEnabled = (stateHorizontal.value < stateHorizontal.maxValue), + isActionEnabled = (horizontalScrollState.value < horizontalScrollState.maxValue), action = { scope.launch { - stateHorizontal.scrollTo( - (stateHorizontal.value + scrollAmount.toInt()).coerceAtMost( - stateHorizontal.maxValue + horizontalScrollState.scrollTo( + (horizontalScrollState.value + scrollAmount.toInt()).coerceAtMost( + horizontalScrollState.maxValue ) ) } @@ -221,7 +222,7 @@ fun AuroraBreadcrumbBar( ) ).project() - Box(modifier = Modifier.horizontalScroll(stateHorizontal)) { + Box(modifier = Modifier.horizontalScroll(horizontalScrollState)) { Row(modifier = Modifier.fillMaxWidth().wrapContentHeight()) { for (command in contentModel) { AuroraCommandButton( diff --git a/demo/src/desktopMain/kotlin/org/pushingpixels/aurora/demo/AuroraBreadcrumbBarDemo.kt b/demo/src/desktopMain/kotlin/org/pushingpixels/aurora/demo/AuroraBreadcrumbBarDemo.kt index 36eca417..502e5d4e 100644 --- a/demo/src/desktopMain/kotlin/org/pushingpixels/aurora/demo/AuroraBreadcrumbBarDemo.kt +++ b/demo/src/desktopMain/kotlin/org/pushingpixels/aurora/demo/AuroraBreadcrumbBarDemo.kt @@ -16,6 +16,7 @@ package org.pushingpixels.aurora.demo import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -26,6 +27,7 @@ import androidx.compose.ui.window.WindowPlacement import androidx.compose.ui.window.WindowPosition import androidx.compose.ui.window.rememberWindowState import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.pushingpixels.aurora.component.AuroraBreadcrumbBar import org.pushingpixels.aurora.component.model.* @@ -136,9 +138,13 @@ fun AuroraWindowScope.BreadcrumbContent(auroraSkinDefinition: MutableState(null) } + val breadcrumbBarHorizontalScrollState = rememberScrollState(0) val onBreadcrumbItemSelected: (File) -> Unit = { scope.launch(Dispatchers.Default) { commandPanelContentModel.value = getCommandPanelContent(breadcrumbBarContentProvider, it) + delay(150) + breadcrumbBarHorizontalScrollState.animateScrollTo( + breadcrumbBarHorizontalScrollState.maxValue) } } @@ -156,6 +162,7 @@ fun AuroraWindowScope.BreadcrumbContent(auroraSkinDefinition: MutableState