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.
60 lines
1.9 KiB
60 lines
1.9 KiB
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) |
|
} |
|
) |
|
|
|
|