improve directory picker

This commit is contained in:
AmirHossein Abdolmotallebi 2024-08-30 18:48:08 +03:30
parent 4ed44eb2bb
commit 5ef003c5e2
4 changed files with 57 additions and 32 deletions

View File

@ -31,9 +31,6 @@ dependencies {
implementation(libs.kotlin.datetime) implementation(libs.kotlin.datetime)
implementation(libs.composeFilePicker) {
exclude("org.jetbrains.compose.material")
}
implementation(libs.compose.reorderable) implementation(libs.compose.reorderable)
implementation(libs.http4k.core) implementation(libs.http4k.core)
@ -47,7 +44,18 @@ dependencies {
implementation(libs.aboutLibraries.core) implementation(libs.aboutLibraries.core)
implementation(libs.osThemeDetector) implementation(libs.composeFileKit) {
exclude(group = "net.java.dev.jna")
}
implementation(libs.osThemeDetector) {
exclude(group = "net.java.dev.jna")
}
// at the moment I don't use jna but some libraries does
// filekit and osThemeDetector both use jna but with different versions
// I excluded jna from both of them and add it here!
implementation(libs.jna.core)
implementation(libs.jna.platform)
implementation(project(":downloader:core")) implementation(project(":downloader:core"))
implementation(project(":downloader:monitor")) implementation(project(":downloader:monitor"))

View File

@ -20,7 +20,10 @@ import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.darkrockstudios.libraries.mpfilepicker.DirectoryPicker import io.github.vinceglb.filekit.compose.rememberDirectoryPickerLauncher
import io.github.vinceglb.filekit.core.FileKitPlatformSettings
import ir.amirab.util.desktop.LocalWindow
import java.io.File
@Composable @Composable
fun LocationTextField( fun LocationTextField(
@ -30,18 +33,22 @@ fun LocationTextField(
errorText: String? = null, errorText: String? = null,
lastUsedLocations: List<String> = emptyList(), lastUsedLocations: List<String> = emptyList(),
) { ) {
var showFolderDialog by remember { mutableStateOf(false) }
var showLastUsedLocations by remember { mutableStateOf(false) } var showLastUsedLocations by remember { mutableStateOf(false) }
DirectoryPicker(
showFolderDialog, val downloadLauncherFolderPickerLauncher = rememberDirectoryPickerLauncher(
initialDirectory = text, title = "Download Location",
onFileSelected = { initialDirectory = remember(text) {
showFolderDialog = false runCatching {
it?.let { File(text).canonicalPath
setText(it) }.getOrNull()
} },
} platformSettings = FileKitPlatformSettings(
) parentWindow = LocalWindow.current
)
) { directory ->
directory?.path?.let(setText)
}
var widthForDropDown by remember { var widthForDropDown by remember {
mutableStateOf(0.dp) mutableStateOf(0.dp)
} }
@ -62,7 +69,7 @@ fun LocationTextField(
end = { end = {
Row { Row {
MyTextFieldIcon(MyIcons.folder) { MyTextFieldIcon(MyIcons.folder) {
showFolderDialog = true downloadLauncherFolderPickerLauncher.launch()
} }
MyTextFieldIcon(MyIcons.down) { MyTextFieldIcon(MyIcons.down) {
showLastUsedLocations = !showLastUsedLocations showLastUsedLocations = !showLastUsedLocations

View File

@ -12,25 +12,31 @@ import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.input.pointer.PointerIcon import androidx.compose.ui.input.pointer.PointerIcon
import androidx.compose.ui.input.pointer.pointerHoverIcon import androidx.compose.ui.input.pointer.pointerHoverIcon
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.darkrockstudios.libraries.mpfilepicker.DirectoryPicker import io.github.vinceglb.filekit.compose.rememberDirectoryPickerLauncher
import io.github.vinceglb.filekit.core.FileKitPlatformSettings
import ir.amirab.util.desktop.LocalWindow
import java.io.File
@Composable @Composable
fun RenderFolderConfig(cfg: FolderConfigurable, modifier: Modifier) { fun RenderFolderConfig(cfg: FolderConfigurable, modifier: Modifier) {
val value by cfg.stateFlow.collectAsState() val value by cfg.stateFlow.collectAsState()
val setValue = cfg::set val setValue = cfg::set
var showFolderPicker by remember(cfg) {
mutableStateOf(false) val pickFolderLauncher = rememberDirectoryPickerLauncher(
} title = cfg.title,
DirectoryPicker( initialDirectory = remember(value) {
show = showFolderPicker, runCatching {
initialDirectory = value, File(value).canonicalPath
onFileSelected = { newValue -> }.getOrNull()
if (newValue != null) {
setValue(newValue)
}
showFolderPicker = false
}, },
) platformSettings = FileKitPlatformSettings(
parentWindow = LocalWindow.current
)
) { directory ->
directory?.path?.let(setValue)
}
ConfigTemplate( ConfigTemplate(
modifier = modifier, modifier = modifier,
title = { title = {
@ -53,7 +59,7 @@ fun RenderFolderConfig(cfg: FolderConfigurable, modifier: Modifier) {
modifier = Modifier modifier = Modifier
.pointerHoverIcon(PointerIcon.Default) .pointerHoverIcon(PointerIcon.Default)
.fillMaxHeight() .fillMaxHeight()
.clickable { showFolderPicker=true } .clickable { pickFolderLauncher.launch() }
.wrapContentHeight() .wrapContentHeight()
.padding(horizontal = 8.dp) .padding(horizontal = 8.dp)
.size(16.dp)) .size(16.dp))

View File

@ -18,6 +18,7 @@ http4k = "5.14.1.0"
arrow = "1.2.4" arrow = "1.2.4"
datastore = "1.1.1" datastore = "1.1.1"
aboutLibraries = "11.2.0" aboutLibraries = "11.2.0"
jna = "5.14.0"
[libraries] [libraries]
@ -57,7 +58,7 @@ kotlin-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines
kotlin-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" } kotlin-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" }
kotlin-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.1" kotlin-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.4.1"
composeFilePicker = "com.darkrockstudios:mpfilepicker:3.1.0" composeFileKit = "io.github.vinceglb:filekit-compose:0.8.2"
ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktorVersion" } ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktorVersion" }
ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktorVersion" } ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktorVersion" }
@ -91,6 +92,9 @@ jgit = "org.eclipse.jgit:org.eclipse.jgit:6.9.0.202403050737-r"
aboutLibraries-core = { module = "com.mikepenz:aboutlibraries-core", version.ref = "aboutLibraries" } aboutLibraries-core = { module = "com.mikepenz:aboutlibraries-core", version.ref = "aboutLibraries" }
aboutLibraries-compose = { module = "com.mikepenz:aboutlibraries-compose", version.ref = "aboutLibraries" } aboutLibraries-compose = { module = "com.mikepenz:aboutlibraries-compose", version.ref = "aboutLibraries" }
jna-core = { module = "net.java.dev.jna:jna", version.ref = "jna" }
jna-platform = { module = "net.java.dev.jna:jna-platform", version.ref = "jna" }
pluginComposeMultiplatform = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "compose" } pluginComposeMultiplatform = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "compose" }
pluginComposeCopmiler = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } pluginComposeCopmiler = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" }
pluginKotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } pluginKotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }