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.composeFilePicker) {
exclude("org.jetbrains.compose.material")
}
implementation(libs.compose.reorderable)
implementation(libs.http4k.core)
@ -47,7 +44,18 @@ dependencies {
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:monitor"))

View File

@ -20,7 +20,10 @@ import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalDensity
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
fun LocationTextField(
@ -30,18 +33,22 @@ fun LocationTextField(
errorText: String? = null,
lastUsedLocations: List<String> = emptyList(),
) {
var showFolderDialog by remember { mutableStateOf(false) }
var showLastUsedLocations by remember { mutableStateOf(false) }
DirectoryPicker(
showFolderDialog,
initialDirectory = text,
onFileSelected = {
showFolderDialog = false
it?.let {
setText(it)
}
}
)
val downloadLauncherFolderPickerLauncher = rememberDirectoryPickerLauncher(
title = "Download Location",
initialDirectory = remember(text) {
runCatching {
File(text).canonicalPath
}.getOrNull()
},
platformSettings = FileKitPlatformSettings(
parentWindow = LocalWindow.current
)
) { directory ->
directory?.path?.let(setText)
}
var widthForDropDown by remember {
mutableStateOf(0.dp)
}
@ -62,7 +69,7 @@ fun LocationTextField(
end = {
Row {
MyTextFieldIcon(MyIcons.folder) {
showFolderDialog = true
downloadLauncherFolderPickerLauncher.launch()
}
MyTextFieldIcon(MyIcons.down) {
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.pointerHoverIcon
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
fun RenderFolderConfig(cfg: FolderConfigurable, modifier: Modifier) {
val value by cfg.stateFlow.collectAsState()
val setValue = cfg::set
var showFolderPicker by remember(cfg) {
mutableStateOf(false)
}
DirectoryPicker(
show = showFolderPicker,
initialDirectory = value,
onFileSelected = { newValue ->
if (newValue != null) {
setValue(newValue)
}
showFolderPicker = false
val pickFolderLauncher = rememberDirectoryPickerLauncher(
title = cfg.title,
initialDirectory = remember(value) {
runCatching {
File(value).canonicalPath
}.getOrNull()
},
)
platformSettings = FileKitPlatformSettings(
parentWindow = LocalWindow.current
)
) { directory ->
directory?.path?.let(setValue)
}
ConfigTemplate(
modifier = modifier,
title = {
@ -53,7 +59,7 @@ fun RenderFolderConfig(cfg: FolderConfigurable, modifier: Modifier) {
modifier = Modifier
.pointerHoverIcon(PointerIcon.Default)
.fillMaxHeight()
.clickable { showFolderPicker=true }
.clickable { pickFolderLauncher.launch() }
.wrapContentHeight()
.padding(horizontal = 8.dp)
.size(16.dp))

View File

@ -18,6 +18,7 @@ http4k = "5.14.1.0"
arrow = "1.2.4"
datastore = "1.1.1"
aboutLibraries = "11.2.0"
jna = "5.14.0"
[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-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-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-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" }
pluginComposeCopmiler = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" }
pluginKotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }