|
|
|
package org.jetbrains.compose.splitpane
|
|
|
|
|
|
|
|
import androidx.compose.foundation.gestures.detectDragGestures
|
|
|
|
import androidx.compose.foundation.layout.*
|
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
|
|
|
import androidx.compose.ui.Modifier
|
|
|
|
import androidx.compose.ui.input.pointer.*
|
|
|
|
import androidx.compose.ui.platform.LocalLayoutDirection
|
|
|
|
import androidx.compose.ui.unit.LayoutDirection
|
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
import java.awt.Cursor
|
|
|
|
|
|
|
|
@OptIn(ExperimentalComposeUiApi::class)
|
|
|
|
private fun Modifier.cursorForHorizontalResize(isHorizontal: Boolean): Modifier =
|
|
|
|
pointerHoverIcon(PointerIcon(Cursor(if (isHorizontal) Cursor.E_RESIZE_CURSOR else Cursor.S_RESIZE_CURSOR)))
|
|
|
|
|
|
|
|
@OptIn(ExperimentalSplitPaneApi::class)
|
|
|
|
@Composable
|
|
|
|
private fun DesktopHandle(
|
|
|
|
isHorizontal: Boolean,
|
|
|
|
splitPaneState: SplitPaneState
|
|
|
|
) = Box(
|
|
|
|
Modifier
|
|
|
|
.run {
|
|
|
|
val layoutDirection = LocalLayoutDirection.current
|
|
|
|
pointerInput(splitPaneState) {
|
|
|
|
detectDragGestures { change, _ ->
|
|
|
|
change.consume()
|
|
|
|
splitPaneState.dispatchRawMovement(
|
|
|
|
if (isHorizontal)
|
|
|
|
if (layoutDirection == LayoutDirection.Ltr) change.position.x else -change.position.x
|
|
|
|
else change.position.y
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.cursorForHorizontalResize(isHorizontal)
|
|
|
|
.run {
|
|
|
|
if (isHorizontal) {
|
|
|
|
this.width(8.dp)
|
|
|
|
.fillMaxHeight()
|
|
|
|
} else {
|
|
|
|
this.height(8.dp)
|
|
|
|
.fillMaxWidth()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@OptIn(ExperimentalSplitPaneApi::class)
|
|
|
|
internal actual fun defaultSplitter(
|
|
|
|
isHorizontal: Boolean,
|
|
|
|
splitPaneState: SplitPaneState
|
|
|
|
): Splitter = Splitter(
|
|
|
|
measuredPart = {},
|
|
|
|
handlePart = {
|
|
|
|
DesktopHandle(isHorizontal, splitPaneState)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|