Nikolay Igotti
4 years ago
18 changed files with 333 additions and 329 deletions
@ -1,3 +1,3 @@
|
||||
# __LATEST_COMPOSE_RELEASE_VERSION__ |
||||
compose.version=0.3.0 |
||||
compose.version=0.3.1 |
||||
kotlin.code.style=official |
||||
|
@ -1,116 +1,116 @@
|
||||
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. |
||||
*/ |
||||
@ExperimentalSplitPaneApi |
||||
@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. |
||||
*/ |
||||
@ExperimentalSplitPaneApi |
||||
@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 |
||||
*/ |
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
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 |
||||
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. |
||||
*/ |
||||
@ExperimentalSplitPaneApi |
||||
@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. |
||||
*/ |
||||
@ExperimentalSplitPaneApi |
||||
@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 |
||||
*/ |
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
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 |
||||
) |
@ -1,191 +1,188 @@
|
||||
package org.jetbrains.compose.splitpane |
||||
|
||||
import androidx.compose.foundation.InteractionState |
||||
import androidx.compose.foundation.gestures.detectDragGestures |
||||
import androidx.compose.runtime.Composable |
||||
import androidx.compose.runtime.remember |
||||
import androidx.compose.ui.Modifier |
||||
import androidx.compose.ui.input.pointer.consumeAllChanges |
||||
import androidx.compose.ui.input.pointer.pointerInput |
||||
import androidx.compose.ui.unit.Dp |
||||
import androidx.compose.ui.unit.dp |
||||
|
||||
/** Receiver scope which is used by [HorizontalSplitPane] and [VerticalSplitPane] */ |
||||
@ExperimentalSplitPaneApi |
||||
interface SplitPaneScope { |
||||
|
||||
/** |
||||
* Set up first composable item if SplitPane, for [HorizontalSplitPane] it will be |
||||
* Right part, for [VerticalSplitPane] it will be Top part |
||||
* @param minSize a minimal size of composable item. |
||||
* For [HorizontalSplitPane] it will be minimal width, for [VerticalSplitPane] it wil be minimal Heights. |
||||
* In this context minimal mean that this composable item could not be smaller than specified value. |
||||
* @param content composable item content. |
||||
* */ |
||||
fun first( |
||||
minSize: Dp = 0.dp, |
||||
content: @Composable () -> Unit |
||||
) |
||||
|
||||
/** |
||||
* Set up second composable item if SplitPane. |
||||
* For [HorizontalSplitPane] it will be Left part, for [VerticalSplitPane] it will be Bottom part |
||||
* @param minSize a minimal size of composable item. |
||||
* For [HorizontalSplitPane] it will be minimal width, for [VerticalSplitPane] it wil be minimal Heights. |
||||
* In this context minimal mean that this composable item could not be smaller than specified value. |
||||
* @param content composable item content. |
||||
* */ |
||||
fun second( |
||||
minSize: Dp = 0.dp, |
||||
content: @Composable () -> Unit |
||||
) |
||||
|
||||
fun splitter(block: SplitterScope.() -> Unit) |
||||
|
||||
} |
||||
|
||||
/** Receiver scope which is used by [SplitterScope] */ |
||||
@ExperimentalSplitPaneApi |
||||
interface HandleScope { |
||||
/** allow mark composable as movable handle */ |
||||
fun Modifier.markAsHandle(): Modifier |
||||
} |
||||
|
||||
/** Receiver scope which is used by [SplitPaneScope] */ |
||||
@ExperimentalSplitPaneApi |
||||
interface SplitterScope { |
||||
/** |
||||
* Set up visible part of splitter. This part will be measured and placed between split pane |
||||
* parts (first and second) |
||||
* |
||||
* @param content composable item content |
||||
* */ |
||||
fun visiblePart(content: @Composable () -> Unit) |
||||
|
||||
/** |
||||
* Set up handle part, this part of splitter would be measured and placed above [visiblePart] content. |
||||
* Size of handle will have no effect on split pane parts (first and second) sizes. |
||||
* |
||||
* @param alignment alignment of handle according to [visiblePart] could be: |
||||
* * [SplitterHandleAlignment.BEFORE] if you place handle before [visiblePart], |
||||
* * [SplitterHandleAlignment.ABOVE] if you place handle above [visiblePart] (will be centered) |
||||
* * and [SplitterHandleAlignment.AFTER] if you place handle after [visiblePart]. |
||||
* |
||||
* @param content composable item content provider. Uses [HandleScope] to allow mark any provided composable part |
||||
* as handle. |
||||
* [content] will be placed only if [SplitPaneState.moveEnabled] is true |
||||
*/ |
||||
fun handle( |
||||
alignment: SplitterHandleAlignment = SplitterHandleAlignment.ABOVE, |
||||
content: @Composable HandleScope.() -> Unit |
||||
) |
||||
} |
||||
|
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
internal class HandleScopeImpl( |
||||
private val containerScope: SplitPaneScopeImpl |
||||
) : HandleScope { |
||||
override fun Modifier.markAsHandle(): Modifier = this.pointerInput(containerScope.splitPaneState) { |
||||
detectDragGestures { change, _ -> |
||||
change.consumeAllChanges() |
||||
containerScope.splitPaneState.dispatchRawMovement( |
||||
if (containerScope.isHorizontal) change.position.x else change.position.y |
||||
) |
||||
} |
||||
} |
||||
} |
||||
|
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
internal class SplitterScopeImpl( |
||||
private val containerScope: SplitPaneScopeImpl |
||||
) : SplitterScope { |
||||
|
||||
override fun visiblePart(content: @Composable () -> Unit) { |
||||
containerScope.visiblePart = content |
||||
} |
||||
|
||||
override fun handle( |
||||
alignment: SplitterHandleAlignment, |
||||
content: @Composable HandleScope.() -> Unit |
||||
) { |
||||
containerScope.handle = { HandleScopeImpl(containerScope).content() } |
||||
containerScope.alignment = alignment |
||||
} |
||||
} |
||||
|
||||
private typealias ComposableSlot = @Composable () -> Unit |
||||
|
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
internal class SplitPaneScopeImpl( |
||||
internal val isHorizontal: Boolean, |
||||
internal val splitPaneState: SplitPaneState |
||||
) : SplitPaneScope { |
||||
|
||||
private var firstPlaceableMinimalSize: Dp = 0.dp |
||||
private var secondPlaceableMinimalSize: Dp = 0.dp |
||||
|
||||
internal val minimalSizes: MinimalSizes |
||||
get() = MinimalSizes(firstPlaceableMinimalSize, secondPlaceableMinimalSize) |
||||
|
||||
internal var firstPlaceableContent: ComposableSlot? = null |
||||
private set |
||||
internal var secondPlaceableContent: ComposableSlot? = null |
||||
private set |
||||
|
||||
internal lateinit var visiblePart: ComposableSlot |
||||
internal lateinit var handle: ComposableSlot |
||||
internal var alignment: SplitterHandleAlignment = SplitterHandleAlignment.ABOVE |
||||
internal val splitter |
||||
get() = |
||||
if (this::visiblePart.isInitialized && this::handle.isInitialized) { |
||||
Splitter(visiblePart, handle, alignment) |
||||
} else { |
||||
defaultSplitter(isHorizontal, splitPaneState) |
||||
} |
||||
|
||||
override fun first( |
||||
minSize: Dp, |
||||
content: @Composable () -> Unit |
||||
) { |
||||
firstPlaceableMinimalSize = minSize |
||||
firstPlaceableContent = content |
||||
} |
||||
|
||||
override fun second( |
||||
minSize: Dp, |
||||
content: @Composable () -> Unit |
||||
) { |
||||
secondPlaceableMinimalSize = minSize |
||||
secondPlaceableContent = content |
||||
} |
||||
|
||||
override fun splitter(block: SplitterScope.() -> Unit) { |
||||
SplitterScopeImpl(this).block() |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* creates a [SplitPaneState] and remembers it across composition |
||||
* |
||||
* Changes to the provided initial values will **not** result in the state being recreated or |
||||
* changed in any way if it has already been created. |
||||
* |
||||
* @param initialPositionPercentage the initial value for [SplitPaneState.positionPercentage] |
||||
* @param moveEnabled the initial value for [SplitPaneState.moveEnabled] |
||||
* @param interactionState the initial value for [SplitPaneState.interactionState] |
||||
* */ |
||||
@ExperimentalSplitPaneApi |
||||
@Composable |
||||
fun rememberSplitPaneState( |
||||
initialPositionPercentage: Float = 0f, |
||||
moveEnabled: Boolean = true, |
||||
interactionState: InteractionState = remember { InteractionState() } |
||||
): SplitPaneState { |
||||
return remember { |
||||
SplitPaneState( |
||||
moveEnabled = moveEnabled, |
||||
initialPositionPercentage = initialPositionPercentage, |
||||
interactionState = interactionState |
||||
) |
||||
} |
||||
package org.jetbrains.compose.splitpane |
||||
|
||||
import androidx.compose.foundation.gestures.detectDragGestures |
||||
import androidx.compose.runtime.Composable |
||||
import androidx.compose.runtime.remember |
||||
import androidx.compose.ui.Modifier |
||||
import androidx.compose.ui.input.pointer.consumeAllChanges |
||||
import androidx.compose.ui.input.pointer.pointerInput |
||||
import androidx.compose.ui.unit.Dp |
||||
import androidx.compose.ui.unit.dp |
||||
|
||||
/** Receiver scope which is used by [HorizontalSplitPane] and [VerticalSplitPane] */ |
||||
@ExperimentalSplitPaneApi |
||||
interface SplitPaneScope { |
||||
|
||||
/** |
||||
* Set up first composable item if SplitPane, for [HorizontalSplitPane] it will be |
||||
* Right part, for [VerticalSplitPane] it will be Top part |
||||
* @param minSize a minimal size of composable item. |
||||
* For [HorizontalSplitPane] it will be minimal width, for [VerticalSplitPane] it wil be minimal Heights. |
||||
* In this context minimal mean that this composable item could not be smaller than specified value. |
||||
* @param content composable item content. |
||||
* */ |
||||
fun first( |
||||
minSize: Dp = 0.dp, |
||||
content: @Composable () -> Unit |
||||
) |
||||
|
||||
/** |
||||
* Set up second composable item if SplitPane. |
||||
* For [HorizontalSplitPane] it will be Left part, for [VerticalSplitPane] it will be Bottom part |
||||
* @param minSize a minimal size of composable item. |
||||
* For [HorizontalSplitPane] it will be minimal width, for [VerticalSplitPane] it wil be minimal Heights. |
||||
* In this context minimal mean that this composable item could not be smaller than specified value. |
||||
* @param content composable item content. |
||||
* */ |
||||
fun second( |
||||
minSize: Dp = 0.dp, |
||||
content: @Composable () -> Unit |
||||
) |
||||
|
||||
fun splitter(block: SplitterScope.() -> Unit) |
||||
|
||||
} |
||||
|
||||
/** Receiver scope which is used by [SplitterScope] */ |
||||
@ExperimentalSplitPaneApi |
||||
interface HandleScope { |
||||
/** allow mark composable as movable handle */ |
||||
fun Modifier.markAsHandle(): Modifier |
||||
} |
||||
|
||||
/** Receiver scope which is used by [SplitPaneScope] */ |
||||
@ExperimentalSplitPaneApi |
||||
interface SplitterScope { |
||||
/** |
||||
* Set up visible part of splitter. This part will be measured and placed between split pane |
||||
* parts (first and second) |
||||
* |
||||
* @param content composable item content |
||||
* */ |
||||
fun visiblePart(content: @Composable () -> Unit) |
||||
|
||||
/** |
||||
* Set up handle part, this part of splitter would be measured and placed above [visiblePart] content. |
||||
* Size of handle will have no effect on split pane parts (first and second) sizes. |
||||
* |
||||
* @param alignment alignment of handle according to [visiblePart] could be: |
||||
* * [SplitterHandleAlignment.BEFORE] if you place handle before [visiblePart], |
||||
* * [SplitterHandleAlignment.ABOVE] if you place handle above [visiblePart] (will be centered) |
||||
* * and [SplitterHandleAlignment.AFTER] if you place handle after [visiblePart]. |
||||
* |
||||
* @param content composable item content provider. Uses [HandleScope] to allow mark any provided composable part |
||||
* as handle. |
||||
* [content] will be placed only if [SplitPaneState.moveEnabled] is true |
||||
*/ |
||||
fun handle( |
||||
alignment: SplitterHandleAlignment = SplitterHandleAlignment.ABOVE, |
||||
content: @Composable HandleScope.() -> Unit |
||||
) |
||||
} |
||||
|
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
internal class HandleScopeImpl( |
||||
private val containerScope: SplitPaneScopeImpl |
||||
) : HandleScope { |
||||
override fun Modifier.markAsHandle(): Modifier = this.pointerInput(containerScope.splitPaneState) { |
||||
detectDragGestures { change, _ -> |
||||
change.consumeAllChanges() |
||||
containerScope.splitPaneState.dispatchRawMovement( |
||||
if (containerScope.isHorizontal) change.position.x else change.position.y |
||||
) |
||||
} |
||||
} |
||||
} |
||||
|
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
internal class SplitterScopeImpl( |
||||
private val containerScope: SplitPaneScopeImpl |
||||
) : SplitterScope { |
||||
|
||||
override fun visiblePart(content: @Composable () -> Unit) { |
||||
containerScope.visiblePart = content |
||||
} |
||||
|
||||
override fun handle( |
||||
alignment: SplitterHandleAlignment, |
||||
content: @Composable HandleScope.() -> Unit |
||||
) { |
||||
containerScope.handle = { HandleScopeImpl(containerScope).content() } |
||||
containerScope.alignment = alignment |
||||
} |
||||
} |
||||
|
||||
private typealias ComposableSlot = @Composable () -> Unit |
||||
|
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
internal class SplitPaneScopeImpl( |
||||
internal val isHorizontal: Boolean, |
||||
internal val splitPaneState: SplitPaneState |
||||
) : SplitPaneScope { |
||||
|
||||
private var firstPlaceableMinimalSize: Dp = 0.dp |
||||
private var secondPlaceableMinimalSize: Dp = 0.dp |
||||
|
||||
internal val minimalSizes: MinimalSizes |
||||
get() = MinimalSizes(firstPlaceableMinimalSize, secondPlaceableMinimalSize) |
||||
|
||||
internal var firstPlaceableContent: ComposableSlot? = null |
||||
private set |
||||
internal var secondPlaceableContent: ComposableSlot? = null |
||||
private set |
||||
|
||||
internal lateinit var visiblePart: ComposableSlot |
||||
internal lateinit var handle: ComposableSlot |
||||
internal var alignment: SplitterHandleAlignment = SplitterHandleAlignment.ABOVE |
||||
internal val splitter |
||||
get() = |
||||
if (this::visiblePart.isInitialized && this::handle.isInitialized) { |
||||
Splitter(visiblePart, handle, alignment) |
||||
} else { |
||||
defaultSplitter(isHorizontal, splitPaneState) |
||||
} |
||||
|
||||
override fun first( |
||||
minSize: Dp, |
||||
content: @Composable () -> Unit |
||||
) { |
||||
firstPlaceableMinimalSize = minSize |
||||
firstPlaceableContent = content |
||||
} |
||||
|
||||
override fun second( |
||||
minSize: Dp, |
||||
content: @Composable () -> Unit |
||||
) { |
||||
secondPlaceableMinimalSize = minSize |
||||
secondPlaceableContent = content |
||||
} |
||||
|
||||
override fun splitter(block: SplitterScope.() -> Unit) { |
||||
SplitterScopeImpl(this).block() |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* creates a [SplitPaneState] and remembers it across composition |
||||
* |
||||
* Changes to the provided initial values will **not** result in the state being recreated or |
||||
* changed in any way if it has already been created. |
||||
* |
||||
* @param initialPositionPercentage the initial value for [SplitPaneState.positionPercentage] |
||||
* @param moveEnabled the initial value for [SplitPaneState.moveEnabled] |
||||
* @param interactionState the initial value for [SplitPaneState.interactionState] |
||||
* */ |
||||
@ExperimentalSplitPaneApi |
||||
@Composable |
||||
fun rememberSplitPaneState( |
||||
initialPositionPercentage: Float = 0f, |
||||
moveEnabled: Boolean = true |
||||
): SplitPaneState { |
||||
return remember { |
||||
SplitPaneState( |
||||
moveEnabled = moveEnabled, |
||||
initialPositionPercentage = initialPositionPercentage |
||||
) |
||||
} |
||||
} |
@ -1,3 +1,9 @@
|
||||
OLDVER=0.3.0-rc1 |
||||
NEWVER=0.3.0 |
||||
find -E ../ -regex '.*\.(kts|properties|kt)' -exec sed -i '' -e "s/$OLDVER/$NEWVER/g" {} \; |
||||
#!/bin/bash |
||||
ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"/.. |
||||
COMPOSE_OLDVER=0.3.0 |
||||
COMPOSE_NEWVER=0.3.1 |
||||
find -E $ROOT -regex '.*\.(kts|properties|kt)' -exec sed -i '' -e "s/$COMPOSE_OLDVER/$COMPOSE_NEWVER/g" {} \; |
||||
APPCOMPAT_OLDVER=1.1.0 |
||||
APPCOMPAT_NEWVER=1.3.0-beta01 |
||||
find -E $ROOT -regex '.*\.(kts|properties|kt)' -exec sed -i '' -e "s/$APPCOMPAT_OLDVER/$APPCOMPAT_NEWVER/g" {} \; |
||||
|
||||
|
Loading…
Reference in new issue