All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.androidx.compose.foundation.lazy.grid.LazyGridSpan.kt Maven / Gradle / Ivy

/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.compose.foundation.lazy.grid

import androidx.annotation.IntRange
import androidx.compose.foundation.internal.requirePrecondition
import androidx.compose.runtime.Immutable

/** Represents the span of an item in a [LazyVerticalGrid] or a [LazyHorizontalGrid]. */
@Immutable
@kotlin.jvm.JvmInline
value class GridItemSpan internal constructor(private val packedValue: Long) {
    /**
     * The span of the item on the current line. This will be the horizontal span for items of
     * [LazyVerticalGrid] and the vertical span for a [LazyHorizontalGrid].
     */
    val currentLineSpan: Int
        get() = packedValue.toInt()
}

/**
 * Creates a [GridItemSpan] with a specified [currentLineSpan]. This will be the horizontal span for
 * an item of a [LazyVerticalGrid] and the vertical span for a [LazyHorizontalGrid].
 */
fun GridItemSpan(@IntRange(from = 1) currentLineSpan: Int): GridItemSpan {
    requirePrecondition(currentLineSpan > 0) { "The span value should be higher than 0" }
    return GridItemSpan(currentLineSpan.toLong())
}

/** Scope of lambdas used to calculate the spans of items in lazy grids. */
@LazyGridScopeMarker
sealed interface LazyGridItemSpanScope {
    /**
     * The max current line (horizontal for vertical grids) the item can occupy, such that it will
     * be positioned on the current line.
     *
     * For example if [LazyVerticalGrid] has 3 columns this value will be 3 for the first cell in
     * the line, 2 for the second cell, and 1 for the last one. If you return a span count larger
     * than [maxCurrentLineSpan] this means we can't fit this cell into the current line, so the
     * cell will be positioned on the next line.
     */
    val maxCurrentLineSpan: Int

    /**
     * The max line span (horizontal for vertical grids) an item can occupy. This will be the number
     * of columns in vertical grids or the number of rows in horizontal grids.
     *
     * For example if [LazyVerticalGrid] has 3 columns this value will be 3 for each cell.
     */
    val maxLineSpan: Int
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy