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.
95 lines
3.5 KiB
95 lines
3.5 KiB
3 years ago
|
package org.jetbrains.compose.splitpane.demo
|
||
|
|
||
|
import androidx.compose.desktop.DesktopTheme
|
||
|
import androidx.compose.desktop.LocalAppWindow
|
||
|
import androidx.compose.desktop.Window
|
||
|
import androidx.compose.foundation.background
|
||
|
import androidx.compose.foundation.layout.Box
|
||
|
import androidx.compose.foundation.layout.fillMaxHeight
|
||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||
|
import androidx.compose.foundation.layout.width
|
||
|
import androidx.compose.material.MaterialTheme
|
||
|
import androidx.compose.runtime.Composable
|
||
|
import androidx.compose.runtime.CompositionLocalProvider
|
||
|
import androidx.compose.runtime.getValue
|
||
|
import androidx.compose.runtime.mutableStateOf
|
||
|
import androidx.compose.runtime.remember
|
||
|
import androidx.compose.runtime.setValue
|
||
|
import androidx.compose.ui.Modifier
|
||
|
import androidx.compose.ui.composed
|
||
|
import androidx.compose.ui.graphics.Color
|
||
|
import androidx.compose.ui.graphics.SolidColor
|
||
|
import androidx.compose.ui.input.pointer.pointerMoveFilter
|
||
|
import androidx.compose.ui.platform.LocalViewConfiguration
|
||
|
import androidx.compose.ui.platform.ViewConfiguration
|
||
|
import androidx.compose.ui.unit.dp
|
||
|
import org.jetbrains.compose.splitpane.HorizontalSplitPane
|
||
|
import org.jetbrains.compose.splitpane.VerticalSplitPane
|
||
|
import org.jetbrains.compose.splitpane.rememberSplitPaneState
|
||
|
import java.awt.Cursor
|
||
|
|
||
|
private fun Modifier.cursorForHorizontalResize(
|
||
|
): Modifier = composed {
|
||
|
var isHover by remember { mutableStateOf(false) }
|
||
|
|
||
|
if (isHover) {
|
||
|
LocalAppWindow.current.window.cursor = Cursor(Cursor.E_RESIZE_CURSOR)
|
||
|
} else {
|
||
|
LocalAppWindow.current.window.cursor = Cursor.getDefaultCursor()
|
||
|
}
|
||
|
|
||
|
pointerMoveFilter(
|
||
|
onEnter = { isHover = true; true },
|
||
|
onExit = { isHover = false; true }
|
||
|
)
|
||
|
}
|
||
|
|
||
|
fun main() = Window(
|
||
|
"SplitPane demo"
|
||
|
) {
|
||
|
MaterialTheme {
|
||
|
DesktopTheme {
|
||
|
val splitterState = rememberSplitPaneState()
|
||
|
val hSplitterState = rememberSplitPaneState()
|
||
|
HorizontalSplitPane(
|
||
|
splitPaneState = splitterState
|
||
|
) {
|
||
|
first(20.dp) {
|
||
|
Box(Modifier.background(Color.Red).fillMaxSize())
|
||
|
}
|
||
|
second(50.dp) {
|
||
|
VerticalSplitPane(splitPaneState = hSplitterState) {
|
||
|
first(50.dp) {
|
||
|
Box(Modifier.background(Color.Blue).fillMaxSize())
|
||
|
}
|
||
|
second(20.dp) {
|
||
|
Box(Modifier.background(Color.Green).fillMaxSize())
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
splitter {
|
||
|
visiblePart {
|
||
|
Box(
|
||
|
Modifier
|
||
|
.width(1.dp)
|
||
|
.fillMaxHeight()
|
||
|
.background(MaterialTheme.colors.background)
|
||
|
)
|
||
|
}
|
||
|
handle {
|
||
|
{
|
||
|
Box(
|
||
|
Modifier
|
||
|
.markAsHandle()
|
||
|
.cursorForHorizontalResize()
|
||
|
.background(SolidColor(Color.Gray), alpha = 0.50f)
|
||
|
.width(8.dp)
|
||
|
.fillMaxHeight()
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|