mirror of
https://github.com/amir1376/ab-download-manager.git
synced 2025-02-20 11:43:24 +08:00
improve directory picker
This commit is contained in:
parent
4ed44eb2bb
commit
5ef003c5e2
@ -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"))
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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" }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user