From 93bd62545d48df89b5d2fdd7b34602b99d4ac108 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Thu, 31 Mar 2022 18:44:24 +0200 Subject: [PATCH] Add Arrangement.BottomReversed to reverse column direction --- .../mm20/launcher2/ui/layout/Arrangement.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/layout/Arrangement.kt diff --git a/ui/src/main/java/de/mm20/launcher2/ui/layout/Arrangement.kt b/ui/src/main/java/de/mm20/launcher2/ui/layout/Arrangement.kt new file mode 100644 index 00000000..f2f1f031 --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/layout/Arrangement.kt @@ -0,0 +1,40 @@ +package de.mm20.launcher2.ui.layout + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.runtime.Stable +import androidx.compose.ui.unit.Density + +@Stable +val Arrangement.BottomReversed: Arrangement.Vertical + get() = object : Arrangement.Vertical { + override fun Density.arrange( + totalSize: Int, + sizes: IntArray, + outPositions: IntArray + ) = placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = true) + + override fun toString() = "Arrangement#BottomReversed" + } + +internal fun placeRightOrBottom( + totalSize: Int, + size: IntArray, + outPosition: IntArray, + reverseInput: Boolean +) { + val consumedSize = size.fold(0) { a, b -> a + b } + var current = totalSize - consumedSize + size.forEachIndexed(reverseInput) { index, it -> + outPosition[index] = current + current += it + } +} +private inline fun IntArray.forEachIndexed(reversed: Boolean, action: (Int, Int) -> Unit) { + if (!reversed) { + forEachIndexed(action) + } else { + for (i in (size - 1) downTo 0) { + action(i, get(i)) + } + } +} \ No newline at end of file