Igor Demin
3 years ago
6 changed files with 118 additions and 74 deletions
@ -1,73 +0,0 @@
|
||||
package org.jetbrains.compose.splitpane.demo |
||||
|
||||
import androidx.compose.desktop.DesktopTheme |
||||
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.ui.ExperimentalComposeUiApi |
||||
import androidx.compose.ui.Modifier |
||||
import androidx.compose.ui.graphics.Color |
||||
import androidx.compose.ui.graphics.SolidColor |
||||
import androidx.compose.ui.input.pointer.PointerIcon |
||||
import androidx.compose.ui.input.pointer.pointerHoverIcon |
||||
import androidx.compose.ui.unit.dp |
||||
import androidx.compose.ui.window.singleWindowApplication |
||||
import org.jetbrains.compose.splitpane.ExperimentalSplitPaneApi |
||||
import org.jetbrains.compose.splitpane.HorizontalSplitPane |
||||
import org.jetbrains.compose.splitpane.VerticalSplitPane |
||||
import org.jetbrains.compose.splitpane.rememberSplitPaneState |
||||
import java.awt.Cursor |
||||
|
||||
@OptIn(ExperimentalComposeUiApi::class) |
||||
private fun Modifier.cursorForHorizontalResize(): Modifier = |
||||
pointerHoverIcon(PointerIcon(Cursor(Cursor.E_RESIZE_CURSOR))) |
||||
|
||||
@OptIn(ExperimentalSplitPaneApi::class) |
||||
fun main() = singleWindowApplication( |
||||
title = "SplitPane demo" |
||||
) { |
||||
MaterialTheme { |
||||
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(9.dp) |
||||
.fillMaxHeight() |
||||
) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,29 @@
|
||||
import org.jetbrains.compose.compose |
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile |
||||
|
||||
plugins { |
||||
kotlin("multiplatform") |
||||
id("org.jetbrains.compose") |
||||
} |
||||
|
||||
kotlin { |
||||
jvm {} |
||||
sourceSets { |
||||
named("jvmMain") { |
||||
dependencies { |
||||
implementation(compose.desktop.currentOs) |
||||
implementation(project(":nativedialogs:library")) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
compose.desktop { |
||||
application { |
||||
mainClass = "org.jetbrains.compose.nativedialogs.demo.MainKt" |
||||
} |
||||
} |
||||
|
||||
tasks.withType<KotlinCompile>().configureEach { |
||||
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" |
||||
} |
@ -0,0 +1,31 @@
|
||||
package org.jetbrains.compose.nativedialogs.demo |
||||
|
||||
import androidx.compose.foundation.layout.Column |
||||
import androidx.compose.material.Button |
||||
import androidx.compose.material.Text |
||||
import androidx.compose.runtime.getValue |
||||
import androidx.compose.runtime.setValue |
||||
import androidx.compose.runtime.mutableStateOf |
||||
import androidx.compose.runtime.remember |
||||
import androidx.compose.ui.window.singleWindowApplication |
||||
import org.jetbrains.compose.nativedialogs.pickFolder |
||||
|
||||
fun main() { |
||||
singleWindowApplication( |
||||
title = "Native Dialogs demo" |
||||
) { |
||||
var openedFile by remember { mutableStateOf("") } |
||||
|
||||
Column { |
||||
Text(openedFile) |
||||
|
||||
Button(onClick = { |
||||
pickFolder(System.getProperty("user.home"))?.also { |
||||
openedFile = it |
||||
} |
||||
}) { |
||||
Text("File") |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,43 @@
|
||||
import org.jetbrains.compose.compose |
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile |
||||
|
||||
plugins { |
||||
kotlin("multiplatform") |
||||
id("org.jetbrains.compose") |
||||
id("maven-publish") |
||||
} |
||||
|
||||
val osName: String = System.getProperty("os.name") |
||||
val os = when { |
||||
osName == "Mac OS X" -> "macos" |
||||
osName == "Linux" -> "linux" |
||||
osName.startsWith("Win") -> "windows" |
||||
else -> throw Error("Unknown OS $osName") |
||||
} |
||||
|
||||
kotlin { |
||||
jvm("desktop") |
||||
|
||||
sourceSets { |
||||
named("desktopMain") { |
||||
dependencies { |
||||
implementation(compose.runtime) |
||||
implementation("org.lwjgl:lwjgl:3.2.3") |
||||
implementation("org.lwjgl:lwjgl-nfd:3.2.3") |
||||
implementation("org.lwjgl:lwjgl:3.2.3:natives-$os") // TODO make a separate publication |
||||
implementation("org.lwjgl:lwjgl-nfd:3.2.3:natives-$os") // TODO make a separate publication |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// TODO it seems that argument isn't applied to the common sourceSet. Figure out why |
||||
tasks.withType<KotlinCompile>().configureEach { |
||||
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" |
||||
} |
||||
|
||||
configureMavenPublication( |
||||
groupId = "org.jetbrains.compose.components", |
||||
artifactId = "components-nativedialogs", |
||||
name = "Native Dialogs for Compose JB" |
||||
) |
@ -0,0 +1,12 @@
|
||||
package org.jetbrains.compose.nativedialogs |
||||
|
||||
import org.lwjgl.PointerBuffer |
||||
import org.lwjgl.system.MemoryUtil |
||||
import org.lwjgl.util.nfd.NativeFileDialog |
||||
|
||||
fun pickFolder(path: String): String? { |
||||
val buf = PointerBuffer.allocateDirect(100) |
||||
NativeFileDialog.NFD_PickFolder(path, buf) |
||||
val mem = buf.get() |
||||
return if (mem != MemoryUtil.NULL) MemoryUtil.memUTF8(mem) else null |
||||
} |
Loading…
Reference in new issue