From af252d3b76f557eb65e14d68aab3dbc96ede6e2e Mon Sep 17 00:00:00 2001 From: maxjivi05 Date: Mon, 5 Oct 2026 00:05:38 -0400 Subject: [PATCH] Menus: show that a list runs on below the fold On a phone in landscape the language menu shows five of its eight entries and ends on a whole row, so nothing hints that more follow. While the list can scroll further it now fades out at the bottom over a down arrow. --- .../droiddeck/launcher/ui/SettingsWidgets.kt | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/droiddeck/launcher/ui/SettingsWidgets.kt b/app/src/main/java/com/droiddeck/launcher/ui/SettingsWidgets.kt index dc8a345f1..d078f2774 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/SettingsWidgets.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/SettingsWidgets.kt @@ -53,6 +53,9 @@ import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowDown +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -65,6 +68,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.shadow import androidx.compose.ui.focus.FocusRequester @@ -263,7 +267,34 @@ fun AnchoredMenu(open: Boolean, onDismiss: () -> Unit, title: String? = null, no title.uppercase(), fontSize = 12.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 1.5.sp, color = colors.onSurfaceVariant, modifier = Modifier.padding(start = 10.dp, top = 6.dp, bottom = 6.dp), ) - Column(Modifier.weight(1f, fill = false).verticalScroll(rememberScrollState())) { content(firstItemFocus) } + // While entries remain below the fold the list fades out at the bottom over a down + // arrow, so a short screen (a phone in landscape) shows that the menu goes on. + val scroll = rememberScrollState() + Box(Modifier.weight(1f, fill = false)) { + Column( + Modifier + .graphicsLayer { compositingStrategy = androidx.compose.ui.graphics.CompositingStrategy.Offscreen } + .drawWithContent { + drawContent() + if (scroll.canScrollForward) { + val fade = 36.dp.toPx().coerceAtMost(size.height / 3) + drawRect( + androidx.compose.ui.graphics.Brush.verticalGradient( + listOf(Color.Black, Color.Transparent), startY = size.height - fade, endY = size.height, + ), + topLeft = androidx.compose.ui.geometry.Offset(0f, size.height - fade), + size = androidx.compose.ui.geometry.Size(size.width, fade), + blendMode = androidx.compose.ui.graphics.BlendMode.DstIn, + ) + } + } + .verticalScroll(scroll), + ) { content(firstItemFocus) } + if (scroll.canScrollForward) Icon( + Icons.Filled.KeyboardArrowDown, contentDescription = null, tint = colors.onSurfaceVariant, + modifier = Modifier.align(Alignment.BottomCenter).size(20.dp), + ) + } if (note != null) { Spacer(Modifier.height(4.dp)) Box(Modifier.fillMaxWidth().height(1.dp).background(pal.line))