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