diff --git a/filekit-dialogs/src/jvmMain/kotlin/io/github/vinceglb/filekit/dialogs/platform/windows/WindowsFilePicker.kt b/filekit-dialogs/src/jvmMain/kotlin/io/github/vinceglb/filekit/dialogs/platform/windows/WindowsFilePicker.kt index 71306f61..9d62b31f 100644 --- a/filekit-dialogs/src/jvmMain/kotlin/io/github/vinceglb/filekit/dialogs/platform/windows/WindowsFilePicker.kt +++ b/filekit-dialogs/src/jvmMain/kotlin/io/github/vinceglb/filekit/dialogs/platform/windows/WindowsFilePicker.kt @@ -27,6 +27,7 @@ import io.github.vinceglb.filekit.dialogs.platform.windows.jna.IFileSaveDialog import io.github.vinceglb.filekit.dialogs.platform.windows.jna.IShellItem import io.github.vinceglb.filekit.dialogs.platform.windows.jna.ShTypes.COMDLG_FILTERSPEC import io.github.vinceglb.filekit.dialogs.platform.windows.jna.ShTypes.FILEOPENDIALOGOPTIONS.Companion.FOS_ALLOWMULTISELECT +import io.github.vinceglb.filekit.dialogs.platform.windows.jna.ShTypes.FILEOPENDIALOGOPTIONS.Companion.FOS_FORCEFILESYSTEM import io.github.vinceglb.filekit.dialogs.platform.windows.jna.ShTypes.FILEOPENDIALOGOPTIONS.Companion.FOS_PICKFOLDERS import io.github.vinceglb.filekit.dialogs.platform.windows.jna.ShTypes.SIGDN.Companion.SIGDN_DESKTOPABSOLUTEPARSING import io.github.vinceglb.filekit.dialogs.platform.windows.jna.ShTypes.SIGDN.Companion.SIGDN_FILESYSPATH @@ -170,6 +171,8 @@ internal class WindowsFilePicker : PlatformFilePicker { ).verify("CoCreateInstance failed") .let { type.build(pbrFileDialog) } + fileDialog.updateOptions(::requiredFileDialogOptions) + // Run the block block(fileDialog) } finally { @@ -263,12 +266,16 @@ internal class WindowsFilePicker : PlatformFilePicker { } private fun FileDialog.setFlag(flag: Int) { + updateOptions { options -> options or flag } + } + + private fun FileDialog.updateOptions(transform: (Int) -> Int) { // Get the dialog options val ref = IntByReference() this.GetOptions(ref).verify("GetOptions failed") // Set the dialog options - this.SetOptions(ref.value or flag).verify("SetOptions failed") + this.SetOptions(transform(ref.value)).verify("SetOptions failed") } private fun FD.show( @@ -398,3 +405,5 @@ internal class WindowsFilePicker : PlatformFilePicker { } } } + +internal fun requiredFileDialogOptions(options: Int): Int = options or FOS_FORCEFILESYSTEM diff --git a/filekit-dialogs/src/jvmTest/kotlin/io/github/vinceglb/filekit/dialogs/platform/windows/WindowsFilePickerOptionsTest.kt b/filekit-dialogs/src/jvmTest/kotlin/io/github/vinceglb/filekit/dialogs/platform/windows/WindowsFilePickerOptionsTest.kt new file mode 100644 index 00000000..ec0ce3a1 --- /dev/null +++ b/filekit-dialogs/src/jvmTest/kotlin/io/github/vinceglb/filekit/dialogs/platform/windows/WindowsFilePickerOptionsTest.kt @@ -0,0 +1,18 @@ +@file:Suppress("ktlint:standard:function-naming", "TestFunctionName") + +package io.github.vinceglb.filekit.dialogs.platform.windows + +import io.github.vinceglb.filekit.dialogs.platform.windows.jna.ShTypes.FILEOPENDIALOGOPTIONS.Companion.FOS_ALLOWMULTISELECT +import io.github.vinceglb.filekit.dialogs.platform.windows.jna.ShTypes.FILEOPENDIALOGOPTIONS.Companion.FOS_FORCEFILESYSTEM +import kotlin.test.Test +import kotlin.test.assertEquals + +class WindowsFilePickerOptionsTest { + @Test + fun requiredFileDialogOptions_whenOptionsAlreadyExist_preservesOptionsAndForcesFilesystemResults() { + assertEquals( + expected = FOS_ALLOWMULTISELECT or FOS_FORCEFILESYSTEM, + actual = requiredFileDialogOptions(FOS_ALLOWMULTISELECT), + ) + } +}