You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.5 KiB
113 lines
4.5 KiB
3 years ago
|
package org.jetbrains.compose.splitpane
|
||
|
|
||
|
import androidx.compose.runtime.Composable
|
||
|
import androidx.compose.ui.Modifier
|
||
|
import androidx.compose.ui.unit.Dp
|
||
|
import androidx.compose.ui.unit.dp
|
||
|
|
||
|
internal data class MinimalSizes(
|
||
|
val firstPlaceableMinimalSize: Dp,
|
||
|
val secondPlaceableMinimalSize: Dp
|
||
|
)
|
||
|
|
||
|
/**
|
||
|
* Pane that place it parts **vertically** from top to bottom and allows to change items **heights**.
|
||
|
* The [content] block defines DSL which allow you to configure top ([SplitPaneScope.first]),
|
||
|
* bottom ([SplitPaneScope.second]).
|
||
|
*
|
||
|
* @param modifier the modifier to apply to this layout
|
||
|
* @param splitPaneState the state object to be used to control or observe the split pane state
|
||
|
* @param content a block which describes the content. Inside this block you can use methods like
|
||
|
* [SplitPaneScope.first], [SplitPaneScope.second], to describe parts of split pane.
|
||
|
*/
|
||
|
@Composable
|
||
|
fun VerticalSplitPane(
|
||
|
modifier: Modifier = Modifier,
|
||
|
splitPaneState: SplitPaneState = rememberSplitPaneState(),
|
||
|
content: SplitPaneScope.() -> Unit
|
||
|
) {
|
||
|
with(SplitPaneScopeImpl(isHorizontal = false, splitPaneState).apply(content)) {
|
||
|
if (firstPlaceableContent != null && secondPlaceableContent != null) {
|
||
|
SplitPane(
|
||
|
modifier = modifier,
|
||
|
isHorizontal = false,
|
||
|
splitPaneState = splitPaneState,
|
||
|
minimalSizesConfiguration = minimalSizes,
|
||
|
first = firstPlaceableContent!!,
|
||
|
second = secondPlaceableContent!!,
|
||
|
splitter = splitter
|
||
|
)
|
||
|
} else {
|
||
|
firstPlaceableContent?.invoke()
|
||
|
secondPlaceableContent?.invoke()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Pane that place it parts **horizontally** from left to right and allows to change items **width**.
|
||
|
* The [content] block defines DSL which allow you to configure left ([SplitPaneScope.first]),
|
||
|
* right ([SplitPaneScope.second]) parts of split pane.
|
||
|
*
|
||
|
* @param modifier the modifier to apply to this layout
|
||
|
* @param splitPaneState the state object to be used to control or observe the split pane state
|
||
|
* @param content a block which describes the content. Inside this block you can use methods like
|
||
|
* [SplitPaneScope.first], [SplitPaneScope.second], to describe parts of split pane.
|
||
|
*/
|
||
|
@Composable
|
||
|
fun HorizontalSplitPane(
|
||
|
modifier: Modifier = Modifier,
|
||
|
splitPaneState: SplitPaneState = rememberSplitPaneState(),
|
||
|
content: SplitPaneScope.() -> Unit
|
||
|
) {
|
||
|
with(SplitPaneScopeImpl(isHorizontal = true, splitPaneState).apply(content)) {
|
||
|
if (firstPlaceableContent != null && secondPlaceableContent != null) {
|
||
|
SplitPane(
|
||
|
modifier = modifier,
|
||
|
isHorizontal = true,
|
||
|
splitPaneState = splitPaneState,
|
||
|
minimalSizesConfiguration = minimalSizes,
|
||
|
first = firstPlaceableContent!!,
|
||
|
second = secondPlaceableContent!!,
|
||
|
splitter = splitter
|
||
|
)
|
||
|
} else {
|
||
|
firstPlaceableContent?.invoke()
|
||
|
secondPlaceableContent?.invoke()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Internal implementation of default splitter
|
||
|
*
|
||
|
* @param isHorizontal describes is it horizontal or vertical split pane
|
||
|
* @param splitPaneState the state object to be used to control or observe the split pane state
|
||
|
*/
|
||
|
internal expect fun defaultSplitter(
|
||
|
isHorizontal: Boolean,
|
||
|
splitPaneState: SplitPaneState
|
||
|
): Splitter
|
||
|
|
||
|
/**
|
||
|
* Internal implementation of split pane that used in all public composable functions
|
||
|
*
|
||
|
* @param modifier the modifier to apply to this layout
|
||
|
* @param isHorizontal describes is it horizontal of vertical split pane
|
||
|
* @param splitPaneState the state object to be used to control or observe the split pane state
|
||
|
* @param minimalSizesConfiguration data class ([MinimalSizes]) that provides minimal size for split pane parts
|
||
|
* @param first first part of split pane, left or top according to [isHorizontal]
|
||
|
* @param second second part of split pane, right or bottom according to [isHorizontal]
|
||
|
* @param splitter separator composable, by default [Splitter] is used
|
||
|
* */
|
||
|
@Composable
|
||
|
internal expect fun SplitPane(
|
||
|
modifier: Modifier = Modifier,
|
||
|
isHorizontal: Boolean = true,
|
||
|
splitPaneState: SplitPaneState,
|
||
|
minimalSizesConfiguration: MinimalSizes = MinimalSizes(0.dp, 0.dp),
|
||
|
first: @Composable () -> Unit,
|
||
|
second: @Composable () -> Unit,
|
||
|
splitter: Splitter
|
||
|
)
|