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
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 |
|
) |